agent-embassy 1.0.0
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/CHANGELOG.md +61 -0
- package/CONTRIBUTING.md +122 -0
- package/LICENSE +21 -0
- package/README.md +185 -0
- package/README.zh-CN.md +185 -0
- package/SECURITY.md +224 -0
- package/assets/live-dashboard/app.css +1610 -0
- package/assets/mark-seal.svg +7 -0
- package/assets/mark.svg +7 -0
- package/assets/social-preview.png +0 -0
- package/assets/vendor/react/LICENSE +21 -0
- package/assets/vendor/react/react-dom.production.min.js +267 -0
- package/assets/vendor/react/react.production.min.js +31 -0
- package/dist/src/errors.d.ts +5 -0
- package/dist/src/errors.js +11 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/gateway/claude-compatibility-scratch.d.ts +18 -0
- package/dist/src/gateway/claude-compatibility-scratch.js +158 -0
- package/dist/src/gateway/claude-compatibility-scratch.js.map +1 -0
- package/dist/src/gateway/claude-helper-client.d.ts +43 -0
- package/dist/src/gateway/claude-helper-client.js +212 -0
- package/dist/src/gateway/claude-helper-client.js.map +1 -0
- package/dist/src/gateway/claude-helper-protocol.d.ts +172 -0
- package/dist/src/gateway/claude-helper-protocol.js +373 -0
- package/dist/src/gateway/claude-helper-protocol.js.map +1 -0
- package/dist/src/gateway/claude-helper-supervisor.d.ts +74 -0
- package/dist/src/gateway/claude-helper-supervisor.js +497 -0
- package/dist/src/gateway/claude-helper-supervisor.js.map +1 -0
- package/dist/src/gateway/claude-helper.d.ts +1 -0
- package/dist/src/gateway/claude-helper.js +269 -0
- package/dist/src/gateway/claude-helper.js.map +1 -0
- package/dist/src/gateway/claude-peer.d.ts +273 -0
- package/dist/src/gateway/claude-peer.js +2359 -0
- package/dist/src/gateway/claude-peer.js.map +1 -0
- package/dist/src/gateway/claude-runtime.d.ts +40 -0
- package/dist/src/gateway/claude-runtime.js +302 -0
- package/dist/src/gateway/claude-runtime.js.map +1 -0
- package/dist/src/gateway/cli-copy.d.ts +8 -0
- package/dist/src/gateway/cli-copy.en.d.ts +13 -0
- package/dist/src/gateway/cli-copy.en.js +43 -0
- package/dist/src/gateway/cli-copy.en.js.map +1 -0
- package/dist/src/gateway/cli-copy.js +19 -0
- package/dist/src/gateway/cli-copy.js.map +1 -0
- package/dist/src/gateway/cli-copy.zh-CN.d.ts +13 -0
- package/dist/src/gateway/cli-copy.zh-CN.js +43 -0
- package/dist/src/gateway/cli-copy.zh-CN.js.map +1 -0
- package/dist/src/gateway/cli.d.ts +44 -0
- package/dist/src/gateway/cli.js +969 -0
- package/dist/src/gateway/cli.js.map +1 -0
- package/dist/src/gateway/codex-app-server.d.ts +310 -0
- package/dist/src/gateway/codex-app-server.js +1746 -0
- package/dist/src/gateway/codex-app-server.js.map +1 -0
- package/dist/src/gateway/codex-local-transport.d.ts +81 -0
- package/dist/src/gateway/codex-local-transport.js +617 -0
- package/dist/src/gateway/codex-local-transport.js.map +1 -0
- package/dist/src/gateway/codex-registration-generation.d.ts +5 -0
- package/dist/src/gateway/codex-registration-generation.js +19 -0
- package/dist/src/gateway/codex-registration-generation.js.map +1 -0
- package/dist/src/gateway/codex-registration-succession.d.ts +209 -0
- package/dist/src/gateway/codex-registration-succession.js +588 -0
- package/dist/src/gateway/codex-registration-succession.js.map +1 -0
- package/dist/src/gateway/compatibility.d.ts +70 -0
- package/dist/src/gateway/compatibility.js +252 -0
- package/dist/src/gateway/compatibility.js.map +1 -0
- package/dist/src/gateway/config.d.ts +24 -0
- package/dist/src/gateway/config.js +130 -0
- package/dist/src/gateway/config.js.map +1 -0
- package/dist/src/gateway/control.d.ts +308 -0
- package/dist/src/gateway/control.js +1573 -0
- package/dist/src/gateway/control.js.map +1 -0
- package/dist/src/gateway/dashboard-copy.d.ts +7 -0
- package/dist/src/gateway/dashboard-copy.en.d.ts +506 -0
- package/dist/src/gateway/dashboard-copy.en.js +507 -0
- package/dist/src/gateway/dashboard-copy.en.js.map +1 -0
- package/dist/src/gateway/dashboard-copy.js +516 -0
- package/dist/src/gateway/dashboard-copy.js.map +1 -0
- package/dist/src/gateway/dashboard-copy.zh-CN.d.ts +506 -0
- package/dist/src/gateway/dashboard-copy.zh-CN.js +507 -0
- package/dist/src/gateway/dashboard-copy.zh-CN.js.map +1 -0
- package/dist/src/gateway/dashboard-model.d.ts +207 -0
- package/dist/src/gateway/dashboard-model.js +720 -0
- package/dist/src/gateway/dashboard-model.js.map +1 -0
- package/dist/src/gateway/dashboard.d.ts +26 -0
- package/dist/src/gateway/dashboard.js +941 -0
- package/dist/src/gateway/dashboard.js.map +1 -0
- package/dist/src/gateway/delivery-machine.d.ts +235 -0
- package/dist/src/gateway/delivery-machine.js +540 -0
- package/dist/src/gateway/delivery-machine.js.map +1 -0
- package/dist/src/gateway/instance-lease.d.ts +21 -0
- package/dist/src/gateway/instance-lease.js +549 -0
- package/dist/src/gateway/instance-lease.js.map +1 -0
- package/dist/src/gateway/live-dashboard-app/app.js +2914 -0
- package/dist/src/gateway/live-dashboard-assets.d.ts +10 -0
- package/dist/src/gateway/live-dashboard-assets.js +73 -0
- package/dist/src/gateway/live-dashboard-assets.js.map +1 -0
- package/dist/src/gateway/live-dashboard-bootstrap.d.ts +36 -0
- package/dist/src/gateway/live-dashboard-bootstrap.js +176 -0
- package/dist/src/gateway/live-dashboard-bootstrap.js.map +1 -0
- package/dist/src/gateway/live-dashboard-command.d.ts +54 -0
- package/dist/src/gateway/live-dashboard-command.js +324 -0
- package/dist/src/gateway/live-dashboard-command.js.map +1 -0
- package/dist/src/gateway/live-dashboard-http.d.ts +41 -0
- package/dist/src/gateway/live-dashboard-http.js +445 -0
- package/dist/src/gateway/live-dashboard-http.js.map +1 -0
- package/dist/src/gateway/live-dashboard-protocol.d.ts +38 -0
- package/dist/src/gateway/live-dashboard-protocol.js +156 -0
- package/dist/src/gateway/live-dashboard-protocol.js.map +1 -0
- package/dist/src/gateway/live-dashboard-server.d.ts +33 -0
- package/dist/src/gateway/live-dashboard-server.js +130 -0
- package/dist/src/gateway/live-dashboard-server.js.map +1 -0
- package/dist/src/gateway/live-dashboard-stream.d.ts +46 -0
- package/dist/src/gateway/live-dashboard-stream.js +233 -0
- package/dist/src/gateway/live-dashboard-stream.js.map +1 -0
- package/dist/src/gateway/live-dashboard.d.ts +31 -0
- package/dist/src/gateway/live-dashboard.js +190 -0
- package/dist/src/gateway/live-dashboard.js.map +1 -0
- package/dist/src/gateway/locale.d.ts +4 -0
- package/dist/src/gateway/locale.js +10 -0
- package/dist/src/gateway/locale.js.map +1 -0
- package/dist/src/gateway/progress-watch-machine.d.ts +97 -0
- package/dist/src/gateway/progress-watch-machine.js +172 -0
- package/dist/src/gateway/progress-watch-machine.js.map +1 -0
- package/dist/src/gateway/providers.d.ts +287 -0
- package/dist/src/gateway/providers.js +2451 -0
- package/dist/src/gateway/providers.js.map +1 -0
- package/dist/src/gateway/server.d.ts +57 -0
- package/dist/src/gateway/server.js +264 -0
- package/dist/src/gateway/server.js.map +1 -0
- package/dist/src/gateway/service.d.ts +449 -0
- package/dist/src/gateway/service.js +4831 -0
- package/dist/src/gateway/service.js.map +1 -0
- package/dist/src/gateway/store.d.ts +340 -0
- package/dist/src/gateway/store.js +4047 -0
- package/dist/src/gateway/store.js.map +1 -0
- package/dist/src/gateway/types.d.ts +514 -0
- package/dist/src/gateway/types.js +414 -0
- package/dist/src/gateway/types.js.map +1 -0
- package/dist/src/mutex.d.ts +4 -0
- package/dist/src/mutex.js +23 -0
- package/dist/src/mutex.js.map +1 -0
- package/docs/DESIGN.md +134 -0
- package/docs/GATEWAY-ARCHITECTURE.md +858 -0
- package/package.json +80 -0
- package/skills/embassy-peer/SKILL.md +198 -0
- package/skills/embassy-peer/agents/openai.yaml +4 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license React
|
|
3
|
+
* react.production.min.js
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
6
|
+
*
|
|
7
|
+
* This source code is licensed under the MIT license found in the
|
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
|
9
|
+
*/
|
|
10
|
+
(function(){'use strict';(function(c,x){"object"===typeof exports&&"undefined"!==typeof module?x(exports):"function"===typeof define&&define.amd?define(["exports"],x):(c=c||self,x(c.React={}))})(this,function(c){function x(a){if(null===a||"object"!==typeof a)return null;a=V&&a[V]||a["@@iterator"];return"function"===typeof a?a:null}function w(a,b,e){this.props=a;this.context=b;this.refs=W;this.updater=e||X}function Y(){}function K(a,b,e){this.props=a;this.context=b;this.refs=W;this.updater=e||X}function Z(a,b,
|
|
11
|
+
e){var m,d={},c=null,h=null;if(null!=b)for(m in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(c=""+b.key),b)aa.call(b,m)&&!ba.hasOwnProperty(m)&&(d[m]=b[m]);var l=arguments.length-2;if(1===l)d.children=e;else if(1<l){for(var f=Array(l),k=0;k<l;k++)f[k]=arguments[k+2];d.children=f}if(a&&a.defaultProps)for(m in l=a.defaultProps,l)void 0===d[m]&&(d[m]=l[m]);return{$$typeof:y,type:a,key:c,ref:h,props:d,_owner:L.current}}function oa(a,b){return{$$typeof:y,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}
|
|
12
|
+
function M(a){return"object"===typeof a&&null!==a&&a.$$typeof===y}function pa(a){var b={"=":"=0",":":"=2"};return"$"+a.replace(/[=:]/g,function(a){return b[a]})}function N(a,b){return"object"===typeof a&&null!==a&&null!=a.key?pa(""+a.key):b.toString(36)}function B(a,b,e,m,d){var c=typeof a;if("undefined"===c||"boolean"===c)a=null;var h=!1;if(null===a)h=!0;else switch(c){case "string":case "number":h=!0;break;case "object":switch(a.$$typeof){case y:case qa:h=!0}}if(h)return h=a,d=d(h),a=""===m?"."+
|
|
13
|
+
N(h,0):m,ca(d)?(e="",null!=a&&(e=a.replace(da,"$&/")+"/"),B(d,b,e,"",function(a){return a})):null!=d&&(M(d)&&(d=oa(d,e+(!d.key||h&&h.key===d.key?"":(""+d.key).replace(da,"$&/")+"/")+a)),b.push(d)),1;h=0;m=""===m?".":m+":";if(ca(a))for(var l=0;l<a.length;l++){c=a[l];var f=m+N(c,l);h+=B(c,b,e,f,d)}else if(f=x(a),"function"===typeof f)for(a=f.call(a),l=0;!(c=a.next()).done;)c=c.value,f=m+N(c,l++),h+=B(c,b,e,f,d);else if("object"===c)throw b=String(a),Error("Objects are not valid as a React child (found: "+
|
|
14
|
+
("[object Object]"===b?"object with keys {"+Object.keys(a).join(", ")+"}":b)+"). If you meant to render a collection of children, use an array instead.");return h}function C(a,b,e){if(null==a)return a;var c=[],d=0;B(a,c,"","",function(a){return b.call(e,a,d++)});return c}function ra(a){if(-1===a._status){var b=a._result;b=b();b.then(function(b){if(0===a._status||-1===a._status)a._status=1,a._result=b},function(b){if(0===a._status||-1===a._status)a._status=2,a._result=b});-1===a._status&&(a._status=
|
|
15
|
+
0,a._result=b)}if(1===a._status)return a._result.default;throw a._result;}function O(a,b){var e=a.length;a.push(b);a:for(;0<e;){var c=e-1>>>1,d=a[c];if(0<D(d,b))a[c]=b,a[e]=d,e=c;else break a}}function p(a){return 0===a.length?null:a[0]}function E(a){if(0===a.length)return null;var b=a[0],e=a.pop();if(e!==b){a[0]=e;a:for(var c=0,d=a.length,k=d>>>1;c<k;){var h=2*(c+1)-1,l=a[h],f=h+1,g=a[f];if(0>D(l,e))f<d&&0>D(g,l)?(a[c]=g,a[f]=e,c=f):(a[c]=l,a[h]=e,c=h);else if(f<d&&0>D(g,e))a[c]=g,a[f]=e,c=f;else break a}}return b}
|
|
16
|
+
function D(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}function P(a){for(var b=p(r);null!==b;){if(null===b.callback)E(r);else if(b.startTime<=a)E(r),b.sortIndex=b.expirationTime,O(q,b);else break;b=p(r)}}function Q(a){z=!1;P(a);if(!u)if(null!==p(q))u=!0,R(S);else{var b=p(r);null!==b&&T(Q,b.startTime-a)}}function S(a,b){u=!1;z&&(z=!1,ea(A),A=-1);F=!0;var c=k;try{P(b);for(n=p(q);null!==n&&(!(n.expirationTime>b)||a&&!fa());){var m=n.callback;if("function"===typeof m){n.callback=null;
|
|
17
|
+
k=n.priorityLevel;var d=m(n.expirationTime<=b);b=v();"function"===typeof d?n.callback=d:n===p(q)&&E(q);P(b)}else E(q);n=p(q)}if(null!==n)var g=!0;else{var h=p(r);null!==h&&T(Q,h.startTime-b);g=!1}return g}finally{n=null,k=c,F=!1}}function fa(){return v()-ha<ia?!1:!0}function R(a){G=a;H||(H=!0,I())}function T(a,b){A=ja(function(){a(v())},b)}function ka(a){throw Error("act(...) is not supported in production builds of React.");}var y=Symbol.for("react.element"),qa=Symbol.for("react.portal"),sa=Symbol.for("react.fragment"),
|
|
18
|
+
ta=Symbol.for("react.strict_mode"),ua=Symbol.for("react.profiler"),va=Symbol.for("react.provider"),wa=Symbol.for("react.context"),xa=Symbol.for("react.forward_ref"),ya=Symbol.for("react.suspense"),za=Symbol.for("react.memo"),Aa=Symbol.for("react.lazy"),V=Symbol.iterator,X={isMounted:function(a){return!1},enqueueForceUpdate:function(a,b,c){},enqueueReplaceState:function(a,b,c,m){},enqueueSetState:function(a,b,c,m){}},la=Object.assign,W={};w.prototype.isReactComponent={};w.prototype.setState=function(a,
|
|
19
|
+
b){if("object"!==typeof a&&"function"!==typeof a&&null!=a)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,a,b,"setState")};w.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,"forceUpdate")};Y.prototype=w.prototype;var t=K.prototype=new Y;t.constructor=K;la(t,w.prototype);t.isPureReactComponent=!0;var ca=Array.isArray,aa=Object.prototype.hasOwnProperty,L={current:null},
|
|
20
|
+
ba={key:!0,ref:!0,__self:!0,__source:!0},da=/\/+/g,g={current:null},J={transition:null};if("object"===typeof performance&&"function"===typeof performance.now){var Ba=performance;var v=function(){return Ba.now()}}else{var ma=Date,Ca=ma.now();v=function(){return ma.now()-Ca}}var q=[],r=[],Da=1,n=null,k=3,F=!1,u=!1,z=!1,ja="function"===typeof setTimeout?setTimeout:null,ea="function"===typeof clearTimeout?clearTimeout:null,na="undefined"!==typeof setImmediate?setImmediate:null;"undefined"!==typeof navigator&&
|
|
21
|
+
void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var H=!1,G=null,A=-1,ia=5,ha=-1,U=function(){if(null!==G){var a=v();ha=a;var b=!0;try{b=G(!0,a)}finally{b?I():(H=!1,G=null)}}else H=!1};if("function"===typeof na)var I=function(){na(U)};else if("undefined"!==typeof MessageChannel){t=new MessageChannel;var Ea=t.port2;t.port1.onmessage=U;I=function(){Ea.postMessage(null)}}else I=function(){ja(U,0)};t={ReactCurrentDispatcher:g,
|
|
22
|
+
ReactCurrentOwner:L,ReactCurrentBatchConfig:J,Scheduler:{__proto__:null,unstable_ImmediatePriority:1,unstable_UserBlockingPriority:2,unstable_NormalPriority:3,unstable_IdlePriority:5,unstable_LowPriority:4,unstable_runWithPriority:function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=k;k=a;try{return b()}finally{k=c}},unstable_next:function(a){switch(k){case 1:case 2:case 3:var b=3;break;default:b=k}var c=k;k=b;try{return a()}finally{k=c}},unstable_scheduleCallback:function(a,
|
|
23
|
+
b,c){var e=v();"object"===typeof c&&null!==c?(c=c.delay,c="number"===typeof c&&0<c?e+c:e):c=e;switch(a){case 1:var d=-1;break;case 2:d=250;break;case 5:d=1073741823;break;case 4:d=1E4;break;default:d=5E3}d=c+d;a={id:Da++,callback:b,priorityLevel:a,startTime:c,expirationTime:d,sortIndex:-1};c>e?(a.sortIndex=c,O(r,a),null===p(q)&&a===p(r)&&(z?(ea(A),A=-1):z=!0,T(Q,c-e))):(a.sortIndex=d,O(q,a),u||F||(u=!0,R(S)));return a},unstable_cancelCallback:function(a){a.callback=null},unstable_wrapCallback:function(a){var b=
|
|
24
|
+
k;return function(){var c=k;k=b;try{return a.apply(this,arguments)}finally{k=c}}},unstable_getCurrentPriorityLevel:function(){return k},unstable_shouldYield:fa,unstable_requestPaint:function(){},unstable_continueExecution:function(){u||F||(u=!0,R(S))},unstable_pauseExecution:function(){},unstable_getFirstCallbackNode:function(){return p(q)},get unstable_now(){return v},unstable_forceFrameRate:function(a){0>a||125<a?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):
|
|
25
|
+
ia=0<a?Math.floor(1E3/a):5},unstable_Profiling:null}};c.Children={map:C,forEach:function(a,b,c){C(a,function(){b.apply(this,arguments)},c)},count:function(a){var b=0;C(a,function(){b++});return b},toArray:function(a){return C(a,function(a){return a})||[]},only:function(a){if(!M(a))throw Error("React.Children.only expected to receive a single React element child.");return a}};c.Component=w;c.Fragment=sa;c.Profiler=ua;c.PureComponent=K;c.StrictMode=ta;c.Suspense=ya;c.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=
|
|
26
|
+
t;c.act=ka;c.cloneElement=function(a,b,c){if(null===a||void 0===a)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+a+".");var e=la({},a.props),d=a.key,k=a.ref,h=a._owner;if(null!=b){void 0!==b.ref&&(k=b.ref,h=L.current);void 0!==b.key&&(d=""+b.key);if(a.type&&a.type.defaultProps)var l=a.type.defaultProps;for(f in b)aa.call(b,f)&&!ba.hasOwnProperty(f)&&(e[f]=void 0===b[f]&&void 0!==l?l[f]:b[f])}var f=arguments.length-2;if(1===f)e.children=c;else if(1<f){l=
|
|
27
|
+
Array(f);for(var g=0;g<f;g++)l[g]=arguments[g+2];e.children=l}return{$$typeof:y,type:a.type,key:d,ref:k,props:e,_owner:h}};c.createContext=function(a){a={$$typeof:wa,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null};a.Provider={$$typeof:va,_context:a};return a.Consumer=a};c.createElement=Z;c.createFactory=function(a){var b=Z.bind(null,a);b.type=a;return b};c.createRef=function(){return{current:null}};c.forwardRef=function(a){return{$$typeof:xa,
|
|
28
|
+
render:a}};c.isValidElement=M;c.lazy=function(a){return{$$typeof:Aa,_payload:{_status:-1,_result:a},_init:ra}};c.memo=function(a,b){return{$$typeof:za,type:a,compare:void 0===b?null:b}};c.startTransition=function(a,b){b=J.transition;J.transition={};try{a()}finally{J.transition=b}};c.unstable_act=ka;c.useCallback=function(a,b){return g.current.useCallback(a,b)};c.useContext=function(a){return g.current.useContext(a)};c.useDebugValue=function(a,b){};c.useDeferredValue=function(a){return g.current.useDeferredValue(a)};
|
|
29
|
+
c.useEffect=function(a,b){return g.current.useEffect(a,b)};c.useId=function(){return g.current.useId()};c.useImperativeHandle=function(a,b,c){return g.current.useImperativeHandle(a,b,c)};c.useInsertionEffect=function(a,b){return g.current.useInsertionEffect(a,b)};c.useLayoutEffect=function(a,b){return g.current.useLayoutEffect(a,b)};c.useMemo=function(a,b){return g.current.useMemo(a,b)};c.useReducer=function(a,b,c){return g.current.useReducer(a,b,c)};c.useRef=function(a){return g.current.useRef(a)};
|
|
30
|
+
c.useState=function(a){return g.current.useState(a)};c.useSyncExternalStore=function(a,b,c){return g.current.useSyncExternalStore(a,b,c)};c.useTransition=function(){return g.current.useTransition()};c.version="18.3.1"});
|
|
31
|
+
})();
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export class BridgeError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
recoverable;
|
|
4
|
+
constructor(code, message, recoverable = false) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "BridgeError";
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.recoverable = recoverable;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,IAAI,CAAS;IACb,WAAW,CAAU;IAE9B,YAAY,IAAY,EAAE,OAAe,EAAE,WAAW,GAAG,KAAK;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;CACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type ChildProcessWithoutNullStreams, type SpawnOptionsWithoutStdio } from "node:child_process";
|
|
2
|
+
import type { AttestedClaudePeerRuntime } from "./claude-runtime.js";
|
|
3
|
+
export type ClaudeCompatibilityScratch = Readonly<{
|
|
4
|
+
name: string;
|
|
5
|
+
sessionId: string;
|
|
6
|
+
assertRunning: () => void;
|
|
7
|
+
close: () => Promise<void>;
|
|
8
|
+
}>;
|
|
9
|
+
export type ClaudeCompatibilityScratchFactory = () => Promise<ClaudeCompatibilityScratch>;
|
|
10
|
+
type ScratchDependencies = Readonly<{
|
|
11
|
+
spawn?: (command: string, args: readonly string[], options: SpawnOptionsWithoutStdio) => ChildProcessWithoutNullStreams;
|
|
12
|
+
userInfo?: () => {
|
|
13
|
+
homedir: string;
|
|
14
|
+
username: string;
|
|
15
|
+
};
|
|
16
|
+
}>;
|
|
17
|
+
export declare function startClaudeCompatibilityScratch(runtime: AttestedClaudePeerRuntime, dependencies?: ScratchDependencies): Promise<ClaudeCompatibilityScratch>;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { randomBytes, randomUUID } from "node:crypto";
|
|
2
|
+
import { spawn as nodeSpawn, } from "node:child_process";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { BridgeError } from "../errors.js";
|
|
6
|
+
const MAX_SCRATCH_OUTPUT_BYTES = 64 * 1024;
|
|
7
|
+
const SCRATCH_START_TIMEOUT_MS = 2_000;
|
|
8
|
+
const SCRATCH_CLOSE_TIMEOUT_MS = 2_000;
|
|
9
|
+
function waitForSpawn(child) {
|
|
10
|
+
return new Promise((resolve, reject) => {
|
|
11
|
+
const timer = setTimeout(() => {
|
|
12
|
+
cleanup();
|
|
13
|
+
reject(new Error("scratch spawn timeout"));
|
|
14
|
+
}, SCRATCH_START_TIMEOUT_MS);
|
|
15
|
+
timer.unref();
|
|
16
|
+
const cleanup = () => {
|
|
17
|
+
clearTimeout(timer);
|
|
18
|
+
child.off("spawn", onSpawn);
|
|
19
|
+
child.off("error", onError);
|
|
20
|
+
child.off("exit", onExit);
|
|
21
|
+
};
|
|
22
|
+
const onSpawn = () => {
|
|
23
|
+
cleanup();
|
|
24
|
+
resolve();
|
|
25
|
+
};
|
|
26
|
+
const onError = (error) => {
|
|
27
|
+
cleanup();
|
|
28
|
+
reject(error);
|
|
29
|
+
};
|
|
30
|
+
const onExit = () => {
|
|
31
|
+
cleanup();
|
|
32
|
+
reject(new Error("scratch exited before ready"));
|
|
33
|
+
};
|
|
34
|
+
child.once("spawn", onSpawn);
|
|
35
|
+
child.once("error", onError);
|
|
36
|
+
child.once("exit", onExit);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function waitForExit(child, timeoutMs) {
|
|
40
|
+
if (child.exitCode !== null || child.signalCode !== null) {
|
|
41
|
+
return Promise.resolve(true);
|
|
42
|
+
}
|
|
43
|
+
return new Promise((resolve) => {
|
|
44
|
+
const timer = setTimeout(() => {
|
|
45
|
+
cleanup();
|
|
46
|
+
resolve(false);
|
|
47
|
+
}, timeoutMs);
|
|
48
|
+
timer.unref();
|
|
49
|
+
const cleanup = () => {
|
|
50
|
+
clearTimeout(timer);
|
|
51
|
+
child.off("exit", onExit);
|
|
52
|
+
};
|
|
53
|
+
const onExit = () => {
|
|
54
|
+
cleanup();
|
|
55
|
+
resolve(true);
|
|
56
|
+
};
|
|
57
|
+
child.once("exit", onExit);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
export async function startClaudeCompatibilityScratch(runtime, dependencies = {}) {
|
|
61
|
+
const user = (dependencies.userInfo ?? os.userInfo)();
|
|
62
|
+
if (!path.isAbsolute(user.homedir) ||
|
|
63
|
+
path.normalize(user.homedir) !== user.homedir ||
|
|
64
|
+
user.homedir.includes("\0") ||
|
|
65
|
+
!/^[A-Za-z0-9._-]{1,128}$/.test(user.username)) {
|
|
66
|
+
throw new BridgeError("CLAUDE_CERTIFICATION_USER_INVALID", "The bounded Claude certification scratch requires one canonical local user.");
|
|
67
|
+
}
|
|
68
|
+
const sessionId = randomUUID();
|
|
69
|
+
const name = `embassy-compat-${randomBytes(6).toString("hex")}`;
|
|
70
|
+
const args = [
|
|
71
|
+
"--print",
|
|
72
|
+
"--input-format",
|
|
73
|
+
"stream-json",
|
|
74
|
+
"--output-format",
|
|
75
|
+
"stream-json",
|
|
76
|
+
"--verbose",
|
|
77
|
+
"--session-id",
|
|
78
|
+
sessionId,
|
|
79
|
+
"--name",
|
|
80
|
+
name,
|
|
81
|
+
"--safe-mode",
|
|
82
|
+
"--tools",
|
|
83
|
+
"",
|
|
84
|
+
"--strict-mcp-config",
|
|
85
|
+
"--no-session-persistence",
|
|
86
|
+
"--permission-mode",
|
|
87
|
+
"dontAsk",
|
|
88
|
+
"--settings",
|
|
89
|
+
'{"crossSessionInbound":"accept"}',
|
|
90
|
+
];
|
|
91
|
+
const spawn = dependencies.spawn ??
|
|
92
|
+
((command, argv, options) => nodeSpawn(command, [...argv], options));
|
|
93
|
+
let child;
|
|
94
|
+
try {
|
|
95
|
+
child = spawn(runtime.claudeExecutable, args, {
|
|
96
|
+
cwd: user.homedir,
|
|
97
|
+
detached: false,
|
|
98
|
+
env: {
|
|
99
|
+
HOME: user.homedir,
|
|
100
|
+
USER: user.username,
|
|
101
|
+
LOGNAME: user.username,
|
|
102
|
+
SHELL: "/bin/zsh",
|
|
103
|
+
PATH: "/usr/bin:/bin:/usr/sbin:/sbin",
|
|
104
|
+
TMPDIR: os.tmpdir(),
|
|
105
|
+
},
|
|
106
|
+
shell: false,
|
|
107
|
+
stdio: "pipe",
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
throw new BridgeError("CLAUDE_CERTIFICATION_SCRATCH_UNAVAILABLE", "The bounded Claude certification scratch could not start.", true);
|
|
112
|
+
}
|
|
113
|
+
let outputBytes = 0;
|
|
114
|
+
let outputOverflow = false;
|
|
115
|
+
const observeOutput = (chunk) => {
|
|
116
|
+
outputBytes += Buffer.byteLength(chunk);
|
|
117
|
+
if (outputBytes > MAX_SCRATCH_OUTPUT_BYTES && !outputOverflow) {
|
|
118
|
+
outputOverflow = true;
|
|
119
|
+
child.kill("SIGTERM");
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
child.stdout.on("data", observeOutput);
|
|
123
|
+
child.stderr.on("data", observeOutput);
|
|
124
|
+
try {
|
|
125
|
+
await waitForSpawn(child);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
child.kill("SIGKILL");
|
|
129
|
+
await waitForExit(child, SCRATCH_CLOSE_TIMEOUT_MS);
|
|
130
|
+
throw new BridgeError("CLAUDE_CERTIFICATION_SCRATCH_UNAVAILABLE", "The bounded Claude certification scratch did not become ready.", true);
|
|
131
|
+
}
|
|
132
|
+
let closeOperation;
|
|
133
|
+
return {
|
|
134
|
+
name,
|
|
135
|
+
sessionId,
|
|
136
|
+
assertRunning: () => {
|
|
137
|
+
if (outputOverflow ||
|
|
138
|
+
child.exitCode !== null ||
|
|
139
|
+
child.signalCode !== null) {
|
|
140
|
+
throw new BridgeError("CLAUDE_CERTIFICATION_SCRATCH_EXITED", "The bounded Claude certification scratch exited before settlement.", true);
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
close: () => {
|
|
144
|
+
closeOperation ??= (async () => {
|
|
145
|
+
child.stdin.end();
|
|
146
|
+
if (await waitForExit(child, SCRATCH_CLOSE_TIMEOUT_MS))
|
|
147
|
+
return;
|
|
148
|
+
child.kill("SIGTERM");
|
|
149
|
+
if (await waitForExit(child, SCRATCH_CLOSE_TIMEOUT_MS))
|
|
150
|
+
return;
|
|
151
|
+
child.kill("SIGKILL");
|
|
152
|
+
await waitForExit(child, SCRATCH_CLOSE_TIMEOUT_MS);
|
|
153
|
+
})();
|
|
154
|
+
return closeOperation;
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=claude-compatibility-scratch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-compatibility-scratch.js","sourceRoot":"","sources":["../../../src/gateway/claude-compatibility-scratch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { AttestedClaudePeerRuntime } from "./claude-runtime.js";
|
|
2
|
+
import type { GatewayDeliveryNoticeMode } from "./config.js";
|
|
3
|
+
import { type ClaudeNativeHelperCommand, type ClaudeNativeHelperEvent, type ClaudeNativeHelperRegistration, type ClaudeNativeHelperResult } from "./claude-helper-protocol.js";
|
|
4
|
+
import type { DashboardLocale } from "./locale.js";
|
|
5
|
+
export type ClaudeNativeHelperClientCallbacks = Readonly<{
|
|
6
|
+
onEvent: (event: ClaudeNativeHelperEvent) => void;
|
|
7
|
+
onExit: (event: Readonly<{
|
|
8
|
+
code: number | null;
|
|
9
|
+
signal: NodeJS.Signals | null;
|
|
10
|
+
}>) => void;
|
|
11
|
+
}>;
|
|
12
|
+
export type ClaudeNativeHelperClientStartOptions = Readonly<{
|
|
13
|
+
entryPath?: string;
|
|
14
|
+
runtime: AttestedClaudePeerRuntime;
|
|
15
|
+
hostId: "this-mac";
|
|
16
|
+
locale: DashboardLocale;
|
|
17
|
+
deliveryNotices: GatewayDeliveryNoticeMode;
|
|
18
|
+
maxPendingMessages: number;
|
|
19
|
+
registration: ClaudeNativeHelperRegistration;
|
|
20
|
+
callbacks: ClaudeNativeHelperClientCallbacks;
|
|
21
|
+
}>;
|
|
22
|
+
export interface ClaudeNativeHelperClientLike {
|
|
23
|
+
readonly pid: number;
|
|
24
|
+
readonly registration: ClaudeNativeHelperRegistration;
|
|
25
|
+
generation: string;
|
|
26
|
+
request(command: ClaudeNativeHelperCommand, timeoutMs?: number): Promise<ClaudeNativeHelperResult>;
|
|
27
|
+
close(): Promise<void>;
|
|
28
|
+
forceClose(): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
export type ClaudeNativeHelperFactory = (options: ClaudeNativeHelperClientStartOptions) => Promise<ClaudeNativeHelperClientLike>;
|
|
31
|
+
export declare function defaultClaudeNativeHelperEntryPath(): string;
|
|
32
|
+
export declare class ClaudeNativeHelperClient implements ClaudeNativeHelperClientLike {
|
|
33
|
+
#private;
|
|
34
|
+
readonly pid: number;
|
|
35
|
+
readonly registration: ClaudeNativeHelperRegistration;
|
|
36
|
+
generation: string;
|
|
37
|
+
private constructor();
|
|
38
|
+
static start(options: ClaudeNativeHelperClientStartOptions): Promise<ClaudeNativeHelperClient>;
|
|
39
|
+
request(command: ClaudeNativeHelperCommand, timeoutMs?: number): Promise<ClaudeNativeHelperResult>;
|
|
40
|
+
close(): Promise<void>;
|
|
41
|
+
forceClose(): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
export declare const createClaudeNativeHelper: ClaudeNativeHelperFactory;
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { fork, } from "node:child_process";
|
|
2
|
+
import { randomBytes } from "node:crypto";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { BridgeError } from "../errors.js";
|
|
5
|
+
import { assertClaudeNativeHelperIpcSize, CLAUDE_NATIVE_HELPER_MAX_REQUESTS, CLAUDE_NATIVE_HELPER_PROTOCOL_VERSION, isClaudeNativeHelperChildMessage, } from "./claude-helper-protocol.js";
|
|
6
|
+
const DEFAULT_REQUEST_TIMEOUT_MS = 5_000;
|
|
7
|
+
const CLOSE_TIMEOUT_MS = 2_000;
|
|
8
|
+
export function defaultClaudeNativeHelperEntryPath() {
|
|
9
|
+
return fileURLToPath(new URL("./claude-helper.js", import.meta.url));
|
|
10
|
+
}
|
|
11
|
+
function requestId() {
|
|
12
|
+
return randomBytes(18).toString("base64url");
|
|
13
|
+
}
|
|
14
|
+
function helperFault(code, recoverable = false) {
|
|
15
|
+
return new BridgeError(code, "The supervised native Claude helper could not complete its bounded operation.", recoverable);
|
|
16
|
+
}
|
|
17
|
+
function sendIpc(child, value) {
|
|
18
|
+
assertClaudeNativeHelperIpcSize(value);
|
|
19
|
+
if (!child.connected || child.killed) {
|
|
20
|
+
return Promise.reject(helperFault("CLAUDE_NATIVE_HELPER_UNAVAILABLE", true));
|
|
21
|
+
}
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
child.send(value, (error) => {
|
|
24
|
+
if (error === null)
|
|
25
|
+
resolve();
|
|
26
|
+
else
|
|
27
|
+
reject(helperFault("CLAUDE_NATIVE_HELPER_IPC_FAILED", true));
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
export class ClaudeNativeHelperClient {
|
|
32
|
+
pid;
|
|
33
|
+
registration;
|
|
34
|
+
generation;
|
|
35
|
+
#child;
|
|
36
|
+
#callbacks;
|
|
37
|
+
#pending = new Map();
|
|
38
|
+
#closed = false;
|
|
39
|
+
#exitSettled = false;
|
|
40
|
+
#exitPromise;
|
|
41
|
+
#resolveExit;
|
|
42
|
+
constructor(child, registration, callbacks) {
|
|
43
|
+
if (!Number.isSafeInteger(child.pid) || (child.pid ?? 0) <= 0) {
|
|
44
|
+
throw helperFault("CLAUDE_NATIVE_HELPER_PID_INVALID");
|
|
45
|
+
}
|
|
46
|
+
this.pid = child.pid;
|
|
47
|
+
this.registration = registration;
|
|
48
|
+
this.generation = "";
|
|
49
|
+
this.#child = child;
|
|
50
|
+
this.#callbacks = callbacks;
|
|
51
|
+
this.#exitPromise = new Promise((resolve) => {
|
|
52
|
+
this.#resolveExit = resolve;
|
|
53
|
+
});
|
|
54
|
+
child.on("message", (value) => this.#onMessage(value));
|
|
55
|
+
child.once("error", () => this.#fail(helperFault("CLAUDE_NATIVE_HELPER_SPAWN_FAILED")));
|
|
56
|
+
child.once("disconnect", () => {
|
|
57
|
+
if (!this.#exitSettled) {
|
|
58
|
+
this.#fail(helperFault("CLAUDE_NATIVE_HELPER_DISCONNECTED"));
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
child.once("exit", (code, signal) => this.#onExit(code, signal));
|
|
62
|
+
}
|
|
63
|
+
static async start(options) {
|
|
64
|
+
const entryPath = options.entryPath ?? defaultClaudeNativeHelperEntryPath();
|
|
65
|
+
const child = fork(entryPath, [], {
|
|
66
|
+
cwd: "/",
|
|
67
|
+
env: {
|
|
68
|
+
LANG: "C",
|
|
69
|
+
LC_ALL: "C",
|
|
70
|
+
TZ: "UTC",
|
|
71
|
+
},
|
|
72
|
+
execPath: process.execPath,
|
|
73
|
+
execArgv: [],
|
|
74
|
+
serialization: "json",
|
|
75
|
+
stdio: ["ignore", "ignore", "ignore", "ipc"],
|
|
76
|
+
});
|
|
77
|
+
const client = new ClaudeNativeHelperClient(child, options.registration, options.callbacks);
|
|
78
|
+
const init = {
|
|
79
|
+
protocolVersion: CLAUDE_NATIVE_HELPER_PROTOCOL_VERSION,
|
|
80
|
+
type: "initialize",
|
|
81
|
+
requestId: requestId(),
|
|
82
|
+
runtime: { ...options.runtime },
|
|
83
|
+
hostId: options.hostId,
|
|
84
|
+
locale: options.locale,
|
|
85
|
+
deliveryNotices: options.deliveryNotices,
|
|
86
|
+
maxPendingMessages: options.maxPendingMessages,
|
|
87
|
+
registration: { ...options.registration },
|
|
88
|
+
};
|
|
89
|
+
try {
|
|
90
|
+
const result = await client.#requestEnvelope(init, DEFAULT_REQUEST_TIMEOUT_MS);
|
|
91
|
+
if (!("generation" in result) ||
|
|
92
|
+
typeof result.generation !== "string" ||
|
|
93
|
+
result.generation.length === 0) {
|
|
94
|
+
throw helperFault("CLAUDE_NATIVE_HELPER_INVALID_RESPONSE");
|
|
95
|
+
}
|
|
96
|
+
client.generation = result.generation;
|
|
97
|
+
return client;
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
await client.forceClose();
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async request(command, timeoutMs = DEFAULT_REQUEST_TIMEOUT_MS) {
|
|
105
|
+
return await this.#requestEnvelope({
|
|
106
|
+
protocolVersion: CLAUDE_NATIVE_HELPER_PROTOCOL_VERSION,
|
|
107
|
+
type: "request",
|
|
108
|
+
requestId: requestId(),
|
|
109
|
+
command,
|
|
110
|
+
}, timeoutMs);
|
|
111
|
+
}
|
|
112
|
+
async close() {
|
|
113
|
+
if (this.#closed)
|
|
114
|
+
return await this.#exitPromise;
|
|
115
|
+
try {
|
|
116
|
+
await this.request({ method: "close" }, CLOSE_TIMEOUT_MS);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
this.#child.kill("SIGTERM");
|
|
120
|
+
}
|
|
121
|
+
this.#closed = true;
|
|
122
|
+
const timer = setTimeout(() => this.#child.kill("SIGKILL"), CLOSE_TIMEOUT_MS);
|
|
123
|
+
timer.unref();
|
|
124
|
+
await this.#exitPromise;
|
|
125
|
+
clearTimeout(timer);
|
|
126
|
+
}
|
|
127
|
+
async forceClose() {
|
|
128
|
+
if (!this.#closed)
|
|
129
|
+
this.#closed = true;
|
|
130
|
+
if (!this.#exitSettled)
|
|
131
|
+
this.#child.kill("SIGTERM");
|
|
132
|
+
const timer = setTimeout(() => this.#child.kill("SIGKILL"), CLOSE_TIMEOUT_MS);
|
|
133
|
+
timer.unref();
|
|
134
|
+
await this.#exitPromise;
|
|
135
|
+
clearTimeout(timer);
|
|
136
|
+
}
|
|
137
|
+
async #requestEnvelope(envelope, timeoutMs) {
|
|
138
|
+
if (this.#closed || this.#exitSettled) {
|
|
139
|
+
throw helperFault("CLAUDE_NATIVE_HELPER_UNAVAILABLE", true);
|
|
140
|
+
}
|
|
141
|
+
if (this.#pending.size >= CLAUDE_NATIVE_HELPER_MAX_REQUESTS) {
|
|
142
|
+
throw helperFault("CLAUDE_NATIVE_HELPER_REQUEST_CAPACITY", true);
|
|
143
|
+
}
|
|
144
|
+
if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 60_000) {
|
|
145
|
+
throw helperFault("CLAUDE_NATIVE_HELPER_TIMEOUT_INVALID");
|
|
146
|
+
}
|
|
147
|
+
const promise = new Promise((resolve, reject) => {
|
|
148
|
+
const timer = setTimeout(() => {
|
|
149
|
+
this.#pending.delete(envelope.requestId);
|
|
150
|
+
reject(helperFault("CLAUDE_NATIVE_HELPER_REQUEST_TIMEOUT"));
|
|
151
|
+
}, timeoutMs);
|
|
152
|
+
timer.unref();
|
|
153
|
+
this.#pending.set(envelope.requestId, { resolve, reject, timer });
|
|
154
|
+
});
|
|
155
|
+
try {
|
|
156
|
+
await sendIpc(this.#child, envelope);
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
const pending = this.#pending.get(envelope.requestId);
|
|
160
|
+
if (pending !== undefined) {
|
|
161
|
+
clearTimeout(pending.timer);
|
|
162
|
+
this.#pending.delete(envelope.requestId);
|
|
163
|
+
pending.reject(error);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return await promise;
|
|
167
|
+
}
|
|
168
|
+
#onMessage(value) {
|
|
169
|
+
try {
|
|
170
|
+
assertClaudeNativeHelperIpcSize(value);
|
|
171
|
+
if (!isClaudeNativeHelperChildMessage(value)) {
|
|
172
|
+
throw helperFault("CLAUDE_NATIVE_HELPER_PROTOCOL_INVALID");
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
this.#fail(error);
|
|
177
|
+
this.#child.kill("SIGTERM");
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const message = value;
|
|
181
|
+
if (message.type === "event") {
|
|
182
|
+
this.#callbacks.onEvent(message.value);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const pending = this.#pending.get(message.requestId);
|
|
186
|
+
if (pending === undefined)
|
|
187
|
+
return;
|
|
188
|
+
clearTimeout(pending.timer);
|
|
189
|
+
this.#pending.delete(message.requestId);
|
|
190
|
+
if (message.ok)
|
|
191
|
+
pending.resolve(message.result);
|
|
192
|
+
else
|
|
193
|
+
pending.reject(helperFault(message.error.code, message.error.recoverable));
|
|
194
|
+
}
|
|
195
|
+
#fail(error) {
|
|
196
|
+
for (const pending of this.#pending.values()) {
|
|
197
|
+
clearTimeout(pending.timer);
|
|
198
|
+
pending.reject(error);
|
|
199
|
+
}
|
|
200
|
+
this.#pending.clear();
|
|
201
|
+
}
|
|
202
|
+
#onExit(code, signal) {
|
|
203
|
+
if (this.#exitSettled)
|
|
204
|
+
return;
|
|
205
|
+
this.#exitSettled = true;
|
|
206
|
+
this.#fail(helperFault("CLAUDE_NATIVE_HELPER_EXITED"));
|
|
207
|
+
this.#resolveExit();
|
|
208
|
+
this.#callbacks.onExit({ code, signal });
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
export const createClaudeNativeHelper = async (options) => await ClaudeNativeHelperClient.start(options);
|
|
212
|
+
//# sourceMappingURL=claude-helper-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-helper-client.js","sourceRoot":"","sources":["../../../src/gateway/claude-helper-client.ts"],"names":[],"mappings":"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"}
|