grix-connector 4.14.0 → 4.14.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,9 +1,9 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "bridgeVersion": "4.14.0",
4
- "tarball": "grix-dsh-bridge-4.14.0.tgz",
5
- "size": 24182,
3
+ "bridgeVersion": "4.14.1",
4
+ "tarball": "grix-dsh-bridge-4.14.1.tgz",
5
+ "size": 24155,
6
6
  "unpackedSize": 96521,
7
- "shasum": "6bdd548230d6242c551803ff23363fea36879c4b",
8
- "integrity": "sha512-wJA5oLVBnLXetFfXEC1OzfTSWRRhdtopRpPMCldkfLpTXPp+d/rFW7svL9j3OWeTw9wzkHZc/slWtD+ARjH9uw=="
7
+ "shasum": "0978ca4383c3442fc3191b18fb38b31ef0dfab94",
8
+ "integrity": "sha512-l889rKJNE1oO8mxswipjksVd4WgX7xTvNuIVckuzsuSHoq386Nq6nxdORate+fLO/ZmFMpFDhGidW/8BCN1KHQ=="
9
9
  }
@@ -1 +1 @@
1
- import{ClaudeAdapter as A}from"../adapter/claude/index.js";import{getCachedModels as x}from"../adapter/claude/model-list.js";import{SESSION_CONTROL_ERROR_CODES as L,SESSION_MODE_IDS as _}from"../adapter/claude/protocol-contract.js";import{CursorAdapter as R,CURSOR_MODE_OPTIONS as I}from"../adapter/cursor/index.js";import{getCachedAgyModels as v,resolveAgyToolbarModelId as b}from"../adapter/agy/model-list.js";import{getCachedAgyQuotaInfo as S,refreshAgyQuotaInfo as M}from"../adapter/agy/quota.js";import{normalizeClaudeEffort as Q,CLAUDE_EFFORT_LEVELS as T}from"../core/config/claude-direct-env.js";import{resolveToolbarSelection as m}from"./toolbar-selection.js";import{log as y}from"../core/log/index.js";const z=["isRateLimitsCacheFresh","isGrixRelayActive","getFreshClaudeRateLimitState","maybeQueryProviderQuota","providerQuotaToRateLimits","normalizeClaudeModeId","resolveSessionModelId","resolveCursorSessionModeId","resolveClaudeSessionEffort","resolveClaudeSessionModeId","currentClaudeModeId","buildAgyToolbarMeta","buildAgyQuotaMeta","sendAgyBindingCard"],k=["name","config","aibotHandle","pool","bindingStore","globalConfigStore","providerResolver","cachedClaudeRateLimitState","cachedProviderQuota","cachedProviderQuotaSampledAtMs"];function U(e,i){return String(i??"").trim().toLowerCase()===_.approval?_.approval:_.fullAuto}function $(e,i,o,a){const r=Array.isArray(a?.options)?a.options:[];if(r.length===0)return;const l=e.bindingStore.get(i)?.cwd??"",c={};if(o==="model"){c.available_models=r.map(d=>({id:d.id,displayName:d.label}));const s=r.find(d=>d.current);s&&(c.model_id=s.id)}else if(o==="mode"){c.available_modes=r.map(d=>({id:d.id,displayName:d.label}));const s=r.find(d=>d.current);s&&(c.mode_id=s.id)}else c[`${o}_options`]=r;e.aibotHandle.sendUpdateBindingCard({session_id:i,worker_status:"ready",cwd:l,meta:c})}function C(e){return e.config.adapterType??"acp"}function G(e,i){return m(e,C(e),i,"model")}function J(e,i){return m(e,C(e),i,"mode")}function q(e,i){return m(e,"cursor",i,"mode")}function V(e,i){return m(e,"claude",i,"effort")}function W(e,i){return m(e,"claude",i,"mode")}function j(e,i){return e.normalizeClaudeModeId(e.resolveClaudeSessionModeId(i))}function K(e,i){const o=e.pool.getSlot(i);if(o?.adapter instanceof R)return o.adapter.getToolbarMeta(i);const a=e.bindingStore.getModelId(i)??"auto",r=e.resolveCursorSessionModeId(i)??"full_auto";return{model_id:a,mode_id:r,currentModelId:a,currentModeId:r,available_models:[],available_modes:I.map(n=>({...n}))}}function X(e,i,o){if(!e.bindingStore.get(i))return;const r=v(e.config.agent.command),n=r.length>0?r[0].id:"";let l=b(e.resolveSessionModelId(i)||"",r)||n;r.length>0&&!r.some(s=>s.id===l)&&(l=n);const c=o??S(e.config.agent.command);return{model_id:l,currentModelId:l,available_models:r.map(s=>({id:s.id,displayName:s.displayName})),...e.buildAgyQuotaMeta(c)}}function Y(e,i){const o={rate_limits:null,extra_limits:null};return i.rateLimits&&(o.rate_limits={primary:i.rateLimits.primary,secondary:i.rateLimits.secondary,sampledAt:i.sampledAt??Date.now()},i.rateLimits.extras&&i.rateLimits.extras.length>0&&(o.extra_limits=i.rateLimits.extras)),{...o,...i.plan!==void 0&&{plan:i.plan},...i.quota_exhausted!==void 0&&{quota_exhausted:i.quota_exhausted},...i.quota_reset_at!==void 0&&{quota_reset_at:i.quota_reset_at},...i.available_credits!==void 0&&{available_credits:i.available_credits}}}function Z(e,i,o,a){const r=a??e.buildAgyToolbarMeta(i);return e.aibotHandle.sendUpdateBindingCard({session_id:i,worker_status:"ready",cwd:o,...r?{meta:r}:{}}),r}async function h(e,i,o=!1){const a=await M(e.config.agent.command,o),r=e.bindingStore.get(i);return r?.cwd&&e.sendAgyBindingCard(i,r.cwd,e.buildAgyToolbarMeta(i,a)),a}async function ee(e,i,o){const a=i.params??{},r=v(e.config.agent.command),n=b(String(a.model_id??a.modelId??""),r);if(!o){e.aibotHandle.sendLocalActionResult({action_id:i.action_id,status:"failed",error_code:"session_id_required",error_msg:"session_id is required for set_model"});return}if(!n){e.aibotHandle.sendLocalActionResult({action_id:i.action_id,status:"failed",error_code:"set_model_invalid",error_msg:"model_id is required"});return}const l=e.bindingStore.get(o);if(!l?.cwd){e.aibotHandle.sendLocalActionResult({action_id:i.action_id,status:"failed",error_code:L.bindingMissing,error_msg:"session binding was not found"});return}l.modelId!==n&&(e.bindingStore.setModelId(o,n),e.globalConfigStore?.set(e.name,{modelId:n}));const c=await M(e.config.agent.command,!0).catch(()=>S(e.config.agent.command));e.sendAgyBindingCard(o,l.cwd,e.buildAgyToolbarMeta(o,c)),e.aibotHandle.sendLocalActionResult({action_id:i.action_id,status:"ok",result:{outcome:"model_set",model_id:n,binding:{cwd:l.cwd,model_id:n}}})}function ie(e,i){if(!e.bindingStore.get(i))return;const a=x(),r=a.length>0?a[0].id:"";let n=e.resolveSessionModelId(i)||r;a.length>0&&!a.some(t=>t.id===n)&&(n=r);const l=e.currentClaudeModeId(i);let c;try{const t=e.providerResolver?e.providerResolver():e.config.agent.provider;c=Q(t?.effort)}catch{}const s=e.resolveClaudeSessionEffort(i)??c??"auto",d={model_id:n,mode_id:l,currentModelId:n,currentModeId:l,available_efforts:[...T],effort:s,reasoning_effort:s,available_models:a.map(t=>({id:t.id,displayName:t.displayName}))},p=e.pool.getSlot(i),u=p?.adapter instanceof A?p.adapter.getSessionState():null;(u?.rateLimits?.fiveHour||u?.rateLimits?.sevenDay)&&(e.cachedClaudeRateLimitState=u);const f=e.isGrixRelayActive(),g=f?null:u??e.getFreshClaudeRateLimitState();if(g){const t=g.rateLimits;t&&(t.fiveHour||t.sevenDay)&&(d.rate_limits={...t.fiveHour?{fiveHour:t.fiveHour}:{},...t.sevenDay?{sevenDay:t.sevenDay}:{},sampledAt:g.sampledAt||Date.now()})}if(f){d.rate_limits=null;const t=e.cachedProviderQuota?.success&&e.cachedProviderQuota.provider==="grix"?e.cachedProviderQuota:null;d.provider_quota=t,(!t||!e.isRateLimitsCacheFresh(e.cachedProviderQuotaSampledAtMs))&&e.maybeQueryProviderQuota().catch(()=>{})}else d.provider_quota=null;if(u){const t=u.contextWindow;t.usedPercentage!=null&&(d.context_window={usedPercentage:t.usedPercentage,remainingPercentage:t.remainingPercentage})}if(!f&&!d.rate_limits&&e.cachedProviderQuota?.success&&e.cachedProviderQuota.provider!=="grix"){e.isRateLimitsCacheFresh(e.cachedProviderQuotaSampledAtMs)||e.maybeQueryProviderQuota().catch(()=>{});const t=e.providerQuotaToRateLimits(e.cachedProviderQuota);t&&(d.rate_limits=t),y.info(e.name,`[toolbar-meta] provider quota fallback: hasCached=${!!e.cachedProviderQuota} fromProvider=${JSON.stringify(t)}`)}return d.rate_limits&&y.info(e.name,`[toolbar-meta] rate_limits included: ${JSON.stringify(d.rate_limits)}`),d}export{k as TOOLBAR_META_HOST_FIELDS,z as TOOLBAR_META_HOST_METHODS,Y as buildAgyQuotaMeta,X as buildAgyToolbarMeta,ie as buildClaudeToolbarMeta,K as buildCursorToolbarMeta,j as currentClaudeModeId,ee as handleAgySetModel,$ as handleExecCommandOptions,U as normalizeClaudeModeId,h as refreshAndPushAgyQuota,V as resolveClaudeSessionEffort,W as resolveClaudeSessionModeId,q as resolveCursorSessionModeId,J as resolveSessionModeId,G as resolveSessionModelId,Z as sendAgyBindingCard};
1
+ import{ClaudeAdapter as x}from"../adapter/claude/index.js";import{getCachedModels as L}from"../adapter/claude/model-list.js";import{SESSION_CONTROL_ERROR_CODES as R,SESSION_MODE_IDS as _}from"../adapter/claude/protocol-contract.js";import{CursorAdapter as I,CURSOR_MODE_OPTIONS as Q}from"../adapter/cursor/index.js";import{getCachedAgyModels as b,resolveAgyToolbarModelId as p}from"../adapter/agy/model-list.js";import{getCachedAgyQuotaInfo as S,refreshAgyQuotaInfo as y}from"../adapter/agy/quota.js";import{normalizeClaudeEffort as T,CLAUDE_EFFORT_LEVELS as w}from"../core/config/claude-direct-env.js";import{resolveToolbarSelection as m}from"./toolbar-selection.js";import{log as M}from"../core/log/index.js";const k=["isRateLimitsCacheFresh","isGrixRelayActive","getFreshClaudeRateLimitState","maybeQueryProviderQuota","providerQuotaToRateLimits","normalizeClaudeModeId","resolveSessionModelId","resolveCursorSessionModeId","resolveClaudeSessionEffort","resolveClaudeSessionModeId","currentClaudeModeId","buildAgyToolbarMeta","buildAgyQuotaMeta","sendAgyBindingCard"],U=["name","config","aibotHandle","pool","bindingStore","globalConfigStore","providerResolver","cachedClaudeRateLimitState","cachedProviderQuota","cachedProviderQuotaSampledAtMs"];function $(e,i){return String(i??"").trim().toLowerCase()===_.approval?_.approval:_.fullAuto}function G(e,i,t,d){const r=Array.isArray(d?.options)?d.options:[];if(r.length===0)return;const l=e.bindingStore.get(i)?.cwd??"",u={};if(t==="model"){u.available_models=r.map(a=>({id:a.id,displayName:a.label}));const c=r.find(a=>a.current);c&&(u.model_id=c.id)}else if(t==="mode"){u.available_modes=r.map(a=>({id:a.id,displayName:a.label}));const c=r.find(a=>a.current);c&&(u.mode_id=c.id)}else u[`${t}_options`]=r;e.aibotHandle.sendUpdateBindingCard({session_id:i,worker_status:"ready",cwd:l,meta:u})}function A(e){return e.config.adapterType??"acp"}function J(e,i){return m(e,A(e),i,"model")}function q(e,i){return m(e,A(e),i,"mode")}function V(e,i){return m(e,"cursor",i,"mode")}function W(e,i){return m(e,"claude",i,"effort")}function j(e,i){return m(e,"claude",i,"mode")}function K(e,i){return e.normalizeClaudeModeId(e.resolveClaudeSessionModeId(i))}function X(e,i){const t=e.pool.getSlot(i);if(t?.adapter instanceof I)return t.adapter.getToolbarMeta(i);const d=e.bindingStore.getModelId(i)??"auto",r=e.resolveCursorSessionModeId(i)??"full_auto";return{model_id:d,mode_id:r,currentModelId:d,currentModeId:r,available_models:[],available_modes:Q.map(n=>({...n}))}}function C(e){return!e?.agyConversationId}function Y(e,i,t){const d=e.bindingStore.get(i);if(!d)return;const r=b(e.config.agent.command),n=r.length>0?r[0].id:"";let l=p(e.resolveSessionModelId(i)||"",r)||n;r.length>0&&!r.some(c=>c.id===l)&&(l=n);const u=t??S(e.config.agent.command);return{model_id:l,currentModelId:l,model_switchable:C(d),available_models:r.map(c=>({id:c.id,displayName:c.displayName})),...e.buildAgyQuotaMeta(u)}}function Z(e,i){const t={rate_limits:null,extra_limits:null};return i.rateLimits&&(t.rate_limits={primary:i.rateLimits.primary,secondary:i.rateLimits.secondary,sampledAt:i.sampledAt??Date.now()},i.rateLimits.extras&&i.rateLimits.extras.length>0&&(t.extra_limits=i.rateLimits.extras)),{...t,...i.plan!==void 0&&{plan:i.plan},...i.quota_exhausted!==void 0&&{quota_exhausted:i.quota_exhausted},...i.quota_reset_at!==void 0&&{quota_reset_at:i.quota_reset_at},...i.available_credits!==void 0&&{available_credits:i.available_credits}}}function h(e,i,t,d){const r=d??e.buildAgyToolbarMeta(i);return e.aibotHandle.sendUpdateBindingCard({session_id:i,worker_status:"ready",cwd:t,...r?{meta:r}:{}}),r}async function ee(e,i,t=!1){const d=await y(e.config.agent.command,t),r=e.bindingStore.get(i);return r?.cwd&&e.sendAgyBindingCard(i,r.cwd,e.buildAgyToolbarMeta(i,d)),d}async function ie(e,i,t){const d=i.params??{},r=b(e.config.agent.command),n=p(String(d.model_id??d.modelId??""),r);if(!t){e.aibotHandle.sendLocalActionResult({action_id:i.action_id,status:"failed",error_code:"session_id_required",error_msg:"session_id is required for set_model"});return}if(!n){e.aibotHandle.sendLocalActionResult({action_id:i.action_id,status:"failed",error_code:"set_model_invalid",error_msg:"model_id is required"});return}const l=e.bindingStore.get(t);if(!l?.cwd){e.aibotHandle.sendLocalActionResult({action_id:i.action_id,status:"failed",error_code:R.bindingMissing,error_msg:"session binding was not found"});return}if(!C(l)){const c=p(e.resolveSessionModelId(t)||l.modelId||"",r)||l.modelId||"";if(n!==c){e.aibotHandle.sendLocalActionResult({action_id:i.action_id,status:"failed",error_code:"set_model_locked",error_msg:"\u5F53\u524D\u4F1A\u8BDD\u5DF2\u5F00\u59CB\uFF0Cagy \u6A21\u578B\u4E0D\u53EF\u4E2D\u9014\u5207\u6362\uFF1B\u8BF7\u65B0\u5F00\u8BDD\u9898\u540E\u518D\u9009\u6A21\u578B"}),e.sendAgyBindingCard(t,l.cwd,e.buildAgyToolbarMeta(t));return}}l.modelId!==n&&(e.bindingStore.setModelId(t,n),e.globalConfigStore?.set(e.name,{modelId:n}));const u=await y(e.config.agent.command,!0).catch(()=>S(e.config.agent.command));e.sendAgyBindingCard(t,l.cwd,e.buildAgyToolbarMeta(t,u)),e.aibotHandle.sendLocalActionResult({action_id:i.action_id,status:"ok",result:{outcome:"model_set",model_id:n,binding:{cwd:l.cwd,model_id:n}}})}function re(e,i){if(!e.bindingStore.get(i))return;const d=L(),r=d.length>0?d[0].id:"";let n=e.resolveSessionModelId(i)||r;d.length>0&&!d.some(o=>o.id===n)&&(n=r);const l=e.currentClaudeModeId(i);let u;try{const o=e.providerResolver?e.providerResolver():e.config.agent.provider;u=T(o?.effort)}catch{}const c=e.resolveClaudeSessionEffort(i)??u??"auto",a={model_id:n,mode_id:l,currentModelId:n,currentModeId:l,available_efforts:[...w],effort:c,reasoning_effort:c,available_models:d.map(o=>({id:o.id,displayName:o.displayName}))},v=e.pool.getSlot(i),s=v?.adapter instanceof x?v.adapter.getSessionState():null;(s?.rateLimits?.fiveHour||s?.rateLimits?.sevenDay)&&(e.cachedClaudeRateLimitState=s);const f=e.isGrixRelayActive(),g=f?null:s??e.getFreshClaudeRateLimitState();if(g){const o=g.rateLimits;o&&(o.fiveHour||o.sevenDay)&&(a.rate_limits={...o.fiveHour?{fiveHour:o.fiveHour}:{},...o.sevenDay?{sevenDay:o.sevenDay}:{},sampledAt:g.sampledAt||Date.now()})}if(f){a.rate_limits=null;const o=e.cachedProviderQuota?.success&&e.cachedProviderQuota.provider==="grix"?e.cachedProviderQuota:null;a.provider_quota=o,(!o||!e.isRateLimitsCacheFresh(e.cachedProviderQuotaSampledAtMs))&&e.maybeQueryProviderQuota().catch(()=>{})}else a.provider_quota=null;if(s){const o=s.contextWindow;o.usedPercentage!=null&&(a.context_window={usedPercentage:o.usedPercentage,remainingPercentage:o.remainingPercentage})}if(!f&&!a.rate_limits&&e.cachedProviderQuota?.success&&e.cachedProviderQuota.provider!=="grix"){e.isRateLimitsCacheFresh(e.cachedProviderQuotaSampledAtMs)||e.maybeQueryProviderQuota().catch(()=>{});const o=e.providerQuotaToRateLimits(e.cachedProviderQuota);o&&(a.rate_limits=o),M.info(e.name,`[toolbar-meta] provider quota fallback: hasCached=${!!e.cachedProviderQuota} fromProvider=${JSON.stringify(o)}`)}return a.rate_limits&&M.info(e.name,`[toolbar-meta] rate_limits included: ${JSON.stringify(a.rate_limits)}`),a}export{U as TOOLBAR_META_HOST_FIELDS,k as TOOLBAR_META_HOST_METHODS,Z as buildAgyQuotaMeta,Y as buildAgyToolbarMeta,re as buildClaudeToolbarMeta,X as buildCursorToolbarMeta,K as currentClaudeModeId,ie as handleAgySetModel,G as handleExecCommandOptions,C as isAgyModelSwitchable,$ as normalizeClaudeModeId,ee as refreshAndPushAgyQuota,W as resolveClaudeSessionEffort,j as resolveClaudeSessionModeId,V as resolveCursorSessionModeId,q as resolveSessionModeId,J as resolveSessionModelId,h as sendAgyBindingCard};
@@ -1 +1 @@
1
- function a(e){const t=new Set([`http://127.0.0.1:${e.serverPort}`,`http://localhost:${e.serverPort}`,...e.allowedOrigins]),o=new Set([`127.0.0.1:${e.serverPort}`,`localhost:${e.serverPort}`,...e.allowedHosts]);return{validateRequest(s){const r=i(s,t);if(!r.ok)return r;const n=l(s,o);return n.ok?{ok:!0}:n}}}function i(e,t){const o=e.headers.origin;return o?t.has(o)?{ok:!0}:{ok:!1,statusCode:403,message:`Origin not allowed: ${o}`}:{ok:!0}}function l(e,t){const o=e.headers.host;return o?t.has(o)?{ok:!0}:{ok:!1,statusCode:403,message:`Host not allowed: ${o}`}:{ok:!1,statusCode:403,message:"Missing Host header"}}export{a as createSecurityPolicy};
1
+ function a(t){const o=new Set([`http://127.0.0.1:${t.serverPort}`,`http://localhost:${t.serverPort}`,...t.allowedOrigins]),e=new Set([`127.0.0.1:${t.serverPort}`,`localhost:${t.serverPort}`,...t.allowedHosts]);return{validateRequest(s){const r=i(s,o);if(!r.ok)return r;const n=l(s,e);return n.ok?{ok:!0}:n}}}function i(t,o){const e=t.headers.origin;return e?o.has(e)?{ok:!0}:{ok:!1,statusCode:403,message:`Origin not allowed: ${e}`}:{ok:!0}}function l(t,o){const e=t.headers.host;return e?o.has(e)?{ok:!0}:{ok:!1,statusCode:403,message:`Host not allowed: ${e}`}:{ok:!1,statusCode:403,message:"Missing Host header"}}export{a as createSecurityPolicy};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "grix-connector",
3
- "version": "4.14.0",
3
+ "version": "4.14.1",
4
4
  "description": "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.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",