@makaio/framework 1.0.0-dev-1782138936821 → 1.0.0-dev-1783282710723

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.
Files changed (117) hide show
  1. package/dist/.makaio-build.json +2 -2
  2. package/dist/{account-identity-D5TUafYg.mjs → account-identity-C7Kx_ieU.mjs} +1 -1
  3. package/dist/{adapter-Deu9viD2.mjs → adapter-DaQqmKOJ.mjs} +1 -1
  4. package/dist/adapters/index.d.mts +1 -1
  5. package/dist/artifact-CGjnoyCC.mjs +1 -0
  6. package/dist/bus/index.d.mts +41 -3
  7. package/dist/bus/index.mjs +1 -1
  8. package/dist/bus-D-ioC0DE.mjs +1 -0
  9. package/dist/bus-rgUFuO2a.mjs +2 -0
  10. package/dist/{canonical-model-BM5WAnQW.mjs → canonical-model-DV-Z8gsb.mjs} +1 -1
  11. package/dist/{client-BO-0jTSV.mjs → client-BcfR-LJC.mjs} +1 -1
  12. package/dist/{compression-CXEHx0rS.mjs → compression-C5JAWdgZ.mjs} +1 -1
  13. package/dist/contracts/adapter/index.d.mts +1 -1
  14. package/dist/contracts/adapter/index.mjs +1 -1
  15. package/dist/contracts/artifact/index.d.mts +2 -2
  16. package/dist/contracts/artifact/index.mjs +1 -1
  17. package/dist/contracts/canonical-model/index.d.mts +1 -1
  18. package/dist/contracts/canonical-model/index.mjs +1 -1
  19. package/dist/contracts/client/index.d.mts +1 -1
  20. package/dist/contracts/client/index.mjs +1 -1
  21. package/dist/contracts/config/index.mjs +1 -1
  22. package/dist/contracts/extension/index.d.mts +3 -3
  23. package/dist/contracts/extension/index.mjs +1 -1
  24. package/dist/contracts/facet/index.d.mts +1 -1
  25. package/dist/contracts/harness/index.d.mts +1 -1
  26. package/dist/contracts/index.d.mts +100 -100
  27. package/dist/contracts/index.mjs +1 -1
  28. package/dist/contracts/materialization/index.d.mts +3 -3
  29. package/dist/contracts/materialization/index.mjs +1 -1
  30. package/dist/contracts/provider/index.mjs +1 -1
  31. package/dist/contracts/session/index.d.mts +2 -2
  32. package/dist/contracts/session/index.mjs +1 -1
  33. package/dist/contracts/shared/index.d.mts +1 -1
  34. package/dist/contracts/shared/index.mjs +1 -1
  35. package/dist/contracts/variant/index.d.mts +1 -1
  36. package/dist/contracts/workflow/index.d.mts +2 -2
  37. package/dist/contracts/workflow/index.mjs +1 -1
  38. package/dist/{definition-BJ_975aA.mjs → definition-C-GVz7uw.mjs} +1 -1
  39. package/dist/{definition-s9PIua2B.d.mts → definition-DFcxkf2i.d.mts} +1 -1
  40. package/dist/{extension-CfL70C5n.mjs → extension-BS_4BOeO.mjs} +1 -1
  41. package/dist/{index-BwGfdbI0.d.mts → index-2fK9iSHI.d.mts} +9 -9
  42. package/dist/{index-BN95duxC.d.mts → index-4eP9DRL_.d.mts} +4 -4
  43. package/dist/{index-DDrS0Axp.d.mts → index-9b2_jXxq.d.mts} +15 -15
  44. package/dist/{index-DTBQOCar.d.mts → index-BMbmoarE.d.mts} +16 -16
  45. package/dist/{index-C2jl1iE2.d.mts → index-Bh6lHiW4.d.mts} +24 -24
  46. package/dist/{index-JkIaFJoM.d.mts → index-CL2T6LVv.d.mts} +6 -6
  47. package/dist/{index-B08YYzYZ.d.mts → index-CTEsbp9H.d.mts} +25 -25
  48. package/dist/{index-DYw2AuNR.d.mts → index-CaOWqztb.d.mts} +1 -1
  49. package/dist/{index-mU2lnU7O.d.mts → index-CqCe7Phc.d.mts} +6 -6
  50. package/dist/{index-Qd1Qom8M.d.mts → index-D6aAzr32.d.mts} +4 -4
  51. package/dist/{index-DXYFNGT9.d.mts → index-DLy-tc0L.d.mts} +53 -53
  52. package/dist/{index-Chtgizhn.d.mts → index-DdBRlm7m.d.mts} +57 -57
  53. package/dist/{index-ekpUAYVC.d.mts → index-Dg-y1mrq.d.mts} +827 -51
  54. package/dist/{index-CWDJFJGa.d.mts → index-GD-i3DW7.d.mts} +146 -146
  55. package/dist/{index-CaerrEDH.d.mts → index-NkNbYFud.d.mts} +1 -1
  56. package/dist/{index-ByDySw3V.d.mts → index-WHUV7neB.d.mts} +10 -10
  57. package/dist/{index-CRmApyqn.d.mts → index-Y2r0Zvcm.d.mts} +8 -8
  58. package/dist/kernel/extension/index.d.mts +1 -1
  59. package/dist/kernel/index.d.mts +2 -2
  60. package/dist/kernel/observability/index.d.mts +1 -1
  61. package/dist/{materialization-DBXjSiBn.mjs → materialization-CUYxZCfk.mjs} +1 -1
  62. package/dist/{namespace-DuUCiVmK.d.mts → namespace-B4cV_pk3.d.mts} +6 -6
  63. package/dist/{namespace-DBGLCtoW.d.mts → namespace-CfvtDD_U.d.mts} +22 -22
  64. package/dist/{namespace-DXWpFdQH2.d.mts → namespace-D8P8Sxce2.d.mts} +2 -2
  65. package/dist/{namespace-CxzW0mIH.d.mts → namespace-DGAWYjbO.d.mts} +9 -9
  66. package/dist/{namespace-Bz0ORDns.d.mts → namespace-DXW-voCe.d.mts} +58 -58
  67. package/dist/node/transports/index.d.mts +8 -0
  68. package/dist/node/transports/index.mjs +2 -2
  69. package/dist/package.json +1 -1
  70. package/dist/{provider-context-DjSUpHSM.mjs → provider-context-CqMgPOWF.mjs} +1 -1
  71. package/dist/runtime-node/index.mjs +1 -1
  72. package/dist/runtime-node/workflow-worker/index.mjs +1 -1
  73. package/dist/{schema-Dky4zu9D.d.mts → schema-D1HrnvT7.d.mts} +2 -2
  74. package/dist/{schemas-7ncImjsM.d.mts → schemas-BemsLc_V.d.mts} +1 -1
  75. package/dist/{schemas-CynXJXJu.d.mts → schemas-CoFCV42v.d.mts} +22 -22
  76. package/dist/{schemas-CE1gbhxu.mjs → schemas-CuG17U3L.mjs} +1 -1
  77. package/dist/{schemas-Eq-lrXYz2.d.mts → schemas-D-9zNyAM2.d.mts} +5 -5
  78. package/dist/{schemas-CJ2JvA7d.d.mts → schemas-DMCGXlKa.d.mts} +4 -4
  79. package/dist/{schemas-bfhY9W6A.mjs → schemas-uID59wR8.mjs} +1 -1
  80. package/dist/scoped-bus-CZId-Df8.mjs +1 -0
  81. package/dist/services/adapter-subsystem/index.d.mts +2 -2
  82. package/dist/services/adapter-subsystem/namespace.d.mts +1 -1
  83. package/dist/services/agent-runtime/index.d.mts +2 -2
  84. package/dist/services/agent-runtime/namespace.d.mts +1 -1
  85. package/dist/services/agent-runtime/schemas.d.mts +1 -1
  86. package/dist/services/execution-target/index.d.mts +1 -1
  87. package/dist/services/git/namespace.d.mts +4 -4
  88. package/dist/services/git/schemas.d.mts +3 -3
  89. package/dist/services/harness/index.d.mts +6 -6
  90. package/dist/services/index.d.mts +83 -40
  91. package/dist/services/index.mjs +1 -1
  92. package/dist/services/session/index.d.mts +4 -4
  93. package/dist/services/session/messages/namespace.d.mts +1 -1
  94. package/dist/services/session/storage/namespace.d.mts +1 -1
  95. package/dist/services/session/storage/schema.d.mts +1 -1
  96. package/dist/services/settings/namespace.d.mts +5 -5
  97. package/dist/services/settings/storage/extension-configs/namespace.d.mts +3 -3
  98. package/dist/services/subagent-template/index.d.mts +2 -2
  99. package/dist/services/subagent-template/namespace.d.mts +1 -1
  100. package/dist/services/subagent-template/schemas.d.mts +1 -1
  101. package/dist/{session-CpVSzgkZ.mjs → session-DH-ja8Ka.mjs} +1 -1
  102. package/dist/{shared-DpOEfD8F.mjs → shared-BVW-3Dhy.mjs} +1 -1
  103. package/dist/{transition-Bf-K6QGz.d.mts → transition-DnXibkhX.d.mts} +1 -1
  104. package/dist/{types-BolHvLpf.d.mts → types-Dur8EtpR.d.mts} +61 -61
  105. package/dist/ui-kernel/index.d.mts +1 -1
  106. package/dist/ui-kernel/pages/schemas.d.mts +1 -1
  107. package/dist/{workflow-BCKOJ4UC.mjs → workflow-BqH6ar-D.mjs} +1 -1
  108. package/dist/workflow-engine/index.d.mts +52 -52
  109. package/dist/workflow-worker-dH70EbjE.mjs +1 -0
  110. package/package.json +2 -2
  111. package/dist/artifact-B3npq1cy.mjs +0 -1
  112. package/dist/bus-BgodbPl9.mjs +0 -2
  113. package/dist/bus-HgaFcCZ1.mjs +0 -1
  114. package/dist/scoped-bus-H3xMYR0E.mjs +0 -1
  115. package/dist/workflow-worker-BIpYi6o7.mjs +0 -1
  116. /package/dist/{json-value-CmhSGMLv.mjs → json-value-DmU8ibo_.mjs} +0 -0
  117. /package/dist/{schemas-CR1Rripy.mjs → schemas-DlrQ0227.mjs} +0 -0
@@ -1,2 +1,2 @@
1
- import{r as e}from"../../chunk-DTipWd-i.mjs";import{CorrelationTracker as t,DEFAULT_REQUEST_TIMEOUT_MS as n,NoHandlerError as r,TimeoutError as i,buildSubscribeMessage as a,buildUnsubscribeMessage as o,deserializeTransportError as s,getSubjectFromBusMessage as c,handleCorrelationResponse as l,isNoHandlerErrorForSubject as u,shouldReceiveMessage as d,trackMessageCorrelation as f}from"@makaio/framework/bus";import{isRecord as p}from"@makaio/framework/utils";const m={baseMs:1e3,maxMs:1e4};function ee(e,t,n){let r=Math.max(t,100),i=Math.max(n,r);return Math.min(r*2**e,i)}function te(e,t){return new Promise(n=>{if(t.aborted){n();return}let r=()=>{clearTimeout(i),t.removeEventListener(`abort`,r),n()},i=setTimeout(()=>{t.removeEventListener(`abort`,r),n()},e);t.addEventListener(`abort`,r)})}const ne={encode:async e=>JSON.stringify(e),decode:async e=>e};function re(e){return e===!1?!1:{baseMs:e?.baseMs??m.baseMs,maxMs:e?.maxMs??m.maxMs}}function h(e,t=`unknown error`){return`message`in e?String(e.message):t}async function g(e,t,n){let r=await t.encode(e);n.send(r)}function ie(e){return e.readyState===1?Promise.resolve():e.readyState>=2?Promise.reject(Error(`WebSocket closed before opening`)):new Promise((t,n)=>{let r=()=>{e.removeEventListener(`open`,i),e.removeEventListener(`error`,a),e.removeEventListener(`close`,o)},i=()=>{r(),t()},a=e=>{r(),n(Error(`WebSocket connection failed — ${h(e)}`))},o=()=>{r(),n(Error(`WebSocket closed before opening`))};e.addEventListener(`open`,i),e.addEventListener(`error`,a),e.addEventListener(`close`,o)})}async function ae(e,t,n){let r=await Promise.allSettled(Array.from(t).map(t=>t(e,n.receiveContext)));for(let e of r)e.status===`rejected`&&n.debug&&console.error(`[WebSocketClientTransport:${n.name}] Handler error:`,e.reason);return r.every(e=>e.status===`fulfilled`)}function oe(e,t){return{...t?.getReceiveContext?.(),transportName:e}}async function se(e,t){let{name:n,debug:r,auth:i,codec:a,messageTransform:o,correlations:s,handlers:c}=t;try{let u=JSON.parse(e.toString());if(typeof u!=`object`||!u||typeof u.type!=`string`){r&&console.error(`[WebSocketClientTransport:${n}] Invalid message structure:`,u);return}let d=u;if(i?.handleAuthMessage(d)||d.type===`heartbeat`)return;let f=await a.decode(d);if(o&&(f=await o(f)),f.type===`heartbeat`)return;if(f.type===`subscribe-sync-complete`){t.onSyncComplete();return}if(f.type===`subscription-ack`){typeof f.ackId==`string`&&t.onSubscriptionAck(f.ackId);return}if(l(f,s))return;let p=oe(n,i);await ae(f,c,{debug:r,name:n,receiveContext:p})&&(f.type===`subscribe`||f.type===`unsubscribe`)&&typeof f.ackId==`string`&&await t.sendSubscriptionAck(f.ackId)}catch(e){r&&console.error(`[WebSocketClientTransport:${n}] Failed to parse message:`,e)}}function ce(e,t){let n=n=>{se(n.data,{name:t.name,debug:t.debug,auth:t.auth,codec:t.codec,messageTransform:t.messageTransform,correlations:t.correlations,handlers:t.handlers,onSyncComplete:()=>{t.resolveReady()},onSubscriptionAck:e=>{t.resolveSubscriptionAck(e)},sendSubscriptionAck:async n=>{e.readyState===1&&await g({type:`subscription-ack`,ackId:n},t.codec,e)}})};t.setMessageListener(n),e.addEventListener(`message`,n)}function _(e,t){let n=t.getMessageListener();n!==null&&(e.removeEventListener(`message`,n),t.setMessageListener(null));let r=t.getCloseListener();r!==null&&(e.removeEventListener(`close`,r),t.setCloseListener(null))}async function v(e){e.resolveReady(),e.rejectPendingSubscriptionAcks(Error(`WebSocketClientTransport: reconnecting before subscription ack`)),e.resetReadyPromise();let t=e.getSocket();t!==null&&_(t,e);let n=await e.wsFactory(e.url);e.setSocket(n),e.setAuthComplete(!1);try{ce(n,e),await ie(n),e.auth&&await e.auth.authenticateClient(e=>{if(n.readyState!==1)throw Error(`WebSocketClientTransport: cannot send auth message — socket not open`);n.send(JSON.stringify(e))}),e.setAuthComplete(!0),e.debug&&console.info(`[WebSocketClientTransport:${e.name}] Connected to ${e.url}`),e.localSubscriptions.size>0&&(await g(a(e.localSubscriptions),e.codec,n),e.debug&&console.info(`[WebSocketClientTransport:${e.name}] Replayed ${e.localSubscriptions.size} subscription(s)`)),e.notifyConnected()}catch(t){let r=e.getSocket()===n;throw r&&e.auth?.cleanup(),_(n,e),r&&e.setSocket(null),e.setAuthComplete(!1),r&&(n.readyState===0||n.readyState===1)&&n.close(),t}}function y(e,t){return new Promise(n=>{if(e.readyState===3||t.aborted){n();return}let r=()=>{t.removeEventListener(`abort`,i),n()},i=()=>{e.removeEventListener(`close`,r),n()};e.addEventListener(`close`,r),t.addEventListener(`abort`,i)})}async function le(e,t,n,r,i){i(!0);try{for(;!e.aborted;){let i=n.getSocket(),a=i!==null;if(i!==null&&i.readyState!==3&&await y(i,e),e.aborted)break;a&&(n.debug&&console.info(`[WebSocketClientTransport:${n.name}] ${new Date().toISOString()} Connection lost, starting reconnect loop (maxMs=${t.maxMs})`),n.notifyDisconnected());let o=0;for(;!e.aborted;){let i=ee(o,t.baseMs,t.maxMs);n.debug&&console.info(`[WebSocketClientTransport:${n.name}] ${new Date().toISOString()} Reconnecting in ${i}ms (attempt ${o+1})`);let a=new AbortController;if(r(a),await te(i,AbortSignal.any([e,a.signal])),r(null),e.aborted)break;try{await v(n),o=0;let t=n.getSocket();if(t!==null){let r=()=>{n.auth?.cleanup(),n.setAuthComplete(!1),n.debug&&console.info(`[WebSocketClientTransport:${n.name}] ${new Date().toISOString()} Connection closed`),n.rejectPendingSubscriptionAcks(Error(`WebSocketClientTransport: disconnected before subscription ack`))};n.setCloseListener(r),t.addEventListener(`close`,r),await y(t,e)}break}catch(e){if(n.debug){let t=e instanceof Error?e.message:String(e);console.warn(`[WebSocketClientTransport:${n.name}] ${new Date().toISOString()} Connect attempt ${o+1} failed: ${t}`)}o++}}}}finally{i(!1)}}function ue(e,t,n){let r=()=>{t.auth?.cleanup(),_(e,t),t.setAuthComplete(!1),t.setSocket(null),n(),t.resolveReady(),t.rejectPendingSubscriptionAcks(Error(`WebSocketClientTransport: disconnected before subscription ack`)),t.notifyDisconnected()};t.setCloseListener(r),e.addEventListener(`close`,r)}async function de(e,t,n,r){let i=r.localSubscriptions.get(e)?.filter,o=t??i;if(r.localSubscriptions.set(e,{filter:o,priorities:n}),r.socket!==null&&r.socket.readyState===1){let t=r.beginSubscriptionAck?.(),i=a(new Map([[e,{filter:o,priorities:n}]]),t?.ackId);try{await g(i,r.codec,r.socket),await t?.promise}catch(e){throw t?.reject(e),e}}r.debug&&console.info(`[WebSocketClientTransport:${r.name}] Subscribed to ${e}${o?` with filter`:``}`)}async function fe(e,t){let n=t.localSubscriptions.get(e);if(t.localSubscriptions.delete(e),t.socket!==null&&t.socket.readyState===1){let r=t.beginSubscriptionAck?.(),i=o({[e]:n?.priorities??[]},r?.ackId);try{await g(i,t.codec,t.socket),await r?.promise}catch(e){throw r?.reject(e),e}}t.debug&&console.info(`[WebSocketClientTransport:${t.name}] Unsubscribed from ${e}`)}var b=class{name;url;auth;codec;messageTransform;autoReconnectConfig;wsFactory;debug;onConnectedCallback;onDisconnectedCallback;socket=null;authComplete=!1;correlations=new t;handlers=new Set;localSubscriptions=new Map;pendingSubscriptionAcks=new Map;subscriptionAckSeq=0;messageListener=null;closeListener=null;reconnectAbort=null;backoffWakeAbort=null;reconnectLoopRunning=!1;readyResolve=null;ready;onNewReadySession=void 0;onConnected=void 0;onDisconnected=void 0;constructor(e){this.url=e.url,this.name=e.name??`ws-client`,this.auth=e.auth,this.codec=e.codec??ne,this.messageTransform=e.messageTransform,this.debug=e.debug??!1,this.autoReconnectConfig=re(e.autoReconnect),this.wsFactory=e.createWebSocket??this.defaultWsFactory,this.onConnectedCallback=e.onConnected,this.onDisconnectedCallback=e.onDisconnected,this.ready=new Promise(e=>{this.readyResolve=e})}async connect(){if(this.reconnectAbort!==null)throw Error(`WebSocketClientTransport: already connected`);let e=new AbortController;this.reconnectAbort=e;try{await v(this.connectionDeps())}catch(e){throw this.reconnectAbort=null,e}this.autoReconnectConfig===!1?this.socket!==null&&this.wireNoReconnectClose(this.socket):this.startReconnectLoop(e.signal)}async disconnect(){let e=this.reconnectAbort;if(this.reconnectAbort=null,e?.abort(),this.readyResolve?.(),this.readyResolve=null,this.socket!==null){_(this.socket,this.connectionDeps());let e=this.socket;this.socket=null,this.authComplete=!1,(e.readyState===0||e.readyState===1)&&e.close()}this.correlations.cleanup(),this.rejectPendingSubscriptionAcks(Error(`WebSocketClientTransport: disconnected before subscription ack`)),this.auth?.cleanup(),this.handlers.clear(),this.debug&&console.info(`[WebSocketClientTransport:${this.name}] Disconnected`)}async send(e,t){if(this.socket===null||this.socket.readyState!==1)throw Error(`WebSocketClientTransport: not connected`);let r=await this.codec.encode(e);return this.socket.send(r),f(e,this.correlations,t??n)}onReceive(e){return this.handlers.add(e),()=>{this.handlers.delete(e)}}async subscribe(e,t,n=[]){await de(e,t,n,this.subscriptionDeps())}async unsubscribe(e){await fe(e,this.subscriptionDeps())}getSubscriptions(){return new Set(this.localSubscriptions.keys())}cancelRequest(e,t){this.correlations.cancel(e,t)}isReady(){return this.socket!==null&&this.socket.readyState===1&&this.authComplete}async reconnect(){if(!this.isReady()){if(this.backoffWakeAbort!==null){this.backoffWakeAbort.abort(),this.backoffWakeAbort=null;return}if(this.autoReconnectConfig!==!1){if(this.reconnectLoopRunning)return;this.reconnectAbort!==null&&this.startReconnectLoop(this.reconnectAbort.signal);return}try{await v(this.connectionDeps()),this.socket!==null&&(this.reconnectAbort=new AbortController,this.wireNoReconnectClose(this.socket))}catch{}}}startReconnectLoop(e){return le(e,this.autoReconnectConfig,this.connectionDeps(),e=>{this.backoffWakeAbort=e},e=>{this.reconnectLoopRunning=e})}subscriptionDeps(){return{name:this.name,debug:this.debug,codec:this.codec,socket:this.socket,localSubscriptions:this.localSubscriptions,beginSubscriptionAck:()=>this.beginSubscriptionAck()}}beginSubscriptionAck(){let e=`${this.name}:sub:${++this.subscriptionAckSeq}`,t,n,r=new Promise((e,r)=>{t=e,n=r});r.catch(()=>void 0);let i=t=>{this.pendingSubscriptionAcks.has(e)&&(this.pendingSubscriptionAcks.delete(e),t())};return this.pendingSubscriptionAcks.set(e,{resolve:()=>i(t),reject:e=>i(()=>n(e))}),{ackId:e,promise:r,reject:t=>this.rejectSubscriptionAck(e,t)}}resolveSubscriptionAck(e){this.pendingSubscriptionAcks.get(e)?.resolve()}rejectSubscriptionAck(e,t){this.pendingSubscriptionAcks.get(e)?.reject(t)}rejectPendingSubscriptionAcks(e){for(let t of this.pendingSubscriptionAcks.keys())this.rejectSubscriptionAck(t,e)}connectionDeps(){return{name:this.name,debug:this.debug,auth:this.auth,codec:this.codec,messageTransform:this.messageTransform,correlations:this.correlations,handlers:this.handlers,localSubscriptions:this.localSubscriptions,wsFactory:this.wsFactory,url:this.url,getSocket:()=>this.socket,setSocket:e=>{this.socket=e},setAuthComplete:e=>{this.authComplete=e},getMessageListener:()=>this.messageListener,setMessageListener:e=>{this.messageListener=e},getCloseListener:()=>this.closeListener,setCloseListener:e=>{this.closeListener=e},resolveReady:()=>{this.readyResolve?.(),this.readyResolve=null},resetReadyPromise:()=>{this.ready=new Promise(e=>{this.readyResolve=e}),this.onNewReadySession?.(this.ready)},resolveSubscriptionAck:e=>{this.resolveSubscriptionAck(e)},rejectPendingSubscriptionAcks:e=>{this.rejectPendingSubscriptionAcks(e)},notifyConnected:()=>{this.onConnectedCallback?.(),this.onConnected?.()},notifyDisconnected:()=>{this.onDisconnectedCallback?.(),this.onDisconnected?.()}}}defaultWsFactory=async e=>new(await(import(`ws`))).WebSocket(e);wireNoReconnectClose(e){ue(e,this.connectionDeps(),()=>{this.reconnectAbort=null})}};function x(e){e.timer!==void 0&&clearTimeout(e.timer)}var pe=class{pendingBroadcasts=new Map;timeout;debug;constructor(e={}){this.timeout=e.timeout??5e3,this.debug=e.debug??!1}startClientBroadcast(e,t,n,r,i){let a=t.correlationId,o=i??this.timeout,s={kind:`client`,sender:e,results:[],pendingClients:new Set(n),nodeResultsReceived:!1,timer:o===0?void 0:setTimeout(()=>{this.debug&&console.warn(`[BroadcastAggregator] Broadcast ${a} timed out`),this.finalizeBroadcast(a)},o)};this.pendingBroadcasts.set(a,s);let c=JSON.stringify(t);for(let e of n)r(e,c);this.debug&&console.info(`[BroadcastAggregator] Broadcast ${a} forwarded to ${n.length} clients`)}startServerBroadcast(e,t,n,r){let i=e.correlationId,a=r??this.timeout;return t.length===0?(this.debug&&console.info(`[BroadcastAggregator] Server broadcast ${i} - no target clients`),Promise.resolve([])):new Promise(r=>{let o={kind:`server`,results:[],pendingClients:new Set(t),timer:a===0?void 0:setTimeout(()=>{this.debug&&console.warn(`[BroadcastAggregator] Server broadcast ${i} timed out`),this.finalizeServerBroadcast(i)},a),resolve:r};this.pendingBroadcasts.set(i,o);let s=JSON.stringify(e);for(let e of t)n(e,s);this.debug&&console.info(`[BroadcastAggregator] Server broadcast ${i} sent to ${t.length} clients`)})}handleResponse(e,t){let n=this.pendingBroadcasts.get(t.correlationId);return n?(t.results&&n.results.push(...t.results),n.pendingClients.delete(e),this.debug&&console.info(`[BroadcastAggregator] Broadcast ${t.correlationId} got response, ${n.pendingClients.size} pending`),this.checkBroadcastComplete(t.correlationId,n),!0):!1}handleNodeResults(e,t,n){let r=this.pendingBroadcasts.get(e);return!r||r.kind!==`client`?!1:(r.results.push(...t),r.nodeResultsReceived=!0,r.nodeError=n,this.debug&&console.info(`[BroadcastAggregator] Broadcast ${e} node results aggregated${n?` (with error)`:``}`),this.checkBroadcastComplete(e,r),!0)}handleClientDisconnect(e){for(let[t,n]of this.pendingBroadcasts)n.kind===`client`&&n.sender===e?(x(n),this.pendingBroadcasts.delete(t)):n.pendingClients.has(e)&&(n.pendingClients.delete(e),this.checkBroadcastComplete(t,n))}cleanup(){for(let e of this.pendingBroadcasts.values())x(e),e.kind===`server`&&e.resolve(e.results);this.pendingBroadcasts.clear()}checkBroadcastComplete(e,t){if(!(t.pendingClients.size>0))if(t.kind===`client`){if(!t.nodeResultsReceived)return;this.finalizeBroadcast(e)}else this.finalizeServerBroadcast(e)}finalizeBroadcast(e){let t=this.pendingBroadcasts.get(e);if(!t||t.kind!==`client`)return;x(t),this.pendingBroadcasts.delete(e);let n=t.nodeError?{type:`broadcast-response`,correlationId:e,error:t.nodeError}:{type:`broadcast-response`,correlationId:e,results:t.results};t.sender.readyState===1&&t.sender.send(JSON.stringify(n)),this.debug&&console.info(`[BroadcastAggregator] Broadcast ${e} finalized with ${t.results.length} results`)}finalizeServerBroadcast(e){let t=this.pendingBroadcasts.get(e);!t||t.kind!==`server`||(x(t),this.pendingBroadcasts.delete(e),t.resolve(t.results),this.debug&&console.info(`[BroadcastAggregator] Server broadcast ${e} finalized with ${t.results.length} results`))}},me=class{clients=new Set;authenticatingClients=new Set;clientSubscriptions=new Map;clientFilters=new Map;debug;constructor(e={}){this.debug=e.debug??!1}addAuthenticating(e){this.authenticatingClients.add(e)}removeAuthenticating(e){this.authenticatingClients.delete(e)}isAuthenticating(e){return this.authenticatingClients.has(e)}addClient(e){this.clients.add(e)}removeClient(e){this.clients.delete(e),this.authenticatingClients.delete(e),this.clientSubscriptions.delete(e),this.clientFilters.delete(e),this.debug&&console.info(`[ClientRegistry] Client removed (${this.clients.size} remaining)`)}get size(){return this.clients.size}getAllSockets(){return new Set([...this.clients,...this.authenticatingClients])}handleSubscribeMessage(e,t){let n=this.clientSubscriptions.get(e);n||(n=new Set,this.clientSubscriptions.set(e,n));let r=this.clientFilters.get(e);for(let[i]of Object.entries(t.subjects)){n.add(i);let a=t.filters?.[i];a===void 0?r?.delete(i):(r||(r=new Map,this.clientFilters.set(e,r)),r.set(i,a))}if(this.debug){let e=Object.keys(t.subjects).length,n=t.filters?Object.keys(t.filters).length:0;console.info(`[ClientRegistry] Client subscribed to ${e} subjects, ${n} filters`)}}handleUnsubscribeMessage(e,t){let n=this.clientSubscriptions.get(e),r=this.clientFilters.get(e);for(let e of Object.keys(t))n?.delete(e),r?.delete(e);this.debug&&console.info(`[ClientRegistry] Client unsubscribed from ${Object.keys(t).length} subjects`)}getReadyClients(){let e=[];for(let t of this.clients)t.readyState===1&&e.push(t);return e}getRequestRoutingPriority(e,t,n){let r=this.clientSubscriptions.get(e);return!r||r.size===0?1:this.clientWantsMessage(e,t,n)?2:0}getInterestedClients(e,t,n){let r=[];for(let i of this.clients)i!==n&&i.readyState===1&&this.clientWantsMessage(i,e,t)&&r.push(i);return r}forwardEventToClients(e,t,n){let r=c(t)??void 0,i=`payload`in t?t.payload:void 0,a=JSON.stringify(t),o=this.getInterestedClients(r,i,e);for(let e of o)n(e,a)}clientWantsMessage(e,t,n){return d(t,n,this.clientSubscriptions.get(e)??new Set,this.clientFilters.get(e)??new Map)}};async function S(e,t,n){let r=await Promise.allSettled(Array.from(t).map(t=>t(e,n.receiveContext)));for(let e of r)if(e.status===`rejected`&&n.debug){let t=n.logContext?` ${n.logContext}`:``;console.error(`[ServerTransport] Handler error${t}:`,e.reason)}return r.every(e=>e.status===`fulfilled`)}function he(e,t,n){let{correlations:r,broadcastAggregator:i,debug:a}=t;if(e.type===`heartbeat`)return!0;if(e.type===`response`){let t=e;return typeof t.correlationId==`string`?(t.error?r.reject(t.correlationId,s(t.error)):r.resolve(t.correlationId,t.result),!0):(a&&console.warn(`[ServerTransport] Malformed response message: missing correlationId`),!0)}if(e.type===`broadcast-response`){let t=e;return typeof t.correlationId==`string`?(i.handleResponse(n,t),!0):(a&&console.warn(`[ServerTransport] Malformed broadcast-response: missing correlationId`),!0)}return!1}async function ge(e,t,n){let{registry:r,broadcastAggregator:i,handlers:a,normalizeBroadcastTimeout:o,sendSafely:s,debug:c}=n;if(he(e,n,t))return;let l=n.auth?.getReceiveContext?.(t);if(e.type===`subscribe`){let n=e;if(!p(n.subjects)){c&&console.warn(`[ServerTransport] Malformed subscribe message: missing subjects record`);return}r.handleSubscribeMessage(t,n),await S(n,a,{debug:c,receiveContext:l,logContext:`dispatching subscribe`})&&typeof n.ackId==`string`&&s(t,JSON.stringify({type:`subscription-ack`,ackId:n.ackId}));return}if(e.type===`unsubscribe`){let n=e;if(!p(n.subjects)){c&&console.warn(`[ServerTransport] Malformed unsubscribe message: missing subjects record`);return}r.handleUnsubscribeMessage(t,n.subjects),await S(n,a,{debug:c,receiveContext:l,logContext:`dispatching unsubscribe`})&&typeof n.ackId==`string`&&s(t,JSON.stringify({type:`subscription-ack`,ackId:n.ackId}));return}if(e.type===`broadcast`){let n=e;if(typeof n.correlationId!=`string`||typeof n.subject!=`string`){c&&console.warn(`[ServerTransport] Malformed broadcast message: missing correlationId or subject`);return}let u=r.getInterestedClients(n.subject,n.payload,t),d=o(n.timeout);i.startClientBroadcast(t,n,u,s,d),await S(e,a,{debug:c,receiveContext:l});return}e.type===`event`&&r.forwardEventToClients(t,e,s),await S(e,a,{debug:c,receiveContext:l})}function _e(e,t){let{auth:n,registry:r,debug:i}=t;return async a=>{let o;try{o=JSON.parse(a.toString())}catch(e){i&&console.error(`[ServerTransport] Failed to parse message:`,e);return}let s=o&&typeof o==`object`?o:void 0;if(!s||typeof s.type!=`string`){i&&console.error(`[ServerTransport] Invalid message structure:`,o);return}let c=o;try{if(n?.handleAuthMessage(c,e))return;if(n&&r.isAuthenticating(e)){i&&console.warn(`[ServerTransport] Ignoring message from unauthenticated client`);return}if(n?.isSocketAuthenticated?.(e)===!1){i&&console.warn(`[ServerTransport] Closing socket with expired authentication`),n.cleanupSocket(e),e.close(1008,`Authentication expired`);return}await ge(c,e,t)}catch(e){i&&console.error(`[ServerTransport] Failed to process message:`,e)}}}function ve(e){return typeof e!=`number`||!Number.isFinite(e)||e<=0?5e3:Math.min(e,6e4)}async function ye(e,t){let{registry:n,correlations:r,broadcastAggregator:i,handlers:o,auth:s,serverSubscriptions:c,sendSafely:l,debug:u}=t;s&&n.addAuthenticating(e);let d=_e(e,{registry:n,correlations:r,broadcastAggregator:i,handlers:o,auth:s,normalizeBroadcastTimeout:ve,sendSafely:l,debug:u}),f=e=>{d(e.data)},p=()=>{s?.cleanupSocket(e),n.removeClient(e),e.removeEventListener(`message`,f),e.removeEventListener(`close`,p),e.removeEventListener(`error`,m),i.handleClientDisconnect(e),u&&console.info(`[ServerTransport] Client disconnected (${n.size} remaining)`)},m=e=>{u&&console.error(`[ServerTransport] Client socket error:`,e)};e.addEventListener(`message`,f),e.addEventListener(`close`,p),e.addEventListener(`error`,m);try{if(s&&(await s.authenticateServer(e,t=>{if(e.readyState!==1)throw Error(`Cannot send auth message: socket not ready (state: ${e.readyState})`);e.send(JSON.stringify(t))}),n.removeAuthenticating(e)),e.readyState!==1)return;if(n.addClient(e),c.size>0){let t=a(c);l(e,JSON.stringify(t))}l(e,JSON.stringify({type:`subscribe-sync-complete`})),u&&console.info(`[ServerTransport] Client connected (${n.size} total)`)}catch(t){u&&console.error(`[ServerTransport] Client authentication failed:`,t),e.close(1008,`Authentication failed`)}}async function be(e,t,n){let{registry:a,correlations:o}=n,s=`${e.namespace}.${e.subject}`,c=a.getReadyClients().map(t=>({client:t,priority:a.getRequestRoutingPriority(t,s,e.payload)})).sort((e,t)=>t.priority-e.priority).map(({client:e})=>e);if(c.length===0)throw new r(s);for(let[n,r]of c.entries()){let a=`${e.correlationId}:attempt-${n+1}`,c={...e,correlationId:a};try{r.send(JSON.stringify(c))}catch{continue}try{return await o.track(a,t)}catch(e){if(u(e,s)||e instanceof i)continue;throw e}}throw new r(s)}var C=class{name;wss;auth;debug;handlers=new Set;registry;serverSubscriptions=new Map;broadcastAggregator;correlations=new t;connectionListener=null;constructor(e){let{websocket:t,name:n=`websocket`,auth:r,debug:i=!1}=e;this.wss=t,this.name=n,this.auth=r,this.debug=i,this.registry=new me({debug:i}),this.broadcastAggregator=new pe({debug:i})}sendToClientSafely(e,t){try{e.send(t)}catch(e){this.debug&&console.warn(`[ServerTransport] Failed to send message to client:`,e)}}async connect(){if(this.connectionListener!==null)throw Error(`ServerTransport.connect() called while already connected`);this.connectionListener=e=>{ye(e,{registry:this.registry,correlations:this.correlations,broadcastAggregator:this.broadcastAggregator,handlers:this.handlers,auth:this.auth,serverSubscriptions:this.serverSubscriptions,sendSafely:(e,t)=>this.sendToClientSafely(e,t),debug:this.debug})},this.wss.on(`connection`,this.connectionListener),this.debug&&console.info(`[ServerTransport] Listening for connections`)}async disconnect(){this.connectionListener&&=(this.wss.off(`connection`,this.connectionListener),null);let e=this.registry.getAllSockets();for(let t of e)t.close();await new Promise((e,t)=>{this.wss.close(n=>n?t(n):e())}),this.correlations.cleanup(),this.broadcastAggregator.cleanup(),this.auth?.cleanup(),this.handlers.clear(),this.serverSubscriptions.clear(),this.debug&&console.info(`[ServerTransport] Disconnected`)}async send(e,t){if(e.type===`broadcast`){let n=c(e)??void 0,r=`payload`in e?e.payload:void 0,i=this.registry.getInterestedClients(n,r);return this.broadcastAggregator.startServerBroadcast(e,i,(e,t)=>{this.sendToClientSafely(e,t)},t)}if(e.type===`request`)return be(e,t??n,{registry:this.registry,correlations:this.correlations});if(this.registry.size===0){if(this.debug){let t=c(e);console.debug(`[ServerTransport] No clients to receive ${e.type}${t?`: ${t}`:``}`)}return!1}let r=c(e)??void 0,i=`payload`in e?e.payload:void 0,a=JSON.stringify(e),o=this.registry.getInterestedClients(r,i);for(let e of o)this.sendToClientSafely(e,a);let s=o.length>0;if(!s){if(r&&this.debug&&console.warn(`[ServerTransport] No interested clients for subject: ${r}`),e.type===`response`)return!1;if(!r)throw Error(`No connected clients available to receive message`)}return s}onReceive(e){return this.handlers.add(e),()=>{this.handlers.delete(e)}}cancelRequest(e,t){this.correlations.cancel(e,t)}onBroadcastResults(e,t,n){this.broadcastAggregator.handleNodeResults(e,t,n)}async subscribe(e,t,n=[]){let r=this.serverSubscriptions.get(e)?.filter,i=t??r;if(this.serverSubscriptions.set(e,{filter:i,priorities:n}),this.registry.size>0){let t=a(new Map([[e,{filter:i,priorities:n}]])),r=JSON.stringify(t);for(let e of this.registry.getReadyClients())this.sendToClientSafely(e,r)}}getConnectionCount(){return this.registry.getReadyClients().length}async unsubscribe(e){if(this.serverSubscriptions.delete(e),this.registry.size>0){let t=o({[e]:[]}),n=JSON.stringify(t);for(let e of this.registry.getReadyClients())this.sendToClientSafely(e,n)}}};function xe(e,t){let n=new Event(`close`);return Object.defineProperties(n,{code:{value:e??1e3,enumerable:!0},reason:{value:t??``,enumerable:!0}}),n}function Se(e){if(typeof e!=`object`||!e)throw TypeError(`WebSocket transport options must be an object`);let t=e;if(t.mode!==`client`&&t.mode!==`server`)throw TypeError(`WebSocket transport mode must be "client" or "server"`);if(t.mode===`client`){if(!Ce(t.websocket))throw TypeError(`WebSocket transport client mode requires a websocket with addEventListener/removeEventListener`);return}if(!we(t.websocket))throw TypeError(`WebSocket transport server mode requires a websocket with on/off listener methods`)}function Ce(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.send==`function`&&typeof t.close==`function`&&typeof t.addEventListener==`function`&&typeof t.removeEventListener==`function`}function we(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.on==`function`&&typeof t.off==`function`&&typeof t.close==`function`}var Te=class{secret;algorithm;challengeTimeout;identityId;resolveSecret;resolvePeer;pendingChallenge;pendingResult;queuedChallengeNonce;queuedResult;clientAuthComplete=!1;serverPendingResponses=new Map;serverAuthenticatedSockets=new Set;serverAuthenticatedPeers=new Map;constructor(e){this.secret=e.secret,this.algorithm=e.algorithm??`sha256`,this.challengeTimeout=e.challengeTimeout??5e3,this.identityId=e.identityId,this.resolveSecret=e.resolveSecret,this.resolvePeer=e.resolvePeer}async authenticateServer(e,t){let n=crypto.getRandomValues(new Uint8Array(32)),r=Array.from(n).map(e=>e.toString(16).padStart(2,`0`)).join(``),i=await this.computeHmac(r);t({type:`auth-challenge`,nonce:r});let a=!1;try{let{signature:n,identityId:o}=await this.waitForAuthResponseWithIdentity(e),s;if(this.resolveSecret&&o!==void 0){let i=this.resolveSecret(o);if(i===null)throw this.sendAuthResultBestEffort(t,{type:`auth-result`,success:!1,error:`Unknown identity`}),a=!0,Error(`HMAC authentication failed: Unknown identity '${o}'`);s=await this.computeHmacWithSecret(r,i),this.constantTimeEqual(n,s)&&this.serverAuthenticatedPeers.set(e,o)}else s=i;if(!this.constantTimeEqual(n,s))throw this.sendAuthResultBestEffort(t,{type:`auth-result`,success:!1,error:`Invalid signature`}),a=!0,Error(`HMAC authentication failed: Invalid signature`);this.serverAuthenticatedSockets.add(e),this.sendAuthResultBestEffort(t,{type:`auth-result`,success:!0}),a=!0}catch(n){let r=this.serverPendingResponses.has(e);throw this.serverPendingResponses.delete(e),!a&&r&&this.sendAuthResultBestEffort(t,{type:`auth-result`,success:!1,error:n instanceof Error?n.message:`Authentication failed`}),n}finally{this.serverPendingResponses.delete(e)}}async authenticateClient(e){this.clientAuthComplete=!1;let t=await this.waitForAuthChallenge();e({type:`auth-response`,signature:await this.computeHmac(t),...this.identityId!==void 0&&{identityId:this.identityId}});let n=await this.waitForAuthResult();if(!n.success)throw Error(`HMAC authentication failed: ${n.error??`Unknown error`}`);this.clientAuthComplete=!0}handleAuthMessage(e,t){if(typeof e!=`object`||!e||!(`type`in e)||typeof e.type!=`string`)return!1;let n=e;if(n.type===`auth-challenge`)return typeof n.nonce!=`string`||this.clientAuthComplete||(this.pendingChallenge?(clearTimeout(this.pendingChallenge.timeoutHandle),this.pendingChallenge.resolve(n.nonce),this.pendingChallenge=void 0):this.queuedChallengeNonce=n.nonce),!0;if(n.type===`auth-result`){if(typeof n.success!=`boolean`||this.clientAuthComplete)return!0;let e={success:n.success,error:n.error};return this.pendingResult?(clearTimeout(this.pendingResult.timeoutHandle),this.pendingResult.resolve(e),this.pendingResult=void 0):this.queuedResult=e,!0}if(n.type===`auth-response`){if(t){let e=this.serverPendingResponses.get(t);e&&(clearTimeout(e.timeoutHandle),e.resolve({signature:n.signature,identityId:n.identityId}))}return!0}return!1}async waitForAuthChallenge(){if(this.queuedChallengeNonce!==void 0){let e=this.queuedChallengeNonce;return this.queuedChallengeNonce=void 0,e}return new Promise((e,t)=>{let n=setTimeout(()=>{this.pendingChallenge=void 0,t(Error(`Authentication challenge timeout`))},this.challengeTimeout);this.pendingChallenge={resolve:e,reject:t,timeoutHandle:n}})}async waitForAuthResponseWithIdentity(e){return new Promise((t,n)=>{let r={resolve:t,reject:n,timeoutHandle:setTimeout(()=>{n(Error(`Authentication response timeout`))},this.challengeTimeout)};this.serverPendingResponses.set(e,r)})}async waitForAuthResult(){if(this.queuedResult!==void 0){let e=this.queuedResult;return this.queuedResult=void 0,e}return new Promise((e,t)=>{let n=setTimeout(()=>{this.pendingResult=void 0,t(Error(`Authentication result timeout`))},this.challengeTimeout);this.pendingResult={resolve:e,reject:t,timeoutHandle:n}})}async computeHmac(e){return this.computeHmacWithSecret(e,this.secret)}async computeHmacWithSecret(e,t){let n=new TextEncoder,r=n.encode(t),i=this.algorithm.replace(/^sha/,`SHA-`),a=await crypto.subtle.importKey(`raw`,r,{name:`HMAC`,hash:i},!1,[`sign`]),o=await crypto.subtle.sign(`HMAC`,a,n.encode(e));return Array.from(new Uint8Array(o)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}getReceiveContext(e){if(!e)return;let t=this.serverAuthenticatedPeers.get(e);if(t===void 0)return;let n=this.resolvePeer?.(t);if(this.resolvePeer!==void 0&&n===null)return;let r=n??{kind:`workflow-execution`,id:t};return{transportName:``,peer:{...r,id:r.id??t,authenticated:!0}}}isSocketAuthenticated(e){if(!this.serverAuthenticatedSockets.has(e))return!1;if(!this.resolveSecret)return!0;let t=this.serverAuthenticatedPeers.get(e);return t===void 0?!0:this.resolveSecret(t)===null?(this.cleanupSocket(e),!1):!0}constantTimeEqual(e,t){if(e.length!==t.length)return!1;let n=new Uint8Array(e.length/2),r=new Uint8Array(t.length/2);for(let i=0;i<n.length;i++)n[i]=parseInt(e.slice(i*2,i*2+2),16),r[i]=parseInt(t.slice(i*2,i*2+2),16);let i=0;for(let e=0;e<n.length;e++)i|=n[e]^r[e];return i===0}sendAuthResultBestEffort(e,t){try{e(t)}catch{}}cleanupSocket(e){let t=this.serverPendingResponses.get(e);t&&(clearTimeout(t.timeoutHandle),this.serverPendingResponses.delete(e),t.reject(Error(`Socket disconnected during HMAC authentication`))),this.serverAuthenticatedPeers.delete(e),this.serverAuthenticatedSockets.delete(e)}cleanup(){this.pendingChallenge&&=(clearTimeout(this.pendingChallenge.timeoutHandle),void 0),this.pendingResult&&=(clearTimeout(this.pendingResult.timeoutHandle),void 0),this.queuedChallengeNonce=void 0,this.queuedResult=void 0,this.clientAuthComplete=!1;for(let e of this.serverPendingResponses.values())clearTimeout(e.timeoutHandle);this.serverPendingResponses.clear(),this.serverAuthenticatedPeers.clear(),this.serverAuthenticatedSockets.clear()}};const w=new Map;function Ee(e,t,n={}){if(e.trim().length===0)throw Error(`registerHmacIdentitySecret requires a non-empty identityId`);if(t.length===0)throw Error(`registerHmacIdentitySecret requires a non-empty secret`);let r={secret:t,peerKind:n.peerKind?.trim()||`workflow-execution`};w.set(e,r);let i=!0;return()=>{i&&(i=!1,w.get(e)===r&&w.delete(e))}}function De(e){return w.get(e)?.secret??null}function Oe(e){let t=w.get(e);return t?{kind:t.peerKind,id:e,authenticated:!0}:null}function ke(){w.clear()}function T(e){let t=Array.from(e,e=>String.fromCharCode(e)).join(``);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=/g,``)}function E(e){let t=e.replace(/-/g,`+`).replace(/_/g,`/`),n=(4-t.length%4)%4;t+=`=`.repeat(n);let r=atob(t),i=new Uint8Array(r.length);for(let e=0;e<r.length;e++)i[e]=r.charCodeAt(e);return i}function D(e){return new TextEncoder().encode(e)}function O(e){return new TextDecoder().decode(e)}async function k(e){let t=await crypto.subtle.exportKey(`spki`,e);return T(new Uint8Array(t))}async function A(e){let t=await crypto.subtle.exportKey(`raw`,e);return T(new Uint8Array(t))}async function j(e,t,n=[]){let r=E(e);return crypto.subtle.importKey(`spki`,r,t,!0,n)}async function M(e,t,n=[]){let r=E(e);return crypto.subtle.importKey(`raw`,r,t,!0,n)}async function N(e){let t=await crypto.subtle.exportKey(`pkcs8`,e),n=T(new Uint8Array(t)).replace(/-/g,`+`).replace(/_/g,`/`),r=(4-n.length%4)%4;return n+=`=`.repeat(r),`-----BEGIN PRIVATE KEY-----\n${n.match(/.{1,64}/g)?.join(`
2
- `)??n}\n-----END PRIVATE KEY-----`}async function P(e,t,n){let r=E(e.replace(/-----BEGIN PRIVATE KEY-----/,``).replace(/-----END PRIVATE KEY-----/,``).replace(/\s/g,``).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=/g,``));return crypto.subtle.importKey(`pkcs8`,r,t,!0,n)}const F={name:`ECDH`,namedCurve:`P-256`};async function I(e=!0){return crypto.subtle.generateKey(F,e,[`deriveKey`,`deriveBits`])}async function L(e){return k(e)}async function Ae(e){return A(e)}async function je(e){return M(e,F)}async function R(e,t=[]){return j(e,F,t)}async function Me(e){return N(e)}async function Ne(e){return P(e,F,[`deriveKey`,`deriveBits`])}async function z(e,t){return crypto.subtle.deriveBits({name:`ECDH`,public:t},e,256)}async function B(e,t){let n=crypto.getRandomValues(new Uint8Array(12)),r=await crypto.subtle.encrypt({name:`AES-GCM`,iv:n},e,t);return{ciphertext:new Uint8Array(r),nonce:n}}async function V(e,t,n){let r=await crypto.subtle.decrypt({name:`AES-GCM`,iv:n},e,t);return new Uint8Array(r)}async function Pe(e){return crypto.subtle.importKey(`raw`,e,{name:`AES-GCM`},!1,[`encrypt`,`decrypt`])}async function H(e,t,n){let r=await crypto.subtle.importKey(`raw`,e,{name:`HKDF`},!1,[`deriveKey`]);return crypto.subtle.deriveKey({name:`HKDF`,hash:`SHA-256`,salt:t,info:D(n)},r,{name:`AES-GCM`,length:256},!1,[`encrypt`,`decrypt`])}const U={name:`ECDSA`,namedCurve:`P-256`};async function Fe(e=!0){return crypto.subtle.generateKey(U,e,[`sign`,`verify`])}async function W(e,t){let n=await crypto.subtle.sign({name:`ECDSA`,hash:{name:`SHA-256`}},e,t);return new Uint8Array(n)}async function G(e,t,n){return crypto.subtle.verify({name:`ECDSA`,hash:{name:`SHA-256`}},e,t,n)}async function Ie(e){return k(e)}async function Le(e){return j(e,U,[`verify`])}async function Re(e){return A(e)}async function ze(e){return M(e,U,[`verify`])}async function Be(e){return N(e)}async function Ve(e){return P(e,U,[`sign`])}var He=e({decodeText:()=>O,decrypt:()=>V,deriveSessionKey:()=>H,deriveSharedSecret:()=>z,encodeText:()=>D,encrypt:()=>B,exportPrivateKeyPEM:()=>Me,exportPublicKey:()=>L,exportPublicKeyRaw:()=>Ae,exportSigningPrivateKeyPEM:()=>Be,exportSigningPublicKey:()=>Ie,exportSigningPublicKeyRaw:()=>Re,fromBase64Url:()=>E,generateECDHKeyPair:()=>I,generateSigningKeyPair:()=>Fe,importAESKey:()=>Pe,importPrivateKeyPEM:()=>Ne,importPublicKey:()=>R,importPublicKeyRaw:()=>je,importSigningPrivateKeyPEM:()=>Ve,importSigningPublicKey:()=>Le,importSigningPublicKeyRaw:()=>ze,sign:()=>W,toBase64Url:()=>T,verify:()=>G});function K(e){let t=e.match(/.{1,2}/g);return new Uint8Array(t?.map(e=>parseInt(e,16))??[])}function q(e){return Array.from(e).map(e=>e.toString(16).padStart(2,`0`)).join(``)}async function J(e,t){let n=await I(!0),r=await L(n.publicKey);return{ephemeralKeyPair:n,ephemeralPublicKey:r,signature:q(await W(e,D(r+t)))}}function Ue(){return q(crypto.getRandomValues(new Uint8Array(16)))}async function Y(e,t,n,r){let i=D(t+r);return G(e,K(n),i)}async function X(e,t,n,r){return H(await z(e,await R(t)),K(n),r)}async function We(e,t,n,r){if(e===t)throw Error(`deriveRelaySaltHex: identityId must differ from peerId`);let[i,a]=e<t?[e,t]:[t,e],[o,s]=e<t?[n,r]:[r,n],c=D(`${i}${a}${o}${s}`),l=new Uint8Array(c).buffer,u=await crypto.subtle.digest(`SHA-256`,l);return q(new Uint8Array(u))}var Ge=class{signingKeyPair;identityId;peerId;getPeerSigningKey;timeout;pendingKeyExchange;pendingResult;clientSession;clientEphemeralKeyPair;serverPendingKeyExchange=new Map;serverSessions=new Map;serverEphemeralKeyPairs=new Map;constructor(e){this.signingKeyPair=e.signingKeyPair,this.identityId=e.identityId,this.peerId=e.peerId,this.getPeerSigningKey=e.getPeerSigningKey,this.timeout=e.timeout??1e4}async authenticateClient(e){if(!this.peerId)throw Error(`E2E authentication failed: peerId is required for client authentication`);let{ephemeralKeyPair:t,ephemeralPublicKey:n,signature:r}=await J(this.signingKeyPair.privateKey,this.identityId);this.clientEphemeralKeyPair=t;try{let i=this.waitForKeyExchangeResponse(),a=this.waitForAuthResult();e({type:`e2e-key-exchange`,deviceId:this.identityId,ephemeralPublicKey:n,signature:r});let o=await i,s=await this.getPeerSigningKey(this.peerId);if(!s)throw Error(`E2E authentication failed: Unknown server`);if(!await Y(s,o.ephemeralPublicKey,o.signature,this.peerId))throw Error(`E2E authentication failed: Invalid server signature`);let c=await X(t.privateKey,o.ephemeralPublicKey,o.salt,`makaio-e2e-session-v1`);this.clientSession={sessionKey:c,peerId:this.peerId};let l=await a;if(!l.success)throw Error(`E2E authentication failed: ${l.error??`Unknown error`}`)}catch(e){throw this.pendingKeyExchange&&=(clearTimeout(this.pendingKeyExchange.timeoutHandle),void 0),this.pendingResult&&=(clearTimeout(this.pendingResult.timeoutHandle),void 0),this.clientSession=void 0,this.clientEphemeralKeyPair=void 0,e}}async authenticateServer(e,t){try{let n=await this.waitForClientKeyExchange(e),r=await this.getPeerSigningKey(n.deviceId);if(!r)throw t({type:`e2e-auth-result`,success:!1,error:`Unknown device`}),Error(`E2E authentication failed: Unknown device ${n.deviceId}`);if(!await Y(r,n.ephemeralPublicKey,n.signature,n.deviceId))throw t({type:`e2e-auth-result`,success:!1,error:`Invalid signature`}),Error(`E2E authentication failed: Invalid client signature`);let{ephemeralKeyPair:i,ephemeralPublicKey:a,signature:o}=await J(this.signingKeyPair.privateKey,this.identityId),s=Ue();this.serverEphemeralKeyPairs.set(e,i),t({type:`e2e-key-exchange-response`,ephemeralPublicKey:a,signature:o,salt:s});let c=await X(i.privateKey,n.ephemeralPublicKey,s,`makaio-e2e-session-v1`);this.serverSessions.set(e,{sessionKey:c,peerId:n.deviceId}),t({type:`e2e-auth-result`,success:!0})}catch(n){throw this.serverPendingKeyExchange.delete(e),this.serverEphemeralKeyPairs.delete(e),t({type:`e2e-auth-result`,success:!1,error:n instanceof Error?n.message:`Authentication failed`}),n}finally{this.serverPendingKeyExchange.delete(e)}}handleAuthMessage(e,t){if(typeof e!=`object`||!e||!(`type`in e)||typeof e.type!=`string`)return!1;let n=e;if(n.type===`e2e-key-exchange-response`)return this.pendingKeyExchange&&=(clearTimeout(this.pendingKeyExchange.timeoutHandle),this.pendingKeyExchange.resolve({ephemeralPublicKey:n.ephemeralPublicKey,signature:n.signature,salt:n.salt}),void 0),!0;if(n.type===`e2e-auth-result`)return this.pendingResult&&=(clearTimeout(this.pendingResult.timeoutHandle),this.pendingResult.resolve({success:n.success,error:n.error}),void 0),!0;if(n.type===`e2e-key-exchange`&&t){let e=this.serverPendingKeyExchange.get(t);return e&&(clearTimeout(e.timeoutHandle),e.resolve({deviceId:n.deviceId,ephemeralPublicKey:n.ephemeralPublicKey,signature:n.signature})),!0}return!1}async waitForKeyExchangeResponse(){return new Promise((e,t)=>{let n=setTimeout(()=>{this.pendingKeyExchange=void 0,t(Error(`E2E key exchange timeout`))},this.timeout);this.pendingKeyExchange={resolve:e,reject:t,timeoutHandle:n}})}async waitForAuthResult(){return new Promise((e,t)=>{let n=setTimeout(()=>{this.pendingResult=void 0,t(Error(`E2E authentication result timeout`))},this.timeout);this.pendingResult={resolve:e,reject:t,timeoutHandle:n}})}async waitForClientKeyExchange(e){return new Promise((t,n)=>{let r={resolve:t,reject:n,timeoutHandle:setTimeout(()=>{this.serverPendingKeyExchange.delete(e),n(Error(`E2E key exchange timeout`))},this.timeout)};this.serverPendingKeyExchange.set(e,r)})}getSessionKey(e){return e?this.serverSessions.get(e)?.sessionKey??null:this.clientSession?.sessionKey??null}getPeerId(e){return e?this.serverSessions.get(e)?.peerId??null:this.clientSession?.peerId??null}getReceiveContext(e){let t=this.getPeerId(e);if(t!==null)return{transportName:``,peer:{kind:`e2e`,id:t,authenticated:!0,encrypted:!0}}}cleanupSocket(e){let t=this.serverPendingKeyExchange.get(e);t&&(clearTimeout(t.timeoutHandle),this.serverPendingKeyExchange.delete(e)),this.serverSessions.delete(e),this.serverEphemeralKeyPairs.delete(e)}cleanup(){this.pendingKeyExchange&&=(clearTimeout(this.pendingKeyExchange.timeoutHandle),void 0),this.pendingResult&&=(clearTimeout(this.pendingResult.timeoutHandle),void 0),this.clientSession=void 0,this.clientEphemeralKeyPair=void 0;for(let e of this.serverPendingKeyExchange.values())clearTimeout(e.timeoutHandle);this.serverPendingKeyExchange.clear(),this.serverSessions.clear(),this.serverEphemeralKeyPairs.clear()}};const Z=`E2E relay auth session aborted by reconnect`;var Ke=class{signingKeyPair;identityId;getPeerSigningKey;timeout;mode;blocking;pendingPeer;sessionKey;peerId;localEphemeral;localExchangeMessage;sentLocalExchange=!1;earlyPeer;sendAuthMessage;authGeneration=0;processingExchange=!1;constructor(e){this.signingKeyPair=e.signingKeyPair,this.identityId=e.identityId,this.getPeerSigningKey=e.getPeerSigningKey,this.timeout=e.timeout??1e4,this.mode=e.mode??`initiator`,this.blocking=e.blocking??!0}async authenticateClient(e){let t=this.sendAuthMessage===void 0?this.earlyPeer:void 0;this.cleanup();let n=this.authGeneration;if(this.earlyPeer=t,this.sendAuthMessage=e,this.mode===`initiator`){if(await this.ensureLocalExchangeMessage(),n!==this.authGeneration)throw Error(Z);this.sendLocalExchange()}if(!this.blocking){if(this.earlyPeer){let e=this.earlyPeer;this.earlyPeer=void 0,this.dispatchPeerExchange(e,n)}return}let r=await this.waitForPeerExchange();if(await this.processPeerExchange(r,n),n!==this.authGeneration||!this.sessionKey)throw Error(Z)}async authenticateServer(e,t){throw Error(`E2ERelayAuth does not support server authentication`)}handleAuthMessage(e){let t=e;return!t||t.type!==`e2e-relay-key-exchange`?!1:t.identityId===this.identityId?!0:this.pendingPeer?(this.pendingPeer.resolve(t),this.pendingPeer=void 0,!0):(this.earlyPeer=t,!this.blocking&&this.sendAuthMessage&&!this.sessionKey&&!this.processingExchange&&this.dispatchPeerExchange(t,this.authGeneration),!0)}cleanupSocket(e){}cleanup(){this.authGeneration++,this.pendingPeer&&=(this.pendingPeer.reject(Error(Z)),void 0),this.earlyPeer&&=void 0,this.sessionKey=void 0,this.peerId=void 0,this.localEphemeral=void 0,this.localExchangeMessage=void 0,this.sentLocalExchange=!1,this.processingExchange=!1,this.sendAuthMessage=void 0}dispatchPeerExchange(e,t){this.processingExchange=!0,this.processPeerExchange(e,t).catch(e=>{e instanceof Error&&e.message===Z||console.error(`[E2ERelayAuth] Peer exchange failed:`,e)}).finally(()=>{t===this.authGeneration&&(this.processingExchange=!1,this.retryQueuedPeerExchange(t))})}getSessionKey(){return this.sessionKey??null}getPeerId(){return this.peerId??null}getReceiveContext(){let e=this.getPeerId();if(e!==null)return{transportName:``,peer:{kind:`e2e`,id:e,authenticated:!0,encrypted:!0}}}async waitForPeerExchange(){if(this.earlyPeer){let e=this.earlyPeer;return this.earlyPeer=void 0,e}return new Promise((e,t)=>{let n=setTimeout(()=>{this.pendingPeer=void 0,t(Error(`E2E relay key exchange timeout`))},this.timeout),r=()=>{clearTimeout(n),this.pendingPeer=void 0};this.pendingPeer={resolve:t=>{r(),e(t)},reject:e=>{r(),t(e)},timeoutHandle:n}})}async ensureLocalExchangeMessage(){if(this.localExchangeMessage&&this.localEphemeral)return this.localExchangeMessage;let{ephemeralKeyPair:e,ephemeralPublicKey:t,signature:n}=await J(this.signingKeyPair.privateKey,this.identityId);return this.localEphemeral=e,this.localExchangeMessage={type:`e2e-relay-key-exchange`,identityId:this.identityId,ephemeralPublicKey:t,signature:n},this.localExchangeMessage}sendLocalExchange(e=!1){!this.sendAuthMessage||!this.localExchangeMessage||!e&&this.sentLocalExchange||(this.sendAuthMessage(this.localExchangeMessage),this.sentLocalExchange=!0)}retryQueuedPeerExchange(e){if(this.blocking||!this.sendAuthMessage||this.sessionKey||this.processingExchange||e!==this.authGeneration)return;let t=this.earlyPeer;t&&(this.earlyPeer=void 0,this.dispatchPeerExchange(t,e))}async processPeerExchange(e,t){if(!this.sendAuthMessage){this.earlyPeer=e;return}let n=await this.ensureLocalExchangeMessage();if(t!==this.authGeneration)return;let r=await this.getPeerSigningKey(e.identityId);if(!r)throw Error(`E2E relay authentication failed: Unknown peer ${e.identityId}`);if(!await Y(r,e.ephemeralPublicKey,e.signature,e.identityId))throw Error(`E2E relay authentication failed: Invalid peer signature`);let i=await We(this.identityId,e.identityId,n.ephemeralPublicKey,e.ephemeralPublicKey);if(!this.localEphemeral)throw Error(`E2E relay authentication failed: Local ephemeral key missing`);let a=await X(this.localEphemeral.privateKey,e.ephemeralPublicKey,i,`makaio-e2e-relay-v1`);t===this.authGeneration&&(this.sessionKey=a,this.peerId=e.identityId,this.mode===`initiator`?this.sendLocalExchange(!0):this.sendLocalExchange())}},qe=class{hmac;e2e;socketStrategy=new Map;pendingServerAuth=new Map;hmacCancelled=new Map;constructor(e){this.hmac=e.hmac,this.e2e=e.e2e}setE2EAuth(e){this.e2e=e}async authenticateClient(e){let t=this.hmac??this.e2e;if(!t)throw Error(`DispatchingAuth: no auth strategy configured`);return t.authenticateClient(e)}async authenticateServer(e,t){let n=this.resolveSingleStrategy();if(n)return n.authenticateServer(e,t);if(!this.hmac||!this.e2e)throw Error(`DispatchingAuth: no auth strategy configured`);let r={cancelled:!1};this.hmacCancelled.set(e,r);let i=this.hmac.authenticateServer(e,e=>{r.cancelled||t(e)});return new Promise((n,a)=>{this.pendingServerAuth.set(e,{resolve:n,reject:a,send:t}),i.then(n).catch(e=>{r.cancelled||a(e instanceof Error?e:Error(String(e)))})})}handleAuthMessage(e,t){if(!t)return(this.hmac??this.e2e)?.handleAuthMessage(e)??!1;let n=this.socketStrategy.get(t);if(n)return n.handleAuthMessage(e,t);let r=this.resolveStrategy(e),i=this.pendingServerAuth.get(t);return r?(this.socketStrategy.set(t,r),this.pendingServerAuth.delete(t),r===this.hmac?this.hmacCancelled.delete(t):(this.cancelHmac(t),i&&r.authenticateServer(t,i.send).then(i.resolve).catch(e=>{i.reject(e instanceof Error?e:Error(String(e)))})),r.handleAuthMessage(e,t)):(this.cancelHmac(t),i&&(this.pendingServerAuth.delete(t),i.reject(Error(`DispatchingAuth: unrecognised auth message type "${this.peekType(e)}" — no matching strategy`))),!1)}cleanupSocket(e){let t=this.socketStrategy.get(e);t&&(t.cleanupSocket(e),this.socketStrategy.delete(e)),this.cancelHmac(e);let n=this.pendingServerAuth.get(e);n&&(this.pendingServerAuth.delete(e),n.reject(Error(`DispatchingAuth: socket disconnected before auth type was determined`)))}cleanup(){this.hmac?.cleanup(),this.e2e?.cleanup(),this.socketStrategy.clear();for(let e of this.pendingServerAuth.values())e.reject(Error(`DispatchingAuth: cleanup called before authentication completed`));this.pendingServerAuth.clear(),this.hmacCancelled.clear()}peekType(e){if(typeof e!=`object`||!e||!(`type`in e))return;let{type:t}=e;return typeof t==`string`?t:void 0}resolveSingleStrategy(){if(this.hmac&&!this.e2e)return this.hmac;if(this.e2e&&!this.hmac)return this.e2e}resolveStrategy(e){let t=this.peekType(e);if(t){if(t===`e2e-key-exchange`&&this.e2e)return this.e2e;if(t===`auth-response`&&this.hmac)return this.hmac}}cancelHmac(e){let t=this.hmacCancelled.get(e);t&&(t.cancelled=!0,this.hmacCancelled.delete(e),this.hmac?.cleanupSocket(e))}};function Je(e){return`payload`in e}async function Ye(e,t,n){if(e.type!==`response`||e.result===void 0||e.error!==void 0)return;let{ciphertext:r,nonce:i}=await B(n,D(JSON.stringify(e.result)));t.result=T(r),t.e2e={nonce:T(i),v:1}}async function Xe(e,t,n){if(e.type!==`broadcast-response`||e.results===void 0||e.error!==void 0)return;let{ciphertext:r,nonce:i}=await B(n,D(JSON.stringify(e.results)));t.results=T(r),t.e2e={nonce:T(i),v:1}}async function Ze(e,t,n){if(!Je(e)||e.payload===void 0)return;let{ciphertext:r,nonce:i}=await B(n,D(JSON.stringify(e.payload)));t.payload=T(r),t.e2e={nonce:T(i),v:1}}async function Qe(e,t,n){if(e.type!==`response`&&e.type!==`broadcast-response`||e.error===void 0)return;let{ciphertext:r,nonce:i}=await B(n,D(JSON.stringify(e.error)));t.error=T(r),t.e2e={nonce:T(i),v:1}}async function $e(e,t,n,r){if(!Je(e)||typeof e.payload!=`string`)return;let i=O(await V(n,E(e.payload),r));t.payload=JSON.parse(i)}async function et(e,t,n,r){if(e.type!==`response`||typeof e.result!=`string`)return;let i=O(await V(n,E(e.result),r));t.result=JSON.parse(i)}async function tt(e,t,n,r){if(e.type!==`broadcast-response`||typeof e.results!=`string`)return;let i=O(await V(n,E(e.results),r));t.results=JSON.parse(i)}async function nt(e,t,n,r){if(e.type!==`response`&&e.type!==`broadcast-response`||typeof e.error!=`string`)return;let i=O(await V(n,E(e.error),r));t.error=JSON.parse(i)}async function rt(e,t){let n={...e};return await Ze(e,n,t),await Ye(e,n,t),await Xe(e,n,t),await Qe(e,n,t),n}async function it(e,t){if(!e.e2e)return e;let n={...e};delete n.e2e;let r=E(e.e2e.nonce);return await $e(e,n,t,r),await et(e,n,t,r),await tt(e,n,t,r),await nt(e,n,t,r),n}function at(e){return e.type===`subscription-ack`&&typeof e.ackId==`string`}function ot(e){let{e2eAuth:t,websocket:n,...r}=e,i=new b({...r,url:`<pre-connected>`,createWebSocket:()=>n,auth:t,autoReconnect:!1,messageTransform:async e=>{let n=t.getSessionKey();if(!n||at(e))return e;let r=e;if(!r.e2e)throw Error(`Received plaintext message on E2E-encrypted channel — possible injection`);return it(r,n)}});async function a(e,n){let r=t.getSessionKey();if(!r)throw Error(`E2E session key not available - authentication may have failed`);let a=await rt(e,r);return i.send(a,n)}return{name:i.name,connect:i.connect.bind(i),disconnect:i.disconnect.bind(i),send:a,cancelRequest:i.cancelRequest.bind(i),onReceive:i.onReceive.bind(i),subscribe:i.subscribe.bind(i),unsubscribe:i.unsubscribe.bind(i),getSubscriptions:i.getSubscriptions.bind(i)}}function st(e){return ot(e)}function ct(e){if(!e||typeof e!=`object`)return!1;let t=e;if(t.type!==`e2e-relay-envelope`||typeof t.payload!=`string`)return!1;let n=t.e2e;return!!n&&typeof n.nonce==`string`&&typeof n.v==`number`}async function lt(e,t){let{ciphertext:n,nonce:r}=await B(t,D(JSON.stringify(e)));return{type:`e2e-relay-envelope`,payload:T(n),e2e:{nonce:T(r),v:1}}}async function ut(e,t){let n=E(e.e2e.nonce),r=O(await V(t,E(e.payload),n));return JSON.parse(r)}function dt(e){let t=()=>{if(!e.isFrozen())throw Error(`RelayControlRegistry must be frozen before processing relay control messages`)};function n(t){return typeof t.namespace!=`string`||typeof t.subject!=`string`||!e.isControlEvent(t.namespace,t.subject)||typeof t.messageId!=`string`?!1:t.payload!==void 0}function r(t){return typeof t.namespace!=`string`||typeof t.subject!=`string`||!e.isControlRequest(t.namespace,t.subject)||typeof t.messageId!=`string`||typeof t.correlationId!=`string`?!1:t.payload!==void 0}function i(e){if(t(),!e||typeof e!=`object`)return!1;let i=e;return i.type===`event`?n(i):i.type===`request`?r(i):!1}function a(e){if(t(),!e||typeof e!=`object`)return!1;let n=e;return n.type!==`relay-control`||n.v!==1||!n.payload||typeof n.payload!=`object`?!1:i(n.payload)}function o(e){if(t(),!i(e))throw Error(`Invalid relay control message`);return{type:`relay-control`,v:1,payload:e}}return{createRelayControlEnvelope:o,isRelayControlEnvelopeMessage:a,isRelayControlBusMessage:i}}function Q(e){let t=Date.now()-3e5;for(let[n,r]of e)r>=t||e.delete(n);for(;e.size>2048;){let t=e.keys().next().value;if(!t)break;e.delete(t)}}const ft=e=>{if(!e||typeof e!=`object`)return!1;let t=e;return t.type===`response`&&typeof t.correlationId==`string`},pt=e=>e.type===`subscribe`||e.type===`unsubscribe`,mt=e=>{if(!e||typeof e!=`object`)return!1;let t=e;return t.type===`subscription-ack`&&typeof t.ackId==`string`};function $(e,t,n,r){if(!r.isFrozen())throw Error(`E2ERelay transport requires a frozen relay control registry`);let{createRelayControlEnvelope:i,isRelayControlEnvelopeMessage:a,isRelayControlBusMessage:o}=dt(r),s=e=>{n.delete(e),n.set(e,Date.now()),Q(n)};return{encode:async t=>{if(o(t))return t.type===`request`&&s(t.correlationId),JSON.stringify(i(t));if(Q(n),t.type===`response`&&n.has(t.correlationId))return n.delete(t.correlationId),JSON.stringify(t);let r=e.getSessionKey();if(!r&&pt(t)||!r&&mt(t))return JSON.stringify(t);if(!r)throw Error(`E2E relay session not established`);let a=await lt(t,r);return JSON.stringify(a)},decode:async r=>{let i=e.getSessionKey();if(a(r)){let e=r.payload;return t&&console.info(`[E2ERelayTransport] Decoded relay control envelope:`,e.type,e.namespace,e.subject),e.type===`request`&&s(e.correlationId),e}if(Q(n),ft(r)&&n.has(r.correlationId))return n.delete(r.correlationId),r;if(!i&&mt(r))return r;if(!i)throw Error(`E2E relay session not established`);if(!ct(r))throw Error(`Received plaintext message on relay E2E channel — possible injection`);return ut(r,i)}}}function ht(e,t,n=!1){let r=new Map;return{codec:$(e,n,r,t),reset:()=>r.clear()}}function gt(e){let{e2eAuth:t,registry:n,websocket:r,...i}=e,a=e.debug??!1,o=new Map,s=$(t,a,o,n);a&&console.info(`[E2ERelayTransport] Creating inner transport...`);let c=new b({...i,url:`<pre-connected>`,createWebSocket:()=>r,auth:t,codec:s,autoReconnect:!1});return a&&console.info(`[E2ERelayTransport] Inner transport created`),{name:c.name,connect:async()=>{if(!n.isFrozen())throw Error(`E2ERelayClientTransport: registry must be frozen before connect()`);o.clear();try{await c.connect()}catch(e){throw o.clear(),e}},disconnect:async()=>{o.clear();try{await c.disconnect()}finally{o.clear()}},send:c.send.bind(c),cancelRequest:c.cancelRequest.bind(c),onReceive:(...e)=>(a&&console.info(`[E2ERelayTransport] onReceive called, delegating to inner transport`),c.onReceive(...e)),subscribe:c.subscribe.bind(c),unsubscribe:c.unsubscribe.bind(c),getSubscriptions:c.getSubscriptions.bind(c),isReady:()=>!!t.getSessionKey()&&c.isReady()}}function _t(){let e=!1,t=new Map,n=new Map,r=()=>{if(e)throw Error(`RelayControlRegistry is frozen and cannot be modified`)};return{registerEventSubjects(e,n){r();let i=t.get(e)??new Set;for(let e of n)i.add(e);t.set(e,i)},registerRequestNamespace(e,t){if(r(),t.length===0)throw Error(`RelayControlRegistry request namespace "${e}" requires at least one subject`);let i=n.get(e)??new Set;for(let e of t)i.add(e);n.set(e,i)},freeze(){e=!0},isFrozen(){return e},isControlEvent(e,n){return t.get(e)?.has(n)??!1},isControlRequest(e,t){return n.get(e)?.has(t)??!1}}}function vt(e){if(Se(e),e.mode===`client`){if(e.connectionOptions!==void 0)throw Error(`createWebSocketTransport(client) does not support connectionOptions when wrapping a pre-created WebSocket. Use WebSocketClientTransport for reconnect or dial-time socket options.`);let t=e.websocket;return new b({url:`<pre-connected>`,createWebSocket:()=>t,auth:e.auth,debug:e.debug,autoReconnect:!1})}else return new C({websocket:e.websocket,auth:e.auth,debug:e.debug})}export{qe as DispatchingAuth,Ge as E2EAuth,Ke as E2ERelayAuth,Te as HmacAuth,C as ServerTransport,b as WebSocketClientTransport,ke as clearHmacIdentitySecretsForTesting,st as createE2EClientTransport,gt as createE2ERelayClientTransport,ht as createE2ERelayCodec,dt as createRelayControlHelpers,_t as createRelayControlRegistry,xe as createWebSocketCloseEvent,vt as createWebSocketTransport,He as crypto,h as extractSocketErrorMessage,Ee as registerHmacIdentitySecret,Oe as resolveHmacIdentityPeer,De as resolveHmacIdentitySecret};
1
+ import{r as e}from"../../chunk-DTipWd-i.mjs";import{ConnectionLostError as t,CorrelationTracker as n,DEFAULT_REQUEST_TIMEOUT_MS as r,NoHandlerError as i,TimeoutError as a,buildSubscribeMessage as o,buildUnsubscribeMessage as s,deserializeTransportError as c,getSubjectFromBusMessage as l,handleCorrelationResponse as u,isNoHandlerErrorForSubject as d,shouldReceiveMessage as f,trackMessageCorrelation as p}from"@makaio/framework/bus";import{isRecord as m}from"@makaio/framework/utils";const h={baseMs:1e3,maxMs:1e4};function ee(e,t,n){let r=Math.max(t,100),i=Math.max(n,r);return Math.min(r*2**e,i)}function te(e,t){return new Promise(n=>{if(t.aborted){n();return}let r=()=>{clearTimeout(i),t.removeEventListener(`abort`,r),n()},i=setTimeout(()=>{t.removeEventListener(`abort`,r),n()},e);t.addEventListener(`abort`,r)})}const ne={encode:async e=>JSON.stringify(e),decode:async e=>e};function re(e){return e===!1?!1:{baseMs:e?.baseMs??h.baseMs,maxMs:e?.maxMs??h.maxMs}}function ie(e,t=`unknown error`){return`message`in e?String(e.message):t}async function g(e,t,n){let r=await t.encode(e);n.send(r)}function ae(e){return e.readyState===1?Promise.resolve():e.readyState>=2?Promise.reject(Error(`WebSocket closed before opening`)):new Promise((t,n)=>{let r=()=>{e.removeEventListener(`open`,i),e.removeEventListener(`error`,a),e.removeEventListener(`close`,o)},i=()=>{r(),t()},a=e=>{r(),n(Error(`WebSocket connection failed — ${ie(e)}`))},o=()=>{r(),n(Error(`WebSocket closed before opening`))};e.addEventListener(`open`,i),e.addEventListener(`error`,a),e.addEventListener(`close`,o)})}async function oe(e,t,n){let r=await Promise.allSettled(Array.from(t).map(t=>t(e,n.receiveContext)));for(let e of r)e.status===`rejected`&&n.debug&&console.error(`[WebSocketClientTransport:${n.name}] Handler error:`,e.reason);return r.every(e=>e.status===`fulfilled`)}function se(e,t){return{...t?.getReceiveContext?.(),transportName:e}}async function ce(e,t){let{name:n,debug:r,auth:i,codec:a,messageTransform:o,correlations:s}=t,c=JSON.parse(e.toString());if(typeof c!=`object`||!c||typeof c.type!=`string`)return r&&console.error(`[WebSocketClientTransport:${n}] Invalid message structure:`,c),null;let l=c;if(i?.handleAuthMessage(l)||l.type===`heartbeat`)return null;let d=await a.decode(l);return o&&(d=await o(d)),d.type===`heartbeat`?null:d.type===`subscribe-sync-complete`?(t.onSyncComplete(),null):d.type===`subscription-ack`?(typeof d.ackId==`string`&&t.onSubscriptionAck(d.ackId),null):u(d,s)?null:d}async function le(e,t){let{name:n,debug:r,auth:i,handlers:a}=t,o=null;try{o=await ce(e,t)}catch(e){r&&console.error(`[WebSocketClientTransport:${n}] Failed to parse message:`,e);return}if(o===null)return;let s=se(n,i),c=o;oe(c,a,{debug:r,name:n,receiveContext:s}).then(async e=>{e&&(c.type===`subscribe`||c.type===`unsubscribe`)&&typeof c.ackId==`string`&&await t.sendSubscriptionAck(c.ackId)}).catch(e=>{r&&console.error(`[WebSocketClientTransport:${n}] Handler dispatch error:`,e)})}async function _(e){await Promise.allSettled(e.inFlightMessages),e.correlations.rejectAll(new t(e.name))}function ue(e,t){let n=n=>{let r=le(n.data,{name:t.name,debug:t.debug,auth:t.auth,codec:t.codec,messageTransform:t.messageTransform,correlations:t.correlations,handlers:t.handlers,onSyncComplete:()=>{t.resolveReady()},onSubscriptionAck:e=>{t.resolveSubscriptionAck(e)},sendSubscriptionAck:async n=>{e.readyState===1&&await g({type:`subscription-ack`,ackId:n},t.codec,e)}}).finally(()=>{t.inFlightMessages.delete(r)});t.inFlightMessages.add(r)};t.setMessageListener(n),e.addEventListener(`message`,n)}function v(e,t){let n=t.getMessageListener();n!==null&&(e.removeEventListener(`message`,n),t.setMessageListener(null));let r=t.getCloseListener();r!==null&&(e.removeEventListener(`close`,r),t.setCloseListener(null))}async function y(e){await _(e),e.inFlightMessages.clear(),e.resolveReady(),e.rejectPendingSubscriptionAcks(Error(`WebSocketClientTransport: reconnecting before subscription ack`)),e.resetReadyPromise();let t=e.getSocket();t!==null&&v(t,e);let n=await e.wsFactory(e.url);e.setSocket(n),e.setAuthComplete(!1);try{ue(n,e),await ae(n),e.auth&&await e.auth.authenticateClient(e=>{if(n.readyState!==1)throw Error(`WebSocketClientTransport: cannot send auth message — socket not open`);n.send(JSON.stringify(e))}),e.setAuthComplete(!0),e.debug&&console.info(`[WebSocketClientTransport:${e.name}] Connected to ${e.url}`),e.localSubscriptions.size>0&&(await g(o(e.localSubscriptions),e.codec,n),e.debug&&console.info(`[WebSocketClientTransport:${e.name}] Replayed ${e.localSubscriptions.size} subscription(s)`)),e.notifyConnected()}catch(t){let r=e.getSocket()===n;throw r&&e.auth?.cleanup(),v(n,e),r&&e.setSocket(null),e.setAuthComplete(!1),r&&(n.readyState===0||n.readyState===1)&&n.close(),t}}function b(e,t){return new Promise(n=>{if(e.readyState===3||t.aborted){n();return}let r=()=>{t.removeEventListener(`abort`,i),n()},i=()=>{e.removeEventListener(`close`,r),n()};e.addEventListener(`close`,r),t.addEventListener(`abort`,i)})}async function de(e,t,n,r,i){i(!0);try{for(;!e.aborted;){let i=n.getSocket(),a=i!==null;if(i!==null&&i.readyState!==3&&await b(i,e),e.aborted)break;a&&(await _(n),n.debug&&console.info(`[WebSocketClientTransport:${n.name}] ${new Date().toISOString()} Connection lost, starting reconnect loop (maxMs=${t.maxMs})`),n.notifyDisconnected());let o=0;for(;!e.aborted;){let i=ee(o,t.baseMs,t.maxMs);n.debug&&console.info(`[WebSocketClientTransport:${n.name}] ${new Date().toISOString()} Reconnecting in ${i}ms (attempt ${o+1})`);let a=new AbortController;if(r(a),await te(i,AbortSignal.any([e,a.signal])),r(null),e.aborted)break;try{await y(n),o=0;let t=n.getSocket();if(t!==null){let r=async()=>{await _(n),n.auth?.cleanup(),n.setAuthComplete(!1),n.debug&&console.info(`[WebSocketClientTransport:${n.name}] ${new Date().toISOString()} Connection closed`),n.rejectPendingSubscriptionAcks(Error(`WebSocketClientTransport: disconnected before subscription ack`))};n.setCloseListener(r),t.addEventListener(`close`,r),await b(t,e)}break}catch(e){if(n.debug){let t=e instanceof Error?e.message:String(e);console.warn(`[WebSocketClientTransport:${n.name}] ${new Date().toISOString()} Connect attempt ${o+1} failed: ${t}`)}o++}}}}finally{i(!1)}}function fe(e,t,n){let r=async()=>{await _(t),t.auth?.cleanup(),v(e,t),t.setAuthComplete(!1),t.setSocket(null),n(),t.resolveReady(),t.rejectPendingSubscriptionAcks(Error(`WebSocketClientTransport: disconnected before subscription ack`)),t.notifyDisconnected()};t.setCloseListener(r),e.addEventListener(`close`,r)}async function pe(e,t,n,r){let i=r.localSubscriptions.get(e)?.filter,a=t??i;if(r.localSubscriptions.set(e,{filter:a,priorities:n}),r.socket!==null&&r.socket.readyState===1){let t=r.beginSubscriptionAck?.(),i=o(new Map([[e,{filter:a,priorities:n}]]),t?.ackId);try{await g(i,r.codec,r.socket),await t?.promise}catch(e){throw t?.reject(e),e}}r.debug&&console.info(`[WebSocketClientTransport:${r.name}] Subscribed to ${e}${a?` with filter`:``}`)}async function me(e,t){let n=t.localSubscriptions.get(e);if(t.localSubscriptions.delete(e),t.socket!==null&&t.socket.readyState===1){let r=t.beginSubscriptionAck?.(),i=s({[e]:n?.priorities??[]},r?.ackId);try{await g(i,t.codec,t.socket),await r?.promise}catch(e){throw r?.reject(e),e}}t.debug&&console.info(`[WebSocketClientTransport:${t.name}] Unsubscribed from ${e}`)}var x=class{name;url;auth;codec;messageTransform;autoReconnectConfig;wsFactory;debug;onConnectedCallback;onDisconnectedCallback;socket=null;authComplete=!1;correlations=new n;handlers=new Set;localSubscriptions=new Map;pendingSubscriptionAcks=new Map;subscriptionAckSeq=0;messageListener=null;closeListener=null;reconnectAbort=null;inFlightMessages=new Set;backoffWakeAbort=null;reconnectLoopRunning=!1;readyResolve=null;ready;onNewReadySession=void 0;onConnected=void 0;onDisconnected=void 0;constructor(e){this.url=e.url,this.name=e.name??`ws-client`,this.auth=e.auth,this.codec=e.codec??ne,this.messageTransform=e.messageTransform,this.debug=e.debug??!1,this.autoReconnectConfig=re(e.autoReconnect),this.wsFactory=e.createWebSocket??this.defaultWsFactory,this.onConnectedCallback=e.onConnected,this.onDisconnectedCallback=e.onDisconnected,this.ready=new Promise(e=>{this.readyResolve=e})}async connect(){if(this.reconnectAbort!==null)throw Error(`WebSocketClientTransport: already connected`);let e=new AbortController;this.reconnectAbort=e;try{await y(this.connectionDeps())}catch(e){throw this.reconnectAbort=null,e}this.autoReconnectConfig===!1?this.socket!==null&&this.wireNoReconnectClose(this.socket):this.startReconnectLoop(e.signal)}async disconnect(){let e=this.reconnectAbort;if(this.reconnectAbort=null,e?.abort(),this.readyResolve?.(),this.readyResolve=null,this.socket!==null){v(this.socket,this.connectionDeps());let e=this.socket;this.socket=null,this.authComplete=!1,(e.readyState===0||e.readyState===1)&&e.close()}this.correlations.cleanup(),this.rejectPendingSubscriptionAcks(Error(`WebSocketClientTransport: disconnected before subscription ack`)),this.auth?.cleanup(),this.handlers.clear(),this.debug&&console.info(`[WebSocketClientTransport:${this.name}] Disconnected`)}async send(e,t){if(this.socket===null||this.socket.readyState!==1)throw Error(`WebSocketClientTransport: not connected`);let n=await this.codec.encode(e);return this.socket.send(n),p(e,this.correlations,t??r)}onReceive(e){return this.handlers.add(e),()=>{this.handlers.delete(e)}}async subscribe(e,t,n=[]){await pe(e,t,n,this.subscriptionDeps())}async unsubscribe(e){await me(e,this.subscriptionDeps())}getSubscriptions(){return new Set(this.localSubscriptions.keys())}cancelRequest(e,t){this.correlations.cancel(e,t)}isReady(){return this.socket!==null&&this.socket.readyState===1&&this.authComplete}async reconnect(){if(!this.isReady()){if(this.backoffWakeAbort!==null){this.backoffWakeAbort.abort(),this.backoffWakeAbort=null;return}if(this.autoReconnectConfig!==!1){if(this.reconnectLoopRunning)return;this.reconnectAbort!==null&&this.startReconnectLoop(this.reconnectAbort.signal);return}try{await y(this.connectionDeps()),this.socket!==null&&(this.reconnectAbort=new AbortController,this.wireNoReconnectClose(this.socket))}catch{}}}startReconnectLoop(e){return de(e,this.autoReconnectConfig,this.connectionDeps(),e=>{this.backoffWakeAbort=e},e=>{this.reconnectLoopRunning=e})}subscriptionDeps(){return{name:this.name,debug:this.debug,codec:this.codec,socket:this.socket,localSubscriptions:this.localSubscriptions,beginSubscriptionAck:()=>this.beginSubscriptionAck()}}beginSubscriptionAck(){let e=`${this.name}:sub:${++this.subscriptionAckSeq}`,t,n,r=new Promise((e,r)=>{t=e,n=r});r.catch(()=>void 0);let i=t=>{this.pendingSubscriptionAcks.has(e)&&(this.pendingSubscriptionAcks.delete(e),t())};return this.pendingSubscriptionAcks.set(e,{resolve:()=>i(t),reject:e=>i(()=>n(e))}),{ackId:e,promise:r,reject:t=>this.rejectSubscriptionAck(e,t)}}resolveSubscriptionAck(e){this.pendingSubscriptionAcks.get(e)?.resolve()}rejectSubscriptionAck(e,t){this.pendingSubscriptionAcks.get(e)?.reject(t)}rejectPendingSubscriptionAcks(e){for(let t of this.pendingSubscriptionAcks.keys())this.rejectSubscriptionAck(t,e)}connectionDeps(){return{name:this.name,debug:this.debug,auth:this.auth,codec:this.codec,messageTransform:this.messageTransform,correlations:this.correlations,handlers:this.handlers,localSubscriptions:this.localSubscriptions,wsFactory:this.wsFactory,url:this.url,getSocket:()=>this.socket,setSocket:e=>{this.socket=e},setAuthComplete:e=>{this.authComplete=e},getMessageListener:()=>this.messageListener,setMessageListener:e=>{this.messageListener=e},getCloseListener:()=>this.closeListener,setCloseListener:e=>{this.closeListener=e},resolveReady:()=>{this.readyResolve?.(),this.readyResolve=null},resetReadyPromise:()=>{this.ready=new Promise(e=>{this.readyResolve=e}),this.onNewReadySession?.(this.ready)},resolveSubscriptionAck:e=>{this.resolveSubscriptionAck(e)},rejectPendingSubscriptionAcks:e=>{this.rejectPendingSubscriptionAcks(e)},notifyConnected:()=>{this.onConnectedCallback?.(),this.onConnected?.()},notifyDisconnected:()=>{this.onDisconnectedCallback?.(),this.onDisconnected?.()},inFlightMessages:this.inFlightMessages}}defaultWsFactory=async e=>new(await(import(`ws`))).WebSocket(e);wireNoReconnectClose(e){fe(e,this.connectionDeps(),()=>{this.reconnectAbort=null})}};function S(e){e.timer!==void 0&&clearTimeout(e.timer)}var he=class{pendingBroadcasts=new Map;timeout;debug;constructor(e={}){this.timeout=e.timeout??5e3,this.debug=e.debug??!1}startClientBroadcast(e,t,n,r,i){let a=t.correlationId,o=i??this.timeout,s={kind:`client`,sender:e,results:[],pendingClients:new Set(n),nodeResultsReceived:!1,timer:o===0?void 0:setTimeout(()=>{this.debug&&console.warn(`[BroadcastAggregator] Broadcast ${a} timed out`),this.finalizeBroadcast(a)},o)};this.pendingBroadcasts.set(a,s);let c=JSON.stringify(t);for(let e of n)r(e,c);this.debug&&console.info(`[BroadcastAggregator] Broadcast ${a} forwarded to ${n.length} clients`)}startServerBroadcast(e,t,n,r){let i=e.correlationId,a=r??this.timeout;return t.length===0?(this.debug&&console.info(`[BroadcastAggregator] Server broadcast ${i} - no target clients`),Promise.resolve([])):new Promise(r=>{let o={kind:`server`,results:[],pendingClients:new Set(t),timer:a===0?void 0:setTimeout(()=>{this.debug&&console.warn(`[BroadcastAggregator] Server broadcast ${i} timed out`),this.finalizeServerBroadcast(i)},a),resolve:r};this.pendingBroadcasts.set(i,o);let s=JSON.stringify(e);for(let e of t)n(e,s);this.debug&&console.info(`[BroadcastAggregator] Server broadcast ${i} sent to ${t.length} clients`)})}handleResponse(e,t){let n=this.pendingBroadcasts.get(t.correlationId);return n?(t.results&&n.results.push(...t.results),n.pendingClients.delete(e),this.debug&&console.info(`[BroadcastAggregator] Broadcast ${t.correlationId} got response, ${n.pendingClients.size} pending`),this.checkBroadcastComplete(t.correlationId,n),!0):!1}handleNodeResults(e,t,n){let r=this.pendingBroadcasts.get(e);return!r||r.kind!==`client`?!1:(r.results.push(...t),r.nodeResultsReceived=!0,r.nodeError=n,this.debug&&console.info(`[BroadcastAggregator] Broadcast ${e} node results aggregated${n?` (with error)`:``}`),this.checkBroadcastComplete(e,r),!0)}handleClientDisconnect(e){for(let[t,n]of this.pendingBroadcasts)n.kind===`client`&&n.sender===e?(S(n),this.pendingBroadcasts.delete(t)):n.pendingClients.has(e)&&(n.pendingClients.delete(e),this.checkBroadcastComplete(t,n))}cleanup(){for(let e of this.pendingBroadcasts.values())S(e),e.kind===`server`&&e.resolve(e.results);this.pendingBroadcasts.clear()}checkBroadcastComplete(e,t){if(!(t.pendingClients.size>0))if(t.kind===`client`){if(!t.nodeResultsReceived)return;this.finalizeBroadcast(e)}else this.finalizeServerBroadcast(e)}finalizeBroadcast(e){let t=this.pendingBroadcasts.get(e);if(!t||t.kind!==`client`)return;S(t),this.pendingBroadcasts.delete(e);let n=t.nodeError?{type:`broadcast-response`,correlationId:e,error:t.nodeError}:{type:`broadcast-response`,correlationId:e,results:t.results};t.sender.readyState===1&&t.sender.send(JSON.stringify(n)),this.debug&&console.info(`[BroadcastAggregator] Broadcast ${e} finalized with ${t.results.length} results`)}finalizeServerBroadcast(e){let t=this.pendingBroadcasts.get(e);!t||t.kind!==`server`||(S(t),this.pendingBroadcasts.delete(e),t.resolve(t.results),this.debug&&console.info(`[BroadcastAggregator] Server broadcast ${e} finalized with ${t.results.length} results`))}},ge=class{clients=new Set;authenticatingClients=new Set;clientSubscriptions=new Map;clientFilters=new Map;debug;constructor(e={}){this.debug=e.debug??!1}addAuthenticating(e){this.authenticatingClients.add(e)}removeAuthenticating(e){this.authenticatingClients.delete(e)}isAuthenticating(e){return this.authenticatingClients.has(e)}addClient(e){this.clients.add(e)}removeClient(e){this.clients.delete(e),this.authenticatingClients.delete(e),this.clientSubscriptions.delete(e),this.clientFilters.delete(e),this.debug&&console.info(`[ClientRegistry] Client removed (${this.clients.size} remaining)`)}get size(){return this.clients.size}getAllSockets(){return new Set([...this.clients,...this.authenticatingClients])}handleSubscribeMessage(e,t){let n=this.clientSubscriptions.get(e);n||(n=new Set,this.clientSubscriptions.set(e,n));let r=this.clientFilters.get(e);for(let[i]of Object.entries(t.subjects)){n.add(i);let a=t.filters?.[i];a===void 0?r?.delete(i):(r||(r=new Map,this.clientFilters.set(e,r)),r.set(i,a))}if(this.debug){let e=Object.keys(t.subjects).length,n=t.filters?Object.keys(t.filters).length:0;console.info(`[ClientRegistry] Client subscribed to ${e} subjects, ${n} filters`)}}handleUnsubscribeMessage(e,t){let n=this.clientSubscriptions.get(e),r=this.clientFilters.get(e);for(let e of Object.keys(t))n?.delete(e),r?.delete(e);this.debug&&console.info(`[ClientRegistry] Client unsubscribed from ${Object.keys(t).length} subjects`)}getReadyClients(){let e=[];for(let t of this.clients)t.readyState===1&&e.push(t);return e}getRequestRoutingPriority(e,t,n){let r=this.clientSubscriptions.get(e);return!r||r.size===0?1:this.clientWantsMessage(e,t,n)?2:0}getInterestedClients(e,t,n){let r=[];for(let i of this.clients)i!==n&&i.readyState===1&&this.clientWantsMessage(i,e,t)&&r.push(i);return r}forwardEventToClients(e,t,n){let r=l(t)??void 0,i=`payload`in t?t.payload:void 0,a=JSON.stringify(t),o=this.getInterestedClients(r,i,e);for(let e of o)n(e,a)}clientWantsMessage(e,t,n){return f(t,n,this.clientSubscriptions.get(e)??new Set,this.clientFilters.get(e)??new Map)}};async function C(e,t,n){let r=await Promise.allSettled(Array.from(t).map(t=>t(e,n.receiveContext)));for(let e of r)if(e.status===`rejected`&&n.debug){let t=n.logContext?` ${n.logContext}`:``;console.error(`[ServerTransport] Handler error${t}:`,e.reason)}return r.every(e=>e.status===`fulfilled`)}function _e(e,t,n){let{correlations:r,broadcastAggregator:i,debug:a}=t;if(e.type===`heartbeat`)return!0;if(e.type===`response`){let t=e;return typeof t.correlationId==`string`?(t.error?r.reject(t.correlationId,c(t.error)):r.resolve(t.correlationId,t.result),!0):(a&&console.warn(`[ServerTransport] Malformed response message: missing correlationId`),!0)}if(e.type===`broadcast-response`){let t=e;return typeof t.correlationId==`string`?(i.handleResponse(n,t),!0):(a&&console.warn(`[ServerTransport] Malformed broadcast-response: missing correlationId`),!0)}return!1}async function ve(e,t,n){let{registry:r,broadcastAggregator:i,handlers:a,normalizeBroadcastTimeout:o,sendSafely:s,debug:c}=n;if(_e(e,n,t))return;let l=n.auth?.getReceiveContext?.(t);if(e.type===`subscribe`){let n=e;if(!m(n.subjects)){c&&console.warn(`[ServerTransport] Malformed subscribe message: missing subjects record`);return}r.handleSubscribeMessage(t,n),await C(n,a,{debug:c,receiveContext:l,logContext:`dispatching subscribe`})&&typeof n.ackId==`string`&&s(t,JSON.stringify({type:`subscription-ack`,ackId:n.ackId}));return}if(e.type===`unsubscribe`){let n=e;if(!m(n.subjects)){c&&console.warn(`[ServerTransport] Malformed unsubscribe message: missing subjects record`);return}r.handleUnsubscribeMessage(t,n.subjects),await C(n,a,{debug:c,receiveContext:l,logContext:`dispatching unsubscribe`})&&typeof n.ackId==`string`&&s(t,JSON.stringify({type:`subscription-ack`,ackId:n.ackId}));return}if(e.type===`broadcast`){let n=e;if(typeof n.correlationId!=`string`||typeof n.subject!=`string`){c&&console.warn(`[ServerTransport] Malformed broadcast message: missing correlationId or subject`);return}let u=r.getInterestedClients(n.subject,n.payload,t),d=o(n.timeout);i.startClientBroadcast(t,n,u,s,d),await C(e,a,{debug:c,receiveContext:l});return}e.type===`event`&&r.forwardEventToClients(t,e,s),await C(e,a,{debug:c,receiveContext:l})}function ye(e,t){let{auth:n,registry:r,debug:i}=t;return async a=>{let o;try{o=JSON.parse(a.toString())}catch(e){i&&console.error(`[ServerTransport] Failed to parse message:`,e);return}let s=o&&typeof o==`object`?o:void 0;if(!s||typeof s.type!=`string`){i&&console.error(`[ServerTransport] Invalid message structure:`,o);return}let c=o;try{if(n?.handleAuthMessage(c,e))return;if(n&&r.isAuthenticating(e)){i&&console.warn(`[ServerTransport] Ignoring message from unauthenticated client`);return}if(n?.isSocketAuthenticated?.(e)===!1){i&&console.warn(`[ServerTransport] Closing socket with expired authentication`),n.cleanupSocket(e),e.close(1008,`Authentication expired`);return}await ve(c,e,t)}catch(e){i&&console.error(`[ServerTransport] Failed to process message:`,e)}}}function be(e){return typeof e!=`number`||!Number.isFinite(e)||e<=0?5e3:Math.min(e,6e4)}async function xe(e,t){let{registry:n,correlations:r,broadcastAggregator:i,handlers:a,auth:s,serverSubscriptions:c,sendSafely:l,debug:u}=t;s&&n.addAuthenticating(e);let d=ye(e,{registry:n,correlations:r,broadcastAggregator:i,handlers:a,auth:s,normalizeBroadcastTimeout:be,sendSafely:l,debug:u}),f=e=>{d(e.data)},p=()=>{s?.cleanupSocket(e),n.removeClient(e),e.removeEventListener(`message`,f),e.removeEventListener(`close`,p),e.removeEventListener(`error`,m),i.handleClientDisconnect(e),u&&console.info(`[ServerTransport] Client disconnected (${n.size} remaining)`)},m=e=>{u&&console.error(`[ServerTransport] Client socket error:`,e)};e.addEventListener(`message`,f),e.addEventListener(`close`,p),e.addEventListener(`error`,m);try{if(s&&(await s.authenticateServer(e,t=>{if(e.readyState!==1)throw Error(`Cannot send auth message: socket not ready (state: ${e.readyState})`);e.send(JSON.stringify(t))}),n.removeAuthenticating(e)),e.readyState!==1)return;if(n.addClient(e),c.size>0){let t=o(c);l(e,JSON.stringify(t))}l(e,JSON.stringify({type:`subscribe-sync-complete`})),u&&console.info(`[ServerTransport] Client connected (${n.size} total)`)}catch(t){u&&console.error(`[ServerTransport] Client authentication failed:`,t),e.close(1008,`Authentication failed`)}}async function Se(e,t,n){let{registry:r,correlations:o}=n,s=`${e.namespace}.${e.subject}`,c=r.getReadyClients().map(t=>({client:t,priority:r.getRequestRoutingPriority(t,s,e.payload)})).sort((e,t)=>t.priority-e.priority).map(({client:e})=>e);if(c.length===0)throw new i(s);for(let[n,r]of c.entries()){let i=`${e.correlationId}:attempt-${n+1}`,c={...e,correlationId:i};try{r.send(JSON.stringify(c))}catch{continue}try{return await o.track(i,t)}catch(e){if(d(e,s)||e instanceof a)continue;throw e}}throw new i(s)}var w=class{name;wss;auth;debug;handlers=new Set;registry;serverSubscriptions=new Map;broadcastAggregator;correlations=new n;connectionListener=null;constructor(e){let{websocket:t,name:n=`websocket`,auth:r,debug:i=!1}=e;this.wss=t,this.name=n,this.auth=r,this.debug=i,this.registry=new ge({debug:i}),this.broadcastAggregator=new he({debug:i})}sendToClientSafely(e,t){try{e.send(t)}catch(e){this.debug&&console.warn(`[ServerTransport] Failed to send message to client:`,e)}}async connect(){if(this.connectionListener!==null)throw Error(`ServerTransport.connect() called while already connected`);this.connectionListener=e=>{xe(e,{registry:this.registry,correlations:this.correlations,broadcastAggregator:this.broadcastAggregator,handlers:this.handlers,auth:this.auth,serverSubscriptions:this.serverSubscriptions,sendSafely:(e,t)=>this.sendToClientSafely(e,t),debug:this.debug})},this.wss.on(`connection`,this.connectionListener),this.debug&&console.info(`[ServerTransport] Listening for connections`)}async disconnect(){this.connectionListener&&=(this.wss.off(`connection`,this.connectionListener),null);let e=this.registry.getAllSockets();for(let t of e)t.close();await new Promise((e,t)=>{this.wss.close(n=>n?t(n):e())}),this.correlations.cleanup(),this.broadcastAggregator.cleanup(),this.auth?.cleanup(),this.handlers.clear(),this.serverSubscriptions.clear(),this.debug&&console.info(`[ServerTransport] Disconnected`)}async send(e,t){if(e.type===`broadcast`){let n=l(e)??void 0,r=`payload`in e?e.payload:void 0,i=this.registry.getInterestedClients(n,r);return this.broadcastAggregator.startServerBroadcast(e,i,(e,t)=>{this.sendToClientSafely(e,t)},t)}if(e.type===`request`)return Se(e,t??r,{registry:this.registry,correlations:this.correlations});if(this.registry.size===0){if(this.debug){let t=l(e);console.debug(`[ServerTransport] No clients to receive ${e.type}${t?`: ${t}`:``}`)}return!1}let n=l(e)??void 0,i=`payload`in e?e.payload:void 0,a=JSON.stringify(e),o=this.registry.getInterestedClients(n,i);for(let e of o)this.sendToClientSafely(e,a);let s=o.length>0;if(!s){if(n&&this.debug&&console.warn(`[ServerTransport] No interested clients for subject: ${n}`),e.type===`response`)return!1;if(!n)throw Error(`No connected clients available to receive message`)}return s}onReceive(e){return this.handlers.add(e),()=>{this.handlers.delete(e)}}cancelRequest(e,t){this.correlations.cancel(e,t)}onBroadcastResults(e,t,n){this.broadcastAggregator.handleNodeResults(e,t,n)}async subscribe(e,t,n=[]){let r=this.serverSubscriptions.get(e)?.filter,i=t??r;if(this.serverSubscriptions.set(e,{filter:i,priorities:n}),this.registry.size>0){let t=o(new Map([[e,{filter:i,priorities:n}]])),r=JSON.stringify(t);for(let e of this.registry.getReadyClients())this.sendToClientSafely(e,r)}}getConnectionCount(){return this.registry.getReadyClients().length}async unsubscribe(e){if(this.serverSubscriptions.delete(e),this.registry.size>0){let t=s({[e]:[]}),n=JSON.stringify(t);for(let e of this.registry.getReadyClients())this.sendToClientSafely(e,n)}}};function Ce(e,t){let n=new Event(`close`);return Object.defineProperties(n,{code:{value:e??1e3,enumerable:!0},reason:{value:t??``,enumerable:!0}}),n}function we(e){if(typeof e!=`object`||!e)throw TypeError(`WebSocket transport options must be an object`);let t=e;if(t.mode!==`client`&&t.mode!==`server`)throw TypeError(`WebSocket transport mode must be "client" or "server"`);if(t.mode===`client`){if(!Te(t.websocket))throw TypeError(`WebSocket transport client mode requires a websocket with addEventListener/removeEventListener`);return}if(!Ee(t.websocket))throw TypeError(`WebSocket transport server mode requires a websocket with on/off listener methods`)}function Te(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.send==`function`&&typeof t.close==`function`&&typeof t.addEventListener==`function`&&typeof t.removeEventListener==`function`}function Ee(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.on==`function`&&typeof t.off==`function`&&typeof t.close==`function`}var De=class{secret;algorithm;challengeTimeout;identityId;resolveSecret;resolvePeer;pendingChallenge;pendingResult;queuedChallengeNonce;queuedResult;clientAuthComplete=!1;serverPendingResponses=new Map;serverAuthenticatedSockets=new Set;serverAuthenticatedPeers=new Map;constructor(e){this.secret=e.secret,this.algorithm=e.algorithm??`sha256`,this.challengeTimeout=e.challengeTimeout??5e3,this.identityId=e.identityId,this.resolveSecret=e.resolveSecret,this.resolvePeer=e.resolvePeer}async authenticateServer(e,t){let n=crypto.getRandomValues(new Uint8Array(32)),r=Array.from(n).map(e=>e.toString(16).padStart(2,`0`)).join(``),i=await this.computeHmac(r);t({type:`auth-challenge`,nonce:r});let a=!1;try{let{signature:n,identityId:o}=await this.waitForAuthResponseWithIdentity(e),s;if(this.resolveSecret&&o!==void 0){let i=this.resolveSecret(o);if(i===null)throw this.sendAuthResultBestEffort(t,{type:`auth-result`,success:!1,error:`Unknown identity`}),a=!0,Error(`HMAC authentication failed: Unknown identity '${o}'`);s=await this.computeHmacWithSecret(r,i),this.constantTimeEqual(n,s)&&this.serverAuthenticatedPeers.set(e,o)}else s=i;if(!this.constantTimeEqual(n,s))throw this.sendAuthResultBestEffort(t,{type:`auth-result`,success:!1,error:`Invalid signature`}),a=!0,Error(`HMAC authentication failed: Invalid signature`);this.serverAuthenticatedSockets.add(e),this.sendAuthResultBestEffort(t,{type:`auth-result`,success:!0}),a=!0}catch(n){let r=this.serverPendingResponses.has(e);throw this.serverPendingResponses.delete(e),!a&&r&&this.sendAuthResultBestEffort(t,{type:`auth-result`,success:!1,error:n instanceof Error?n.message:`Authentication failed`}),n}finally{this.serverPendingResponses.delete(e)}}async authenticateClient(e){this.clientAuthComplete=!1;let t=await this.waitForAuthChallenge();e({type:`auth-response`,signature:await this.computeHmac(t),...this.identityId!==void 0&&{identityId:this.identityId}});let n=await this.waitForAuthResult();if(!n.success)throw Error(`HMAC authentication failed: ${n.error??`Unknown error`}`);this.clientAuthComplete=!0}handleAuthMessage(e,t){if(typeof e!=`object`||!e||!(`type`in e)||typeof e.type!=`string`)return!1;let n=e;if(n.type===`auth-challenge`)return typeof n.nonce!=`string`||this.clientAuthComplete||(this.pendingChallenge?(clearTimeout(this.pendingChallenge.timeoutHandle),this.pendingChallenge.resolve(n.nonce),this.pendingChallenge=void 0):this.queuedChallengeNonce=n.nonce),!0;if(n.type===`auth-result`){if(typeof n.success!=`boolean`||this.clientAuthComplete)return!0;let e={success:n.success,error:n.error};return this.pendingResult?(clearTimeout(this.pendingResult.timeoutHandle),this.pendingResult.resolve(e),this.pendingResult=void 0):this.queuedResult=e,!0}if(n.type===`auth-response`){if(t){let e=this.serverPendingResponses.get(t);e&&(clearTimeout(e.timeoutHandle),e.resolve({signature:n.signature,identityId:n.identityId}))}return!0}return!1}async waitForAuthChallenge(){if(this.queuedChallengeNonce!==void 0){let e=this.queuedChallengeNonce;return this.queuedChallengeNonce=void 0,e}return new Promise((e,t)=>{let n=setTimeout(()=>{this.pendingChallenge=void 0,t(Error(`Authentication challenge timeout`))},this.challengeTimeout);this.pendingChallenge={resolve:e,reject:t,timeoutHandle:n}})}async waitForAuthResponseWithIdentity(e){return new Promise((t,n)=>{let r={resolve:t,reject:n,timeoutHandle:setTimeout(()=>{n(Error(`Authentication response timeout`))},this.challengeTimeout)};this.serverPendingResponses.set(e,r)})}async waitForAuthResult(){if(this.queuedResult!==void 0){let e=this.queuedResult;return this.queuedResult=void 0,e}return new Promise((e,t)=>{let n=setTimeout(()=>{this.pendingResult=void 0,t(Error(`Authentication result timeout`))},this.challengeTimeout);this.pendingResult={resolve:e,reject:t,timeoutHandle:n}})}async computeHmac(e){return this.computeHmacWithSecret(e,this.secret)}async computeHmacWithSecret(e,t){let n=new TextEncoder,r=n.encode(t),i=this.algorithm.replace(/^sha/,`SHA-`),a=await crypto.subtle.importKey(`raw`,r,{name:`HMAC`,hash:i},!1,[`sign`]),o=await crypto.subtle.sign(`HMAC`,a,n.encode(e));return Array.from(new Uint8Array(o)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}getReceiveContext(e){if(!e)return;let t=this.serverAuthenticatedPeers.get(e);if(t===void 0)return;let n=this.resolvePeer?.(t);if(this.resolvePeer!==void 0&&n===null)return;let r=n??{kind:`workflow-execution`,id:t};return{transportName:``,peer:{...r,id:r.id??t,authenticated:!0}}}isSocketAuthenticated(e){if(!this.serverAuthenticatedSockets.has(e))return!1;if(!this.resolveSecret)return!0;let t=this.serverAuthenticatedPeers.get(e);return t===void 0?!0:this.resolveSecret(t)===null?(this.cleanupSocket(e),!1):!0}constantTimeEqual(e,t){if(e.length!==t.length)return!1;let n=new Uint8Array(e.length/2),r=new Uint8Array(t.length/2);for(let i=0;i<n.length;i++)n[i]=parseInt(e.slice(i*2,i*2+2),16),r[i]=parseInt(t.slice(i*2,i*2+2),16);let i=0;for(let e=0;e<n.length;e++)i|=n[e]^r[e];return i===0}sendAuthResultBestEffort(e,t){try{e(t)}catch{}}cleanupSocket(e){let t=this.serverPendingResponses.get(e);t&&(clearTimeout(t.timeoutHandle),this.serverPendingResponses.delete(e),t.reject(Error(`Socket disconnected during HMAC authentication`))),this.serverAuthenticatedPeers.delete(e),this.serverAuthenticatedSockets.delete(e)}cleanup(){this.pendingChallenge&&=(clearTimeout(this.pendingChallenge.timeoutHandle),void 0),this.pendingResult&&=(clearTimeout(this.pendingResult.timeoutHandle),void 0),this.queuedChallengeNonce=void 0,this.queuedResult=void 0,this.clientAuthComplete=!1;for(let e of this.serverPendingResponses.values())clearTimeout(e.timeoutHandle);this.serverPendingResponses.clear(),this.serverAuthenticatedPeers.clear(),this.serverAuthenticatedSockets.clear()}};const T=new Map;function Oe(e,t,n={}){if(e.trim().length===0)throw Error(`registerHmacIdentitySecret requires a non-empty identityId`);if(t.length===0)throw Error(`registerHmacIdentitySecret requires a non-empty secret`);let r={secret:t,peerKind:n.peerKind?.trim()||`workflow-execution`};T.set(e,r);let i=!0;return()=>{i&&(i=!1,T.get(e)===r&&T.delete(e))}}function ke(e){return T.get(e)?.secret??null}function Ae(e){let t=T.get(e);return t?{kind:t.peerKind,id:e,authenticated:!0}:null}function je(){T.clear()}function E(e){let t=Array.from(e,e=>String.fromCharCode(e)).join(``);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=/g,``)}function D(e){let t=e.replace(/-/g,`+`).replace(/_/g,`/`),n=(4-t.length%4)%4;t+=`=`.repeat(n);let r=atob(t),i=new Uint8Array(r.length);for(let e=0;e<r.length;e++)i[e]=r.charCodeAt(e);return i}function O(e){return new TextEncoder().encode(e)}function k(e){return new TextDecoder().decode(e)}async function A(e){let t=await crypto.subtle.exportKey(`spki`,e);return E(new Uint8Array(t))}async function j(e){let t=await crypto.subtle.exportKey(`raw`,e);return E(new Uint8Array(t))}async function M(e,t,n=[]){let r=D(e);return crypto.subtle.importKey(`spki`,r,t,!0,n)}async function N(e,t,n=[]){let r=D(e);return crypto.subtle.importKey(`raw`,r,t,!0,n)}async function P(e){let t=await crypto.subtle.exportKey(`pkcs8`,e),n=E(new Uint8Array(t)).replace(/-/g,`+`).replace(/_/g,`/`),r=(4-n.length%4)%4;return n+=`=`.repeat(r),`-----BEGIN PRIVATE KEY-----\n${n.match(/.{1,64}/g)?.join(`
2
+ `)??n}\n-----END PRIVATE KEY-----`}async function F(e,t,n){let r=D(e.replace(/-----BEGIN PRIVATE KEY-----/,``).replace(/-----END PRIVATE KEY-----/,``).replace(/\s/g,``).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=/g,``));return crypto.subtle.importKey(`pkcs8`,r,t,!0,n)}const I={name:`ECDH`,namedCurve:`P-256`};async function L(e=!0){return crypto.subtle.generateKey(I,e,[`deriveKey`,`deriveBits`])}async function R(e){return A(e)}async function Me(e){return j(e)}async function Ne(e){return N(e,I)}async function z(e,t=[]){return M(e,I,t)}async function Pe(e){return P(e)}async function Fe(e){return F(e,I,[`deriveKey`,`deriveBits`])}async function B(e,t){return crypto.subtle.deriveBits({name:`ECDH`,public:t},e,256)}async function V(e,t){let n=crypto.getRandomValues(new Uint8Array(12)),r=await crypto.subtle.encrypt({name:`AES-GCM`,iv:n},e,t);return{ciphertext:new Uint8Array(r),nonce:n}}async function H(e,t,n){let r=await crypto.subtle.decrypt({name:`AES-GCM`,iv:n},e,t);return new Uint8Array(r)}async function Ie(e){return crypto.subtle.importKey(`raw`,e,{name:`AES-GCM`},!1,[`encrypt`,`decrypt`])}async function U(e,t,n){let r=await crypto.subtle.importKey(`raw`,e,{name:`HKDF`},!1,[`deriveKey`]);return crypto.subtle.deriveKey({name:`HKDF`,hash:`SHA-256`,salt:t,info:O(n)},r,{name:`AES-GCM`,length:256},!1,[`encrypt`,`decrypt`])}const W={name:`ECDSA`,namedCurve:`P-256`};async function Le(e=!0){return crypto.subtle.generateKey(W,e,[`sign`,`verify`])}async function G(e,t){let n=await crypto.subtle.sign({name:`ECDSA`,hash:{name:`SHA-256`}},e,t);return new Uint8Array(n)}async function K(e,t,n){return crypto.subtle.verify({name:`ECDSA`,hash:{name:`SHA-256`}},e,t,n)}async function Re(e){return A(e)}async function ze(e){return M(e,W,[`verify`])}async function Be(e){return j(e)}async function Ve(e){return N(e,W,[`verify`])}async function He(e){return P(e)}async function Ue(e){return F(e,W,[`sign`])}var We=e({decodeText:()=>k,decrypt:()=>H,deriveSessionKey:()=>U,deriveSharedSecret:()=>B,encodeText:()=>O,encrypt:()=>V,exportPrivateKeyPEM:()=>Pe,exportPublicKey:()=>R,exportPublicKeyRaw:()=>Me,exportSigningPrivateKeyPEM:()=>He,exportSigningPublicKey:()=>Re,exportSigningPublicKeyRaw:()=>Be,fromBase64Url:()=>D,generateECDHKeyPair:()=>L,generateSigningKeyPair:()=>Le,importAESKey:()=>Ie,importPrivateKeyPEM:()=>Fe,importPublicKey:()=>z,importPublicKeyRaw:()=>Ne,importSigningPrivateKeyPEM:()=>Ue,importSigningPublicKey:()=>ze,importSigningPublicKeyRaw:()=>Ve,sign:()=>G,toBase64Url:()=>E,verify:()=>K});function Ge(e){let t=e.match(/.{1,2}/g);return new Uint8Array(t?.map(e=>parseInt(e,16))??[])}function q(e){return Array.from(e).map(e=>e.toString(16).padStart(2,`0`)).join(``)}async function J(e,t){let n=await L(!0),r=await R(n.publicKey);return{ephemeralKeyPair:n,ephemeralPublicKey:r,signature:q(await G(e,O(r+t)))}}function Ke(){return q(crypto.getRandomValues(new Uint8Array(16)))}async function Y(e,t,n,r){let i=O(t+r);return K(e,Ge(n),i)}async function X(e,t,n,r){return U(await B(e,await z(t)),Ge(n),r)}async function qe(e,t,n,r){if(e===t)throw Error(`deriveRelaySaltHex: identityId must differ from peerId`);let[i,a]=e<t?[e,t]:[t,e],[o,s]=e<t?[n,r]:[r,n],c=O(`${i}${a}${o}${s}`),l=new Uint8Array(c).buffer,u=await crypto.subtle.digest(`SHA-256`,l);return q(new Uint8Array(u))}var Je=class{signingKeyPair;identityId;peerId;getPeerSigningKey;timeout;pendingKeyExchange;pendingResult;clientSession;clientEphemeralKeyPair;serverPendingKeyExchange=new Map;serverSessions=new Map;serverEphemeralKeyPairs=new Map;constructor(e){this.signingKeyPair=e.signingKeyPair,this.identityId=e.identityId,this.peerId=e.peerId,this.getPeerSigningKey=e.getPeerSigningKey,this.timeout=e.timeout??1e4}async authenticateClient(e){if(!this.peerId)throw Error(`E2E authentication failed: peerId is required for client authentication`);let{ephemeralKeyPair:t,ephemeralPublicKey:n,signature:r}=await J(this.signingKeyPair.privateKey,this.identityId);this.clientEphemeralKeyPair=t;try{let i=this.waitForKeyExchangeResponse(),a=this.waitForAuthResult();e({type:`e2e-key-exchange`,deviceId:this.identityId,ephemeralPublicKey:n,signature:r});let o=await i,s=await this.getPeerSigningKey(this.peerId);if(!s)throw Error(`E2E authentication failed: Unknown server`);if(!await Y(s,o.ephemeralPublicKey,o.signature,this.peerId))throw Error(`E2E authentication failed: Invalid server signature`);let c=await X(t.privateKey,o.ephemeralPublicKey,o.salt,`makaio-e2e-session-v1`);this.clientSession={sessionKey:c,peerId:this.peerId};let l=await a;if(!l.success)throw Error(`E2E authentication failed: ${l.error??`Unknown error`}`)}catch(e){throw this.pendingKeyExchange&&=(clearTimeout(this.pendingKeyExchange.timeoutHandle),void 0),this.pendingResult&&=(clearTimeout(this.pendingResult.timeoutHandle),void 0),this.clientSession=void 0,this.clientEphemeralKeyPair=void 0,e}}async authenticateServer(e,t){try{let n=await this.waitForClientKeyExchange(e),r=await this.getPeerSigningKey(n.deviceId);if(!r)throw t({type:`e2e-auth-result`,success:!1,error:`Unknown device`}),Error(`E2E authentication failed: Unknown device ${n.deviceId}`);if(!await Y(r,n.ephemeralPublicKey,n.signature,n.deviceId))throw t({type:`e2e-auth-result`,success:!1,error:`Invalid signature`}),Error(`E2E authentication failed: Invalid client signature`);let{ephemeralKeyPair:i,ephemeralPublicKey:a,signature:o}=await J(this.signingKeyPair.privateKey,this.identityId),s=Ke();this.serverEphemeralKeyPairs.set(e,i),t({type:`e2e-key-exchange-response`,ephemeralPublicKey:a,signature:o,salt:s});let c=await X(i.privateKey,n.ephemeralPublicKey,s,`makaio-e2e-session-v1`);this.serverSessions.set(e,{sessionKey:c,peerId:n.deviceId}),t({type:`e2e-auth-result`,success:!0})}catch(n){throw this.serverPendingKeyExchange.delete(e),this.serverEphemeralKeyPairs.delete(e),t({type:`e2e-auth-result`,success:!1,error:n instanceof Error?n.message:`Authentication failed`}),n}finally{this.serverPendingKeyExchange.delete(e)}}handleAuthMessage(e,t){if(typeof e!=`object`||!e||!(`type`in e)||typeof e.type!=`string`)return!1;let n=e;if(n.type===`e2e-key-exchange-response`)return this.pendingKeyExchange&&=(clearTimeout(this.pendingKeyExchange.timeoutHandle),this.pendingKeyExchange.resolve({ephemeralPublicKey:n.ephemeralPublicKey,signature:n.signature,salt:n.salt}),void 0),!0;if(n.type===`e2e-auth-result`)return this.pendingResult&&=(clearTimeout(this.pendingResult.timeoutHandle),this.pendingResult.resolve({success:n.success,error:n.error}),void 0),!0;if(n.type===`e2e-key-exchange`&&t){let e=this.serverPendingKeyExchange.get(t);return e&&(clearTimeout(e.timeoutHandle),e.resolve({deviceId:n.deviceId,ephemeralPublicKey:n.ephemeralPublicKey,signature:n.signature})),!0}return!1}async waitForKeyExchangeResponse(){return new Promise((e,t)=>{let n=setTimeout(()=>{this.pendingKeyExchange=void 0,t(Error(`E2E key exchange timeout`))},this.timeout);this.pendingKeyExchange={resolve:e,reject:t,timeoutHandle:n}})}async waitForAuthResult(){return new Promise((e,t)=>{let n=setTimeout(()=>{this.pendingResult=void 0,t(Error(`E2E authentication result timeout`))},this.timeout);this.pendingResult={resolve:e,reject:t,timeoutHandle:n}})}async waitForClientKeyExchange(e){return new Promise((t,n)=>{let r={resolve:t,reject:n,timeoutHandle:setTimeout(()=>{this.serverPendingKeyExchange.delete(e),n(Error(`E2E key exchange timeout`))},this.timeout)};this.serverPendingKeyExchange.set(e,r)})}getSessionKey(e){return e?this.serverSessions.get(e)?.sessionKey??null:this.clientSession?.sessionKey??null}getPeerId(e){return e?this.serverSessions.get(e)?.peerId??null:this.clientSession?.peerId??null}getReceiveContext(e){let t=this.getPeerId(e);if(t!==null)return{transportName:``,peer:{kind:`e2e`,id:t,authenticated:!0,encrypted:!0}}}cleanupSocket(e){let t=this.serverPendingKeyExchange.get(e);t&&(clearTimeout(t.timeoutHandle),this.serverPendingKeyExchange.delete(e)),this.serverSessions.delete(e),this.serverEphemeralKeyPairs.delete(e)}cleanup(){this.pendingKeyExchange&&=(clearTimeout(this.pendingKeyExchange.timeoutHandle),void 0),this.pendingResult&&=(clearTimeout(this.pendingResult.timeoutHandle),void 0),this.clientSession=void 0,this.clientEphemeralKeyPair=void 0;for(let e of this.serverPendingKeyExchange.values())clearTimeout(e.timeoutHandle);this.serverPendingKeyExchange.clear(),this.serverSessions.clear(),this.serverEphemeralKeyPairs.clear()}};const Z=`E2E relay auth session aborted by reconnect`;var Ye=class{signingKeyPair;identityId;getPeerSigningKey;timeout;mode;blocking;pendingPeer;sessionKey;peerId;localEphemeral;localExchangeMessage;sentLocalExchange=!1;earlyPeer;sendAuthMessage;authGeneration=0;processingExchange=!1;constructor(e){this.signingKeyPair=e.signingKeyPair,this.identityId=e.identityId,this.getPeerSigningKey=e.getPeerSigningKey,this.timeout=e.timeout??1e4,this.mode=e.mode??`initiator`,this.blocking=e.blocking??!0}async authenticateClient(e){let t=this.sendAuthMessage===void 0?this.earlyPeer:void 0;this.cleanup();let n=this.authGeneration;if(this.earlyPeer=t,this.sendAuthMessage=e,this.mode===`initiator`){if(await this.ensureLocalExchangeMessage(),n!==this.authGeneration)throw Error(Z);this.sendLocalExchange()}if(!this.blocking){if(this.earlyPeer){let e=this.earlyPeer;this.earlyPeer=void 0,this.dispatchPeerExchange(e,n)}return}let r=await this.waitForPeerExchange();if(await this.processPeerExchange(r,n),n!==this.authGeneration||!this.sessionKey)throw Error(Z)}async authenticateServer(e,t){throw Error(`E2ERelayAuth does not support server authentication`)}handleAuthMessage(e){let t=e;return!t||t.type!==`e2e-relay-key-exchange`?!1:t.identityId===this.identityId?!0:this.pendingPeer?(this.pendingPeer.resolve(t),this.pendingPeer=void 0,!0):(this.earlyPeer=t,!this.blocking&&this.sendAuthMessage&&!this.sessionKey&&!this.processingExchange&&this.dispatchPeerExchange(t,this.authGeneration),!0)}cleanupSocket(e){}cleanup(){this.authGeneration++,this.pendingPeer&&=(this.pendingPeer.reject(Error(Z)),void 0),this.earlyPeer&&=void 0,this.sessionKey=void 0,this.peerId=void 0,this.localEphemeral=void 0,this.localExchangeMessage=void 0,this.sentLocalExchange=!1,this.processingExchange=!1,this.sendAuthMessage=void 0}dispatchPeerExchange(e,t){this.processingExchange=!0,this.processPeerExchange(e,t).catch(e=>{e instanceof Error&&e.message===Z||console.error(`[E2ERelayAuth] Peer exchange failed:`,e)}).finally(()=>{t===this.authGeneration&&(this.processingExchange=!1,this.retryQueuedPeerExchange(t))})}getSessionKey(){return this.sessionKey??null}getPeerId(){return this.peerId??null}getReceiveContext(){let e=this.getPeerId();if(e!==null)return{transportName:``,peer:{kind:`e2e`,id:e,authenticated:!0,encrypted:!0}}}async waitForPeerExchange(){if(this.earlyPeer){let e=this.earlyPeer;return this.earlyPeer=void 0,e}return new Promise((e,t)=>{let n=setTimeout(()=>{this.pendingPeer=void 0,t(Error(`E2E relay key exchange timeout`))},this.timeout),r=()=>{clearTimeout(n),this.pendingPeer=void 0};this.pendingPeer={resolve:t=>{r(),e(t)},reject:e=>{r(),t(e)},timeoutHandle:n}})}async ensureLocalExchangeMessage(){if(this.localExchangeMessage&&this.localEphemeral)return this.localExchangeMessage;let{ephemeralKeyPair:e,ephemeralPublicKey:t,signature:n}=await J(this.signingKeyPair.privateKey,this.identityId);return this.localEphemeral=e,this.localExchangeMessage={type:`e2e-relay-key-exchange`,identityId:this.identityId,ephemeralPublicKey:t,signature:n},this.localExchangeMessage}sendLocalExchange(e=!1){!this.sendAuthMessage||!this.localExchangeMessage||!e&&this.sentLocalExchange||(this.sendAuthMessage(this.localExchangeMessage),this.sentLocalExchange=!0)}retryQueuedPeerExchange(e){if(this.blocking||!this.sendAuthMessage||this.sessionKey||this.processingExchange||e!==this.authGeneration)return;let t=this.earlyPeer;t&&(this.earlyPeer=void 0,this.dispatchPeerExchange(t,e))}async processPeerExchange(e,t){if(!this.sendAuthMessage){this.earlyPeer=e;return}let n=await this.ensureLocalExchangeMessage();if(t!==this.authGeneration)return;let r=await this.getPeerSigningKey(e.identityId);if(!r)throw Error(`E2E relay authentication failed: Unknown peer ${e.identityId}`);if(!await Y(r,e.ephemeralPublicKey,e.signature,e.identityId))throw Error(`E2E relay authentication failed: Invalid peer signature`);let i=await qe(this.identityId,e.identityId,n.ephemeralPublicKey,e.ephemeralPublicKey);if(!this.localEphemeral)throw Error(`E2E relay authentication failed: Local ephemeral key missing`);let a=await X(this.localEphemeral.privateKey,e.ephemeralPublicKey,i,`makaio-e2e-relay-v1`);t===this.authGeneration&&(this.sessionKey=a,this.peerId=e.identityId,this.mode===`initiator`?this.sendLocalExchange(!0):this.sendLocalExchange())}},Xe=class{hmac;e2e;socketStrategy=new Map;pendingServerAuth=new Map;hmacCancelled=new Map;constructor(e){this.hmac=e.hmac,this.e2e=e.e2e}setE2EAuth(e){this.e2e=e}async authenticateClient(e){let t=this.hmac??this.e2e;if(!t)throw Error(`DispatchingAuth: no auth strategy configured`);return t.authenticateClient(e)}async authenticateServer(e,t){let n=this.resolveSingleStrategy();if(n)return n.authenticateServer(e,t);if(!this.hmac||!this.e2e)throw Error(`DispatchingAuth: no auth strategy configured`);let r={cancelled:!1};this.hmacCancelled.set(e,r);let i=this.hmac.authenticateServer(e,e=>{r.cancelled||t(e)});return new Promise((n,a)=>{this.pendingServerAuth.set(e,{resolve:n,reject:a,send:t}),i.then(n).catch(e=>{r.cancelled||a(e instanceof Error?e:Error(String(e)))})})}handleAuthMessage(e,t){if(!t)return(this.hmac??this.e2e)?.handleAuthMessage(e)??!1;let n=this.socketStrategy.get(t);if(n)return n.handleAuthMessage(e,t);let r=this.resolveStrategy(e),i=this.pendingServerAuth.get(t);return r?(this.socketStrategy.set(t,r),this.pendingServerAuth.delete(t),r===this.hmac?this.hmacCancelled.delete(t):(this.cancelHmac(t),i&&r.authenticateServer(t,i.send).then(i.resolve).catch(e=>{i.reject(e instanceof Error?e:Error(String(e)))})),r.handleAuthMessage(e,t)):(this.cancelHmac(t),i&&(this.pendingServerAuth.delete(t),i.reject(Error(`DispatchingAuth: unrecognised auth message type "${this.peekType(e)}" — no matching strategy`))),!1)}cleanupSocket(e){let t=this.socketStrategy.get(e);t&&(t.cleanupSocket(e),this.socketStrategy.delete(e)),this.cancelHmac(e);let n=this.pendingServerAuth.get(e);n&&(this.pendingServerAuth.delete(e),n.reject(Error(`DispatchingAuth: socket disconnected before auth type was determined`)))}cleanup(){this.hmac?.cleanup(),this.e2e?.cleanup(),this.socketStrategy.clear();for(let e of this.pendingServerAuth.values())e.reject(Error(`DispatchingAuth: cleanup called before authentication completed`));this.pendingServerAuth.clear(),this.hmacCancelled.clear()}peekType(e){if(typeof e!=`object`||!e||!(`type`in e))return;let{type:t}=e;return typeof t==`string`?t:void 0}resolveSingleStrategy(){if(this.hmac&&!this.e2e)return this.hmac;if(this.e2e&&!this.hmac)return this.e2e}resolveStrategy(e){let t=this.peekType(e);if(t){if(t===`e2e-key-exchange`&&this.e2e)return this.e2e;if(t===`auth-response`&&this.hmac)return this.hmac}}cancelHmac(e){let t=this.hmacCancelled.get(e);t&&(t.cancelled=!0,this.hmacCancelled.delete(e),this.hmac?.cleanupSocket(e))}};function Ze(e){return`payload`in e}async function Qe(e,t,n){if(e.type!==`response`||e.result===void 0||e.error!==void 0)return;let{ciphertext:r,nonce:i}=await V(n,O(JSON.stringify(e.result)));t.result=E(r),t.e2e={nonce:E(i),v:1}}async function $e(e,t,n){if(e.type!==`broadcast-response`||e.results===void 0||e.error!==void 0)return;let{ciphertext:r,nonce:i}=await V(n,O(JSON.stringify(e.results)));t.results=E(r),t.e2e={nonce:E(i),v:1}}async function et(e,t,n){if(!Ze(e)||e.payload===void 0)return;let{ciphertext:r,nonce:i}=await V(n,O(JSON.stringify(e.payload)));t.payload=E(r),t.e2e={nonce:E(i),v:1}}async function tt(e,t,n){if(e.type!==`response`&&e.type!==`broadcast-response`||e.error===void 0)return;let{ciphertext:r,nonce:i}=await V(n,O(JSON.stringify(e.error)));t.error=E(r),t.e2e={nonce:E(i),v:1}}async function nt(e,t,n,r){if(!Ze(e)||typeof e.payload!=`string`)return;let i=k(await H(n,D(e.payload),r));t.payload=JSON.parse(i)}async function rt(e,t,n,r){if(e.type!==`response`||typeof e.result!=`string`)return;let i=k(await H(n,D(e.result),r));t.result=JSON.parse(i)}async function it(e,t,n,r){if(e.type!==`broadcast-response`||typeof e.results!=`string`)return;let i=k(await H(n,D(e.results),r));t.results=JSON.parse(i)}async function at(e,t,n,r){if(e.type!==`response`&&e.type!==`broadcast-response`||typeof e.error!=`string`)return;let i=k(await H(n,D(e.error),r));t.error=JSON.parse(i)}async function ot(e,t){let n={...e};return await et(e,n,t),await Qe(e,n,t),await $e(e,n,t),await tt(e,n,t),n}async function st(e,t){if(!e.e2e)return e;let n={...e};delete n.e2e;let r=D(e.e2e.nonce);return await nt(e,n,t,r),await rt(e,n,t,r),await it(e,n,t,r),await at(e,n,t,r),n}function ct(e){return e.type===`subscription-ack`&&typeof e.ackId==`string`}function lt(e){let{e2eAuth:t,websocket:n,...r}=e,i=new x({...r,url:`<pre-connected>`,createWebSocket:()=>n,auth:t,autoReconnect:!1,messageTransform:async e=>{let n=t.getSessionKey();if(!n||ct(e))return e;let r=e;if(!r.e2e)throw Error(`Received plaintext message on E2E-encrypted channel — possible injection`);return st(r,n)}});async function a(e,n){let r=t.getSessionKey();if(!r)throw Error(`E2E session key not available - authentication may have failed`);let a=await ot(e,r);return i.send(a,n)}return{name:i.name,connect:i.connect.bind(i),disconnect:i.disconnect.bind(i),send:a,cancelRequest:i.cancelRequest.bind(i),onReceive:i.onReceive.bind(i),subscribe:i.subscribe.bind(i),unsubscribe:i.unsubscribe.bind(i),getSubscriptions:i.getSubscriptions.bind(i)}}function ut(e){return lt(e)}function dt(e){if(!e||typeof e!=`object`)return!1;let t=e;if(t.type!==`e2e-relay-envelope`||typeof t.payload!=`string`)return!1;let n=t.e2e;return!!n&&typeof n.nonce==`string`&&typeof n.v==`number`}async function ft(e,t){let{ciphertext:n,nonce:r}=await V(t,O(JSON.stringify(e)));return{type:`e2e-relay-envelope`,payload:E(n),e2e:{nonce:E(r),v:1}}}async function pt(e,t){let n=D(e.e2e.nonce),r=k(await H(t,D(e.payload),n));return JSON.parse(r)}function mt(e){let t=()=>{if(!e.isFrozen())throw Error(`RelayControlRegistry must be frozen before processing relay control messages`)};function n(t){return typeof t.namespace!=`string`||typeof t.subject!=`string`||!e.isControlEvent(t.namespace,t.subject)||typeof t.messageId!=`string`?!1:t.payload!==void 0}function r(t){return typeof t.namespace!=`string`||typeof t.subject!=`string`||!e.isControlRequest(t.namespace,t.subject)||typeof t.messageId!=`string`||typeof t.correlationId!=`string`?!1:t.payload!==void 0}function i(e){if(t(),!e||typeof e!=`object`)return!1;let i=e;return i.type===`event`?n(i):i.type===`request`?r(i):!1}function a(e){if(t(),!e||typeof e!=`object`)return!1;let n=e;return n.type!==`relay-control`||n.v!==1||!n.payload||typeof n.payload!=`object`?!1:i(n.payload)}function o(e){if(t(),!i(e))throw Error(`Invalid relay control message`);return{type:`relay-control`,v:1,payload:e}}return{createRelayControlEnvelope:o,isRelayControlEnvelopeMessage:a,isRelayControlBusMessage:i}}function Q(e){let t=Date.now()-3e5;for(let[n,r]of e)r>=t||e.delete(n);for(;e.size>2048;){let t=e.keys().next().value;if(!t)break;e.delete(t)}}const ht=e=>{if(!e||typeof e!=`object`)return!1;let t=e;return t.type===`response`&&typeof t.correlationId==`string`},gt=e=>e.type===`subscribe`||e.type===`unsubscribe`,_t=e=>{if(!e||typeof e!=`object`)return!1;let t=e;return t.type===`subscription-ack`&&typeof t.ackId==`string`};function $(e,t,n,r){if(!r.isFrozen())throw Error(`E2ERelay transport requires a frozen relay control registry`);let{createRelayControlEnvelope:i,isRelayControlEnvelopeMessage:a,isRelayControlBusMessage:o}=mt(r),s=e=>{n.delete(e),n.set(e,Date.now()),Q(n)};return{encode:async t=>{if(o(t))return t.type===`request`&&s(t.correlationId),JSON.stringify(i(t));if(Q(n),t.type===`response`&&n.has(t.correlationId))return n.delete(t.correlationId),JSON.stringify(t);let r=e.getSessionKey();if(!r&&gt(t)||!r&&_t(t))return JSON.stringify(t);if(!r)throw Error(`E2E relay session not established`);let a=await ft(t,r);return JSON.stringify(a)},decode:async r=>{let i=e.getSessionKey();if(a(r)){let e=r.payload;return t&&console.info(`[E2ERelayTransport] Decoded relay control envelope:`,e.type,e.namespace,e.subject),e.type===`request`&&s(e.correlationId),e}if(Q(n),ht(r)&&n.has(r.correlationId))return n.delete(r.correlationId),r;if(!i&&_t(r))return r;if(!i)throw Error(`E2E relay session not established`);if(!dt(r))throw Error(`Received plaintext message on relay E2E channel — possible injection`);return pt(r,i)}}}function vt(e,t,n=!1){let r=new Map;return{codec:$(e,n,r,t),reset:()=>r.clear()}}function yt(e){let{e2eAuth:t,registry:n,websocket:r,...i}=e,a=e.debug??!1,o=new Map,s=$(t,a,o,n);a&&console.info(`[E2ERelayTransport] Creating inner transport...`);let c=new x({...i,url:`<pre-connected>`,createWebSocket:()=>r,auth:t,codec:s,autoReconnect:!1});return a&&console.info(`[E2ERelayTransport] Inner transport created`),{name:c.name,connect:async()=>{if(!n.isFrozen())throw Error(`E2ERelayClientTransport: registry must be frozen before connect()`);o.clear();try{await c.connect()}catch(e){throw o.clear(),e}},disconnect:async()=>{o.clear();try{await c.disconnect()}finally{o.clear()}},send:c.send.bind(c),cancelRequest:c.cancelRequest.bind(c),onReceive:(...e)=>(a&&console.info(`[E2ERelayTransport] onReceive called, delegating to inner transport`),c.onReceive(...e)),subscribe:c.subscribe.bind(c),unsubscribe:c.unsubscribe.bind(c),getSubscriptions:c.getSubscriptions.bind(c),isReady:()=>!!t.getSessionKey()&&c.isReady()}}function bt(){let e=!1,t=new Map,n=new Map,r=()=>{if(e)throw Error(`RelayControlRegistry is frozen and cannot be modified`)};return{registerEventSubjects(e,n){r();let i=t.get(e)??new Set;for(let e of n)i.add(e);t.set(e,i)},registerRequestNamespace(e,t){if(r(),t.length===0)throw Error(`RelayControlRegistry request namespace "${e}" requires at least one subject`);let i=n.get(e)??new Set;for(let e of t)i.add(e);n.set(e,i)},freeze(){e=!0},isFrozen(){return e},isControlEvent(e,n){return t.get(e)?.has(n)??!1},isControlRequest(e,t){return n.get(e)?.has(t)??!1}}}function xt(e){if(we(e),e.mode===`client`){if(e.connectionOptions!==void 0)throw Error(`createWebSocketTransport(client) does not support connectionOptions when wrapping a pre-created WebSocket. Use WebSocketClientTransport for reconnect or dial-time socket options.`);let t=e.websocket;return new x({url:`<pre-connected>`,createWebSocket:()=>t,auth:e.auth,debug:e.debug,autoReconnect:!1})}else return new w({websocket:e.websocket,auth:e.auth,debug:e.debug})}export{Xe as DispatchingAuth,Je as E2EAuth,Ye as E2ERelayAuth,De as HmacAuth,w as ServerTransport,x as WebSocketClientTransport,je as clearHmacIdentitySecretsForTesting,ut as createE2EClientTransport,yt as createE2ERelayClientTransport,vt as createE2ERelayCodec,mt as createRelayControlHelpers,bt as createRelayControlRegistry,Ce as createWebSocketCloseEvent,xt as createWebSocketTransport,We as crypto,ie as extractSocketErrorMessage,Oe as registerHmacIdentitySecret,Ae as resolveHmacIdentityPeer,ke as resolveHmacIdentitySecret};
package/dist/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@makaio/framework",
3
- "version": "1.0.0-dev-1782138936821",
3
+ "version": "1.0.0-dev-1783282710723",
4
4
  "type": "module"
5
5
  }
@@ -1 +1 @@
1
- import{t as e}from"./credential-ref-YWQQENEo.mjs";import{r as t,t as n}from"./definition-BJ_975aA.mjs";import{z as r}from"zod";const i=r.object({providerConfigId:r.string(),definitionId:r.string(),endpointOverrides:n.optional(),credentialRefs:r.record(r.string(),e),credentialEnvVars:r.record(r.string(),r.string()).optional(),ambientCredentialEnvVars:r.array(r.string()).optional(),capabilities:t.optional()});export{i as t};
1
+ import{t as e}from"./credential-ref-YWQQENEo.mjs";import{r as t,t as n}from"./definition-C-GVz7uw.mjs";import{z as r}from"zod";const i=r.object({providerConfigId:r.string(),definitionId:r.string(),endpointOverrides:n.optional(),credentialRefs:r.record(r.string(),e),credentialEnvVars:r.record(r.string(),r.string()).optional(),ambientCredentialEnvVars:r.array(r.string()).optional(),capabilities:t.optional()});export{i as t};
@@ -1,4 +1,4 @@
1
- import{i as e,o as t,t as n}from"../chunk-DTipWd-i.mjs";import{t as r}from"../semver-CIhHqMkw.mjs";import{RuntimeNamespace as i,RuntimeSubjects as a}from"./bus/runtime/namespace.mjs";import{ExplicitDescriptorDiscovery as o,FilesystemDescriptorDiscovery as s,MergedDescriptorDiscovery as c}from"./extension-discovery.mjs";import{MAKAIO_CONFIG_FILE_ENV as l,MAKAIO_HOME_ENV as u,buildConfiguredRuntimeOptions as d,createMakaioConfigDiscovery as f,defineMakaioConfig as p,loadMakaioConfig as m,parseMakaioConfig as h,resolveMakaioConfigPath as g,resolveMakaioHome as _,shouldIncludeExtension as v}from"./makaio-config.mjs";import{t as y}from"../descriptor-to-package-DdpjpT7n.mjs";import{a as b,c as x,i as S,n as C,o as w,r as T,s as E,t as ee}from"../load-extensions-Cze1RHcG.mjs";import{i as te,o as ne,r as re,s as ie,t as ae}from"../workflow-worker-BIpYi6o7.mjs";import{createRequire as oe}from"node:module";import{z as D}from"zod";import{execFile as se}from"node:child_process";import{promisify as ce}from"node:util";import{fileURLToPath as le,pathToFileURL as O}from"node:url";import*as k from"node:fs/promises";import*as A from"node:path";import j from"node:path";import*as M from"node:crypto";import{createHash as N}from"node:crypto";import*as P from"node:fs";import{existsSync as F,readFileSync as ue}from"node:fs";import{createBusNamespace as de}from"@makaio/framework/core";import{ChannelClosedError as fe,MakaioBus as pe,openChannel as me,projectSubjectTelemetryFacts as he}from"@makaio/framework/bus";import{AIModelSchema as ge,AdapterSubjects as _e,BUILT_IN_THIN_WORKFLOW_PROVIDER_ID as ve,ConfigSchema as I,ConfigSubjects as L,CredentialSubjects as ye,FrameworkContractNamespaces as be,FrameworkStorageNamespaces as xe,SubjectTelemetrySubjects as Se,isDetachedDescriptor as Ce,registerWorkerNodeProvider as we,safeParseExtensionDescriptor as Te,unregisterWorkerNodeProvider as Ee,versionSatisfies as De}from"@makaio/framework/contracts";import{DispatchingAuth as Oe,E2EAuth as ke,HmacAuth as Ae,WebSocketClientTransport as je}from"@makaio/framework/node/transports";import{BaseService as Me}from"@makaio/framework/service-base";import{uniqueIndex as Ne}from"drizzle-orm/sqlite-core";import{uniqueIndex as Pe}from"drizzle-orm/pg-core";import{STORAGE_ENGINE_URL_HINTS as Fe,defineDialectSchema as Ie,defineDualTable as Le,findStorageEngine as Re,getDatabaseDialect as ze,getRawSqlExecutor as Be,getStorageEngine as Ve,registerDrizzleHandlers as He,registerStorageEngine as Ue,resolveSchema as We,resolveStorageEngine as Ge,resolveStorageEngineForUrl as Ke}from"@makaio/framework/storage/drizzle";import{and as qe,eq as R,sql as z}from"drizzle-orm";import{parseStoredCredentialRef as Je}from"@makaio/framework/contracts/config";import{AdapterRuntimeSubjects as Ye,registerAdapterRuntimeIdentityHandlers as Xe}from"@makaio/framework/services/adapter-runtime";import{buildProviderContext as Ze}from"@makaio/framework/services/provider-context";import*as Qe from"node:os";import{ProviderStorageSubjects as $e}from"@makaio/framework/services/settings/storage";import{isRecord as et}from"@makaio/framework/utils";import{BootNamespace as tt,ExtensionCoordinator as nt,ExtensionNamespace as rt,KernelNamespace as it,coalesceExtensionOverrides as at,createShutdownSequence as ot,filterEligibleExtensions as st}from"@makaio/framework/kernel";import{AdapterSubsystemSubjects as ct}from"@makaio/framework/services/adapter-subsystem";import{CachedRegistryFetcher as lt,FallbackRegistryFetcher as ut,ModelRegistrySchema as dt,ProviderModelOverrideSchema as ft,mergeModelMetadata as pt}from"@makaio/framework/services/model-registry";import{createClientsCorePackage as mt}from"@makaio/framework/clients";import{Readable as ht,Transform as gt}from"node:stream";import{pipeline as _t}from"node:stream/promises";import{createDatabaseClient as vt}from"@makaio/framework/storage/drizzle/client";import{AdapterSubsystemToken as yt,FileAdapterConfigRepository as bt,createAdapterSubsystemContributionProcessor as xt,createAdapterSubsystemPackage as St}from"@makaio/framework/adapter-subsystem";import{loadOrCreateMachineIdentity as Ct,loadOrCreateMachineIdentity as wt,machineKeysExist as Tt,validateMachineKeys as Et}from"@makaio/framework/node/machine-identity";import{resolveWorkspaceRoot as Dt}from"@makaio/framework/utils/workspace-root";import{Hono as Ot}from"hono";import{CliNamespace as kt}from"@makaio/framework/kernel/cli";import{startBusServer as At}from"@makaio/framework/node/bus-server";import{WebSocketServer as jt}from"ws";import{ConfigProvider as Mt}from"@makaio/framework/providers";import{KernelSubjects as B}from"@makaio/framework/kernel/namespace";import{FrameworkServicesCoreNamespaces as Nt,SessionOrchestratorToken as Pt,createArtifactKindContributionProcessor as Ft,createArtifactLifecycleHookContributionProcessor as It,createFacetNamespaceContributionProcessor as Lt,createModelRegistryPackage as Rt,createSurfaceBindingContributionProcessor as zt,createToolContributionProcessor as Bt,createTransitionContributionProcessor as Vt,createWorkflowBlockContributionProcessor as Ht,frameworkCorePackages as Ut}from"@makaio/framework/services";import{createLogImportContributionProcessor as Wt,logImportRegistryPackage as Gt}from"@makaio/framework/services/log-import";import{createWorkflowEnginePackage as Kt}from"@makaio/framework/workflow-engine/package";import{PreferenceValueSchema as qt,PreferencesSubjects as Jt}from"@makaio/framework/services/preferences";import{resolveConnectorCredentials as Yt,resolveCredentialRef as Xt}from"@makaio/framework/adapters/config";import{DefinitionSubjects as Zt}from"@makaio/framework/services/definition";import{ProviderRuntimeSubjects as Qt}from"@makaio/framework/services/provider-runtime";import{SettingsSubjects as $t}from"@makaio/framework/services/settings/namespace";import{parseWorkspaceGlobs as en}from"@makaio/framework/utils/workspace-packages";import{serveStatic as tn}from"@hono/node-server/serve-static";function nn(e){return e.on(_e.getCapabilities,async t=>{let{adapterName:n,adapterId:r}=t.payload;if(r){await t.next();return}if(n){let r=await e.requestOptional(Ye.resolveId,{adapterName:n}),i=r.handled?r.data.adapterId:void 0;i&&(t.payload.adapterId=i)}await t.next()},{priority:20})}function rn(e){let{coordinator:t,configRepository:n,platformDefaults:r}=e,i=St({configRepository:n,coordinator:t,platformDefaults:r});return t.registerContributionProcessor(xt({getAdapterSubsystemService:()=>t.getExtensionService(yt)})),{adapterSubsystemPackage:i}}function an(e){let{bus:t,currentMachineId:n}=e,r=Xe(t,{currentMachineId:n,listKnownAdapterNames:e.listKnownAdapterNames??(async()=>{let{configs:e}=await t.request(ct.listAdapterConfigs,{});return e.map(e=>e.name)})}),i=nn(t);return{cleanup:()=>{r.cleanup(),i()}}}function on(e=`sqlite`){let{migrations:t}=Ve(e);return t.resolveSourceChainDir?.()??j.resolve(import.meta.dirname,`..`,t.chainDirName)}var sn=class extends Error{expectedDialect;journalDialect;constructor(e,t,n,r){super(`Migration journal at ${r} declares dialect '${n??`unknown`}', but the target database speaks '${e}'. Point the runner at a migrations directory generated for '${e}' (journal dialect '${t}').`),this.name=`MigrationDialectMismatchError`,this.expectedDialect=e,this.journalDialect=n}};function cn(e={}){let t=typeof e==`string`?void 0:e.expectedDialect,n=typeof e==`string`?e:e.migrationsDir??on(t),r=j.join(n,`meta`,`_journal.json`);if(!F(r))throw Error(`Cannot find migrations journal at ${r}`);let i=JSON.parse(ue(r,`utf-8`));if(t!==void 0){let e=Ve(t).migrations.journalDialect;if(i.dialect!==e)throw new sn(t,e,i.dialect,r)}return i.entries.map(e=>{let t=ue(j.join(n,`${e.tag}.sql`),`utf-8`);return{tag:e.tag,sql:t.split(`--> statement-breakpoint`),folderMillis:e.when,hash:N(`sha256`).update(t).digest(`hex`),bps:e.breakpoints}})}function ln(e){return e.replace(/--.*$/gm,``).trim()}async function un(e,t){try{await e.run(z.raw(`ROLLBACK`))}catch(e){console.error(`[storage-migrations] Failed to roll back migration transaction`,{...t,rollbackError:e})}}async function dn(e){let{migrations:t}=e.engine;if(await e.session.run(z.raw(t.beginTransactionStatement)),t.acquireTransactionLock)try{await t.acquireTransactionLock(e.session,e.tableName)}catch(t){throw await un(e.session,{migrationsTable:e.tableName}),t}}async function fn(e){let t=e.engine.migrations.acquireTransactionLock!==void 0;t&&await dn(e);try{await e.session.run(z.raw(e.engine.migrations.buildLedgerDdl(e.tableName)));let n=await e.session.all(z`SELECT hash FROM ${e.tableId}`);return t&&await e.session.run(z.raw(`COMMIT`)),new Set(n.map(e=>e.hash))}catch(n){throw t&&await un(e.session,{migrationsTable:e.tableName}),n}}async function pn(e,t){try{await e.session.run(z`INSERT INTO ${e.tableId} ("hash", "created_at") VALUES (${t.hash}, ${t.folderMillis})`),await e.session.run(z.raw(`COMMIT`))}catch(e){throw console.error(`[storage-migrations] Failed to finalize migration`,{hash:t.hash,folderMillis:t.folderMillis,error:e}),e}}async function mn(e,t){return e.engine.migrations.acquireTransactionLock===void 0||(await e.session.all(z`SELECT hash FROM ${e.tableId} WHERE hash = ${t.hash}`)).length===0?!1:(console.warn(`[storage-migrations] Migration already recorded by a concurrent runner, skipping`,{hash:t.hash,folderMillis:t.folderMillis}),await e.session.run(z.raw(`COMMIT`)),!0)}async function hn(e,t){await e.session.run(z.raw(`ROLLBACK`)),await dn(e),!await mn(e,t)&&await pn(e,t)}async function gn(e,t){await dn(e);try{if(await mn(e,t))return;for(let[n,r]of t.sql.entries())if(ln(r))try{await e.session.run(z.raw(r))}catch(i){if(n===0&&/^\s*CREATE\s/i.test(r)&&e.engine.errors.isDuplicateObjectError(i)){if(t.sql.length>1)throw Error(`Cannot adopt multi-statement migration '${t.tag}' because its first schema object already exists. Reset the database or provide an incremental migration.`,{cause:i});console.warn(`[storage-migrations] Schema object already exists, adopting into ledger`,{hash:t.hash,folderMillis:t.folderMillis,statementIndex:n}),await hn(e,t);return}throw console.error(`[storage-migrations] Failed to apply migration statement`,{hash:t.hash,folderMillis:t.folderMillis,statementIndex:n,statement:r,error:i}),i}await pn(e,t)}catch(n){throw await un(e.session,{hash:t.hash,folderMillis:t.folderMillis}),n}}async function _n(e,t,n){let r=Be(e),i=Ve(r.dialect),a=n??i.migrations.defaultLedgerTable;await r.withSession(async e=>{let n={session:e,engine:i,tableName:a,tableId:z.identifier(a)},r=await fn(n);for(let e of t)r.has(e.hash)||(await gn(n,e),r.add(e.hash))})}async function vn(e,t={}){await _n(e,cn({migrationsDir:t.migrationsDir,expectedDialect:ze(e)})),await Ge(e).fts.provisionSearchIndex(e)}var yn=class{configPath;constructor(e){this.configPath=A.join(e,`config.json`)}async getConfig(){try{let e=await k.readFile(this.configPath,`utf-8`);return I.parse(JSON.parse(e))}catch(e){if(e.code===`ENOENT`)return I.parse({});if(e instanceof SyntaxError||e instanceof Error&&e.name===`ZodError`)return console.warn(`[FileConfigStorage] Failed to parse config, falling back to defaults:`,e),I.parse({});throw e}}async saveConfig(e){let t=A.dirname(this.configPath);await k.mkdir(t,{recursive:!0}),await k.writeFile(this.configPath,JSON.stringify(e,null,2),{encoding:`utf-8`,mode:384}),await k.chmod(this.configPath,384)}};function bn(e){try{let t=A.resolve(Dt(e),`static/model-registry.yaml`);return F(t)?t:void 0}catch{return}}async function xn(e,t){await new Promise((n,r)=>{if(e.address()){n();return}let i=e=>{if(o(),e.code===`EADDRINUSE`){r(Error(`Port ${t} is already in use`));return}r(e)},a=()=>{o(),n()},o=()=>{e.off(`error`,i),e.off(`listening`,a)};e.once(`error`,i),e.once(`listening`,a)}),e.on(`error`,e=>{console.error(`[HttpServer] Post-bind error:`,e)})}function Sn(e){let t=e.address();if(typeof t==`object`&&t&&`port`in t)return t.port;throw Error(`HTTP server is not bound to a TCP address`)}function Cn(e,t){let n=e,r=!1;return{fetch:(e,i,a)=>{if(!r)return new Response(`Makaio runtime is booting`,{status:503,headers:{"Retry-After":`1`}});let{pathname:o}=new URL(e.url);return t?.health&&e.method===`GET`&&o===`/health`?Response.json(t.health()):e.method===`GET`&&o===`/bus`?new Response(`WebSocket endpoint`,{status:426,headers:{Upgrade:`websocket`}}):n.fetch(e,i,a)},markReady(){r=!0},replaceApp(e){n=e}}}const wn=[`extension`,`static-fallback`];function Tn(e){let t=[];function n(e){let t=new Ot,n=[...e].sort((e,t)=>wn.indexOf(e.phase)-wn.indexOf(t.phase));for(let e of n)e.mount(t);return t}function r(){return n(t)}function i(r){e&&e.replaceApp(n(r)),t=r}return{add(e){i([...t,e])},remove(e){let n=t.filter(t=>t.owner!==e);n.length!==t.length&&i(n)},build:r,get contributions(){return[...t]}}}function En(e,t){if(!(e instanceof Error))return!1;let{rootPackageName:n,subpath:r}=On(t),i=(r===void 0?[t]:[t,n]).flatMap(e=>[`Cannot find package '${e}'`,`Cannot find module '${e}'`,`Cannot find package "${e}"`,`Cannot find module "${e}"`]),a=e;return(a.code===`ERR_MODULE_NOT_FOUND`||a.code===`MODULE_NOT_FOUND`)&&i.some(t=>e.message.includes(t))||a.code===`ERR_PACKAGE_PATH_NOT_EXPORTED`&&r!==void 0&&e.message.includes(`Package subpath '${r}' is not defined by "exports"`)&&kn(e.message,n)?!0:i.some(t=>e.message.includes(t))}async function Dn(e){try{return await import(e)}catch(t){if(En(t,e))return null;throw t}}function On(e){let t=e.split(`/`);return e.startsWith(`@`)?{rootPackageName:t.slice(0,2).join(`/`),subpath:t.length>2?`./${t.slice(2).join(`/`)}`:void 0}:{rootPackageName:t[0]??e,subpath:t.length>1?`./${t.slice(1).join(`/`)}`:void 0}}function kn(e,t){let n=t,r=t.replaceAll(`/`,`\\`);return e.includes(`/${n}/package.json`)||e.includes(`\\${r}\\package.json`)}function An(e){let t=e.url?.split(`?`)[0]??``;return t===`/bus`?!0:(t===`/`||t===``)&&e.headers.origin===void 0}function jn(e,t){return(n,r,i)=>{if(!An(n))return;let a=e();if(!a||!t()){r.destroy();return}a.handleUpgrade(n,r,i,e=>{a.emit(`connection`,e,n)})}}var Mn=class{options;busServer=null;websocketServer=null;upgradeHandlerServer=null;upgradeHandler=null;busReady=!1;connecting=!1;constructor(e){this.options=e}get dispatchingAuth(){return this.options.auth instanceof Oe?this.options.auth:void 0}async connect(e,t){if(this.connecting||this.busServer||this.websocketServer)throw Error(`[BusServerTransport] connect() called while transport is already connected or connecting`);if(this.options.httpServer.address()===null)throw Error(`[BusServerTransport] httpServer must already be listening before connect() is called`);this.connecting=!0;try{let t=new jt({noServer:!0});this.websocketServer=t;let n=jn(()=>this.websocketServer,()=>this.busReady);this.options.httpServer.on(`upgrade`,n),this.upgradeHandlerServer=this.options.httpServer,this.upgradeHandler=n,this.busServer=await At({websocket:t,bus:e,auth:this.options.auth,loopbackName:this.options.loopbackName??`node`}),this.busReady=!0}catch(e){throw await this.stopBusServer(`startup error`),this.detachUpgradeHandler(),await this.stopWebSocketServer(`startup error`),e}finally{this.connecting=!1}}async disconnect(){await this.stopBusServer(`shutdown`),this.detachUpgradeHandler(),await this.stopWebSocketServer(`shutdown`)}async stopBusServer(e){this.busReady=!1,this.busServer&&=(await this.busServer.stop().catch(t=>{console.error(`[BusServerTransport] Failed to stop bus server during ${e}:`,t)}),null)}detachUpgradeHandler(){this.upgradeHandlerServer&&this.upgradeHandler&&this.upgradeHandlerServer.off(`upgrade`,this.upgradeHandler),this.upgradeHandlerServer=null,this.upgradeHandler=null}async stopWebSocketServer(e){this.websocketServer&&=(await new Promise((e,t)=>{this.websocketServer.close(n=>n?t(n):e())}).catch(t=>{t instanceof Error&&t.message===`The server is not running`||console.error(`[BusServerTransport] Failed to close WebSocket server during ${e}:`,t)}),null)}},Nn=class extends Mt{keysDir;constructor(e,t){super(e),this.keysDir=A.join(t,`keys`)}async getConfig(e){let t=await super.getConfig(e);return t.bus?.remote&&!t.bus.remote.secret&&(t.bus.remote.secret=this.generateSecret(),(await this.getStoredConfig()).bus?.remote?.url===t.bus.remote.url&&await this.saveConfig(await this.prepareConfigForPersistence(t))),t}generateSecret(){return M.randomBytes(32).toString(`base64`)}async getMachineId(){return(await wt(this.keysDir)).machineId}getEnv(e){return process.env[e]}};function Pn(e,t){return{extensions:e.discovery??new s(void 0,{extensionsDir:j.join(t,`extensions`),nodeModulesDir:j.join(t,`node_modules`)})}}function Fn(e){return F(j.join(e,`meta`,`_journal.json`))}function In(e,t={}){let{moduleDir:n=import.meta.dirname,getMigrationsFolder:r=on}=t,i=Ve(e).migrations.chainDirName,a=[],o=j.resolve(n,`..`,i);if(Fn(o))return o;a.push(o);try{let t=r(e);if(Fn(t))return t;a.push(t)}catch(t){a.push(`getMigrationsFolder('${e}') unavailable: ${t instanceof Error?t.message:String(t)}`)}throw Error(`resolveBundledMigrationsDir: no '${e}' migrations directory with meta/_journal.json found. Probed: ${a.join(`; `)}. Pass an explicit migrations directory (boot option 'centralMigrationsDir' or InitializeNodeDatabaseOptions.migrationsDir) when migrations are staged elsewhere.`)}function Ln(e){if(process.platform===`win32`)return!0;let t=e?.code;return t===`ENOSYS`||t===`EINVAL`}function Rn(e){return e===void 0||e.trim()===``?void 0:e}function zn(e){try{let t=new URL(e);if(t.host!==``)return`${t.protocol}//${t.host}${t.pathname}`}catch{}let t=e.indexOf(`:`);return t===-1?`<unparseable database URL>`:`${e.slice(0,t+1)}…`}async function Bn(e,t,n){let r;try{r=await import(O(oe(A.resolve(t,`package.json`)).resolve(e.packageName)).href)}catch(t){throw Error(`initializeNodeDatabase: the database URL from ${n} targets the '${e.dialect}' storage engine, but '${e.packageName}' could not be loaded. Install ${e.packageName} in the host application, or pass its already-loaded storageEngine via the 'database.engines' boot option.`,{cause:t})}let i=r.storageEngine;if(i===void 0||i.dialect!==e.dialect)throw Error(`initializeNodeDatabase: '${e.packageName}' does not provide a storage engine for dialect '${e.dialect}'. Auto-resolved engine packages must export 'storageEngine: StorageEngine' with a matching dialect.`);Re(e.dialect)===void 0&&Ue(i)}async function Vn(e){let t=Rn(e.database?.url),n=t??Rn(process.env.MAKAIO_DATABASE_URL);if(n!==void 0){let r=t===void 0?`the MAKAIO_DATABASE_URL environment variable`:`the 'database.url' boot option`,i=Ke(n);if(i.kind===`missing-engine`&&(await Bn(i,e.database?.enginePackageImportBasePath??process.cwd(),r),i=Ke(n)),i.kind!==`engine`){let e=Fe.map(e=>e.packageName).join(`, `);throw Error(`initializeNodeDatabase: unsupported database URL '${zn(n)}' from ${r}. URL targets require a storage engine that claims the URL (e.g. postgres:// / postgresql:// via ${e}); SQLite targets are configured via the dbPath option or MAKAIO_DATABASE_PATH.`)}return{kind:`url`,url:n,dialect:i.engine.dialect}}let r=A.resolve(Rn(e.dbPath)??Rn(process.env.MAKAIO_DATABASE_PATH)??A.join(e.makaioHome,`makaio.db`));return{kind:`file`,dbPath:r,url:O(r).href}}async function Hn(e){for(let t of e.database?.engines??[])Ue(t);let t=await Vn(e);if(t.kind===`url`){let n=await vt({url:t.url,postgres:{poolMax:e.database?.poolMax}});try{let r=e.migrationsDir??In(t.dialect);return await vn(n.db,{migrationsDir:r}),{databaseClient:n}}catch(e){throw await n.close(),e}}let{dbPath:n}=t,r=A.dirname(n);await P.promises.mkdir(r,{recursive:!0});let i=await vt({url:t.url});try{await vn(i.db,{migrationsDir:e.migrationsDir});try{await P.promises.chmod(n,384)}catch(e){if(!Ln(e))throw e;console.warn(`[initializeNodeDatabase] Failed to set SQLite file permissions (continuing; this may be unsupported on Windows):`,e)}return{databaseClient:i,dbPath:n}}catch(e){throw await i.close(),e}}const Un=D.object({npmName:D.string(),version:D.string(),source:D.enum([`new`,`upgraded`,`already-present`])}),Wn=D.object({npmName:D.string(),reason:D.string()}),Gn=D.object({success:D.boolean(),packageName:D.string(),version:D.string().optional(),restartRequired:D.boolean(),error:D.string().optional(),installed:D.array(Un).optional(),skipped:D.array(Wn).optional(),warnings:D.array(D.string()).optional()}),Kn=D.object({success:D.boolean(),packageName:D.string(),error:D.string().optional(),restartRequired:D.boolean()}),qn=D.object({name:D.string(),version:D.string(),description:D.string().optional(),hasDescriptor:D.boolean().default(!1),serverImportPath:D.string().min(1).optional()}),Jn=D.object({packageName:D.string(),latestVersion:D.string(),success:D.boolean(),error:D.string().optional()}),Yn=D.object({name:D.string(),displayName:D.string(),description:D.string(),icon:D.string().optional(),tags:D.array(D.string()).optional(),descriptorName:D.string().min(1).optional()}),Xn=D.object({$schema:D.string(),updatedAt:D.string(),adapters:D.array(Yn),extensions:D.array(Yn)}),Zn=D.object({name:D.string(),currentVersion:D.string(),latestVersion:D.string(),description:D.string().optional()}),Qn=de(`packages`,{list:{request:D.object({}),response:D.object({packages:D.array(qn)})},install:{request:D.object({packageName:D.string().optional(),packageNames:D.array(D.string()).min(1).optional(),source:D.enum([`npm`,`local`]).optional(),force:D.boolean().optional()}).refine(e=>e.packageName!==void 0||e.packageNames!==void 0,{message:`Expected packageName or packageNames`}),response:Gn},uninstall:{request:D.object({packageName:D.string()}),response:Kn},getLatestVersion:{request:D.object({packageName:D.string()}),response:Jn},getRegistry:{request:D.object({}),response:Xn},checkUpdates:{request:D.object({}),response:D.object({updates:D.array(Zn)})},installed:D.object({packageName:D.string(),version:D.string()}),uninstalled:D.object({packageName:D.string()})}),V=Qn.subjects;async function $n(e,t,n){if(!A.isAbsolute(e))return;let r;try{r=await k.realpath(e)}catch{return}let i=er(t,n),a=[A.resolve(r,`src`,`${i}.ts`),A.resolve(r,`dist`,`${i}.mjs`)];for(let e of a){let t=await tr(e);if(t!==void 0&&nr(t,r))return t}}function er(e,t){return t===!0?e:t}async function tr(e){try{return await k.realpath(e)}catch{return}}function nr(e,t){let n=A.relative(t,e);return n.length>0&&!n.startsWith(`..`)&&!A.isAbsolute(n)}var rr=class{extensionsDir;constructor(e){this.extensionsDir=A.resolve(e)}async install(e){try{let t=A.resolve(e.endsWith(`descriptor.json`)?A.dirname(e):e),n=await k.realpath(t),r=await this.readDescriptor(n);Ce(r)||await this.validateEntrypoints(n,r.entrypoints);let i=this.linkPathFor(r.name);await k.mkdir(A.dirname(i),{recursive:!0});try{if((await k.lstat(i)).isSymbolicLink())await k.unlink(i);else throw Error(`${i} already exists and is not a symlink`)}catch(e){if(e.code!==`ENOENT`)throw e}let a=process.platform===`win32`?`junction`:`dir`;return await k.symlink(n,i,a),{success:!0,packageName:r.name,version:r.version,restartRequired:!0}}catch(e){return{success:!1,packageName:``,error:e instanceof Error?e.message:String(e),restartRequired:!1}}}async uninstall(e){try{let t=this.linkPathFor(e);if(await k.unlink(t),e.startsWith(`@`)){let e=A.dirname(t);(await k.readdir(e).catch(()=>null))?.length===0&&await k.rmdir(e).catch(()=>{})}return{success:!0,packageName:e,restartRequired:!0}}catch(t){return{success:!1,packageName:e,error:t instanceof Error?t.message:String(t),restartRequired:!1}}}async list(){try{await k.access(this.extensionsDir)}catch{return[]}let e=await k.readdir(this.extensionsDir),t=[];for(let n of e){let e=A.join(this.extensionsDir,n);if(n.startsWith(`@`)){let n=await k.readdir(e).catch(()=>[]);for(let r of n){let n=A.join(e,r),i=await this.readLocalEntry(n);i!==null&&t.push(i)}}else{let n=await this.readLocalEntry(e);n!==null&&t.push(n)}}return t}async readLocalEntry(e){try{if(!(await k.lstat(e)).isSymbolicLink())return null;let t=await k.readlink(e),n=await k.realpath(A.resolve(A.dirname(e),t)),r=A.join(n,`descriptor.json`),i=await k.readFile(r,`utf-8`),a=Te(JSON.parse(i));if(!a.success)return null;let o=a.data.entrypoints?.server,s=o===void 0?void 0:await $n(n,`server`,o);return{name:a.data.name,version:a.data.version,sourcePath:n,source:`local`,...s!==void 0&&{serverImportPath:s}}}catch{return null}}async readDescriptor(e){let t=A.join(e,`descriptor.json`),n=await k.readFile(t,`utf-8`).catch(()=>{throw Error(`descriptor.json not found at ${t}`)}),r=Te(JSON.parse(n));if(!r.success)throw Error(`Invalid descriptor.json: ${r.error.message}`);return r.data}async validateEntrypoints(e,t){await Promise.all(Object.entries(t).map(async([t,n])=>{if(n!==void 0&&await $n(e,t,n)===void 0){let e=er(t,n);throw Error(`${t} entrypoint "${e}" has no resolvable candidate: neither src/${e}.ts nor dist/${e}.mjs exists within the extension root`)}}))}linkPathFor(e){let t=A.resolve(this.extensionsDir,...e.split(`/`)),n=A.relative(this.extensionsDir,t);if(n===``||n.startsWith(`..`)||A.isAbsolute(n))throw Error(`Invalid extension name: ${e}`);return t}};const ir=`nodeLinker: node-modules`,ar=/^[A-Za-z]:[\\/]/;let or=null;function H(){return or||(or=Promise.all([import(`../lib-Ba55od_d.mjs`).then(e=>t(e.t(),1)),import(`../lib-ZKtnbCqH.mjs`).then(e=>t(e.t(),1)),import(`../lib-CM_BUxN8.mjs`).then(e=>t(e.default,1))]).then(([e,t,n])=>({Configuration:e.Configuration,Project:e.Project,Cache:e.Cache,StreamReport:e.StreamReport,structUtils:e.structUtils,ppath:t.ppath,npath:t.npath,xfs:t.xfs,getPluginConfiguration:n.getPluginConfiguration})),or)}var sr=class{makaioHome;constructor(e){this.makaioHome=e}async initialize(){try{let{npath:e,ppath:t,xfs:n}=await H(),r=e.toPortablePath(this.makaioHome),i=t.join(r,`package.json`);if(await n.mkdirpPromise(r),await this.ensureYarnRc(r,n,t),await n.existsPromise(i))return;await n.writeJsonPromise(i,{name:`makaio-packages`,version:`1.0.0`,private:!0,description:`Makaio installed packages`,dependencies:{}}),console.info(`[YarnPackageManager] Created package.json at %s`,i)}catch(e){throw Error(`Failed to initialize package.json`,{cause:e})}}async ensureYarnRc(e,t,n){let r=n.join(e,`.yarnrc.yml`),i=await t.existsPromise(r)?await t.readFilePromise(r,`utf8`):``,a=fr(i);i!==a&&(await t.writeFilePromise(r,a),console.info(`[YarnPackageManager] Wrote .yarnrc.yml at %s`,r))}async loadYarnState(){let{Configuration:e,Project:t,Cache:n,npath:r,getPluginConfiguration:i}=await H(),a=r.toPortablePath(this.makaioHome),o=await e.find(a,i()),{project:s}=await t.find(o,a);return{configuration:o,project:s,cache:await n.find(o)}}async runProjectInstall(e,t,n){let{StreamReport:r}=await H();if((await r.start({configuration:e,stdout:process.stdout},async e=>{await t.install({cache:n,report:e})})).hasErrors())throw Error(`Yarn install failed with errors`)}async parsePackageDescriptor(e){let{structUtils:t}=await H(),n=t.parseDescriptor(e);return n.range===`unknown`?t.makeDescriptor(n,`latest`):n}async installPackage(e){try{let{structUtils:t}=await H(),{configuration:n,project:r,cache:i}=await this.loadYarnState(),a=await this.parsePackageDescriptor(e),o=t.stringifyIdent(a),s=r.topLevelWorkspace.manifest.dependencies.get(a.identHash);r.topLevelWorkspace.manifest.dependencies.set(a.identHash,a),await this.runProjectInstall(n,r,i);let c=r.storedResolutions.get(a.descriptorHash);if(!c)throw Error(`Package resolution not found after installation`);let l=r.storedPackages.get(c);if(!l)throw Error(`Package not found after installation`);let u=l.version??`unknown`;if(!(await this.readInstalledDescriptor(o)).hasDescriptor)throw s?r.topLevelWorkspace.manifest.dependencies.set(a.identHash,s):r.topLevelWorkspace.manifest.dependencies.delete(a.identHash),await this.runProjectInstall(n,r,i),Error(`Installed package ${o} does not contain a valid descriptor.json`);return console.info(`[YarnPackageManager] Installed %s@%s`,o,u),u}catch(t){throw Error(`Failed to install ${e}`,{cause:t})}}async uninstallPackage(e){try{let{structUtils:t}=await H(),{configuration:n,project:r,cache:i}=await this.loadYarnState(),a=t.parseIdent(e);if(!r.topLevelWorkspace.manifest.dependencies.delete(a.identHash))throw Error(`Package ${e} not found in dependencies`);await this.runProjectInstall(n,r,i),console.info(`[YarnPackageManager] Uninstalled %s`,e)}catch(t){throw Error(`Failed to uninstall ${e}`,{cause:t})}}async listPackages(){try{let{xfs:e,npath:t,ppath:n,structUtils:r}=await H(),i=t.toPortablePath(this.makaioHome),a=n.join(i,`package.json`);if(!await e.existsPromise(a))return[];let{project:o}=await this.loadYarnState(),s=[];for(let[,e]of o.topLevelWorkspace.manifest.dependencies){let t=r.stringifyIdent(e),n=o.storedResolutions.get(e.descriptorHash),i=(n?o.storedPackages.get(n):void 0)?.version??r.parseRange(e.range).selector,a=await this.readInstalledDescriptor(t);a.hasDescriptor&&s.push({name:t,version:i,hasDescriptor:!0,...a.serverImportPath!==void 0&&{serverImportPath:a.serverImportPath}})}return s}catch(e){throw Error(`Failed to list packages`,{cause:e})}}async ensureFrameworkDependency(e){let t=ur(e);try{let{structUtils:e}=await H(),{configuration:n,project:r,cache:i}=await this.loadYarnState(),a=e.makeDescriptor(e.parseIdent(`@makaio/framework`),t);if(r.topLevelWorkspace.manifest.dependencies.get(a.identHash)?.range===t)return;r.topLevelWorkspace.manifest.dependencies.set(a.identHash,a),await this.runProjectInstall(n,r,i),console.info(`[YarnPackageManager] Ensured @makaio/framework@%s`,t)}catch(e){throw Error(`Failed to ensure @makaio/framework@${t}`,{cause:e})}}async getLatestVersion(e){return this.resolvePackageVersion(e)}async readInstalledDescriptor(e){let t=await this.readInstalledExtensionDescriptor(e);if(t===null)return{hasDescriptor:!1};let n=await this.resolveInstalledServerEntrypoint(e,t);return{hasDescriptor:!0,...n!==void 0&&{serverImportPath:n}}}async resolveInstalledServerEntrypoint(e,t){let n=t.entrypoints?.server;if(n!==void 0)return $n(A.join(this.makaioHome,`node_modules`,...e.split(`/`)),`server`,n)}async readInstalledExtensionDescriptor(e){let t=A.join(this.makaioHome,`node_modules`,...e.split(`/`),`descriptor.json`),n;try{let e=await k.readFile(t,`utf-8`);n=JSON.parse(e)}catch(e){if(e instanceof SyntaxError||pr(e))return null;throw e}let r=Te(n);return r.success?r.data:null}async listInstalledExtensionDescriptors(){let e=A.join(this.makaioHome,`package.json`),t;try{let n=await k.readFile(e,`utf-8`);t=JSON.parse(n)}catch(e){if(pr(e))return[];throw e}let n=Object.keys(t.dependencies??{});return(await Promise.all(n.map(async e=>{let t=await this.readInstalledExtensionDescriptor(e);return t===null?null:{npmName:e,version:await this.readInstalledPackageVersion(e),descriptor:t}}))).filter(e=>e!==null)}async readInstalledPackageVersion(e){let t=A.join(this.makaioHome,`node_modules`,...e.split(`/`),`package.json`);try{let e=await k.readFile(t,`utf-8`),n=JSON.parse(e);return typeof n.version==`string`?n.version:`unknown`}catch{return`unknown`}}async readManifestSnapshot(){let e=A.join(this.makaioHome,`package.json`),t=await k.readFile(e,`utf-8`);return JSON.parse(t)}async writeManifestAndReinstall(e){let t=A.join(this.makaioHome,`package.json`);await k.writeFile(t,`${JSON.stringify(e,null,2)}\n`,`utf-8`);let{configuration:n,project:r,cache:i}=await this.loadYarnState();await this.runProjectInstall(n,r,i)}async resolvePackageVersion(e){try{let{StreamReport:t}=await H(),{configuration:n,project:r}=await this.loadYarnState(),i=await this.parsePackageDescriptor(e),a=`unknown`;return await t.start({configuration:n,stdout:process.stdout},async e=>{let t=n.makeResolver(),o=await t.getCandidates(i,{},{project:r,resolver:t,report:e});if(o.length>0){let e=o[0];a=e.reference.match(/^npm:(.+)$/)?.[1]??e.reference}}),a}catch(t){throw Error(`Failed to resolve version for ${e}`,{cause:t})}}};function cr(e,t){return!t||t===`latest`?e:`${e}@${t}`}function lr(e){if(e.startsWith(`@`)){let t=e.indexOf(`/`);if(t===-1)return e;let n=e.indexOf(`@`,t+1);return n===-1?e:e.slice(0,n)}let t=e.indexOf(`@`);return t===-1?e:e.slice(0,t)}function ur(e){return e.localPackagePath?`portal:${dr(e.localPackagePath)}`:e.versionRange}function dr(e){let t=(ar.test(e)?e:A.resolve(e)).replace(/\\/g,`/`);return ar.test(t)?`/${t}`:t}function fr(e){let t=e.split(/\r?\n/),n=!1,r=t.map(e=>/^\s*nodeLinker\s*:/.test(e)?(n=!0,ir):e);if(!n){let t=e.trimEnd();return`${t}${t.length>0?`
1
+ import{i as e,o as t,t as n}from"../chunk-DTipWd-i.mjs";import{t as r}from"../semver-CIhHqMkw.mjs";import{RuntimeNamespace as i,RuntimeSubjects as a}from"./bus/runtime/namespace.mjs";import{ExplicitDescriptorDiscovery as o,FilesystemDescriptorDiscovery as s,MergedDescriptorDiscovery as c}from"./extension-discovery.mjs";import{MAKAIO_CONFIG_FILE_ENV as l,MAKAIO_HOME_ENV as u,buildConfiguredRuntimeOptions as d,createMakaioConfigDiscovery as f,defineMakaioConfig as p,loadMakaioConfig as m,parseMakaioConfig as h,resolveMakaioConfigPath as g,resolveMakaioHome as _,shouldIncludeExtension as v}from"./makaio-config.mjs";import{t as y}from"../descriptor-to-package-DdpjpT7n.mjs";import{a as b,c as x,i as S,n as C,o as w,r as T,s as E,t as ee}from"../load-extensions-Cze1RHcG.mjs";import{i as te,o as ne,r as re,s as ie,t as ae}from"../workflow-worker-dH70EbjE.mjs";import{createRequire as oe}from"node:module";import{z as D}from"zod";import{execFile as se}from"node:child_process";import{promisify as ce}from"node:util";import{fileURLToPath as le,pathToFileURL as O}from"node:url";import*as k from"node:fs/promises";import*as A from"node:path";import j from"node:path";import*as M from"node:crypto";import{createHash as N}from"node:crypto";import*as P from"node:fs";import{existsSync as F,readFileSync as ue}from"node:fs";import{createBusNamespace as de}from"@makaio/framework/core";import{ChannelClosedError as fe,MakaioBus as pe,openChannel as me,projectSubjectTelemetryFacts as he}from"@makaio/framework/bus";import{AIModelSchema as ge,AdapterSubjects as _e,BUILT_IN_THIN_WORKFLOW_PROVIDER_ID as ve,ConfigSchema as I,ConfigSubjects as L,CredentialSubjects as ye,FrameworkContractNamespaces as be,FrameworkStorageNamespaces as xe,SubjectTelemetrySubjects as Se,isDetachedDescriptor as Ce,registerWorkerNodeProvider as we,safeParseExtensionDescriptor as Te,unregisterWorkerNodeProvider as Ee,versionSatisfies as De}from"@makaio/framework/contracts";import{DispatchingAuth as Oe,E2EAuth as ke,HmacAuth as Ae,WebSocketClientTransport as je}from"@makaio/framework/node/transports";import{BaseService as Me}from"@makaio/framework/service-base";import{uniqueIndex as Ne}from"drizzle-orm/sqlite-core";import{uniqueIndex as Pe}from"drizzle-orm/pg-core";import{STORAGE_ENGINE_URL_HINTS as Fe,defineDialectSchema as Ie,defineDualTable as Le,findStorageEngine as Re,getDatabaseDialect as ze,getRawSqlExecutor as Be,getStorageEngine as Ve,registerDrizzleHandlers as He,registerStorageEngine as Ue,resolveSchema as We,resolveStorageEngine as Ge,resolveStorageEngineForUrl as Ke}from"@makaio/framework/storage/drizzle";import{and as qe,eq as R,sql as z}from"drizzle-orm";import{parseStoredCredentialRef as Je}from"@makaio/framework/contracts/config";import{AdapterRuntimeSubjects as Ye,registerAdapterRuntimeIdentityHandlers as Xe}from"@makaio/framework/services/adapter-runtime";import{buildProviderContext as Ze}from"@makaio/framework/services/provider-context";import*as Qe from"node:os";import{ProviderStorageSubjects as $e}from"@makaio/framework/services/settings/storage";import{isRecord as et}from"@makaio/framework/utils";import{BootNamespace as tt,ExtensionCoordinator as nt,ExtensionNamespace as rt,KernelNamespace as it,coalesceExtensionOverrides as at,createShutdownSequence as ot,filterEligibleExtensions as st}from"@makaio/framework/kernel";import{AdapterSubsystemSubjects as ct}from"@makaio/framework/services/adapter-subsystem";import{CachedRegistryFetcher as lt,FallbackRegistryFetcher as ut,ModelRegistrySchema as dt,ProviderModelOverrideSchema as ft,mergeModelMetadata as pt}from"@makaio/framework/services/model-registry";import{createClientsCorePackage as mt}from"@makaio/framework/clients";import{Readable as ht,Transform as gt}from"node:stream";import{pipeline as _t}from"node:stream/promises";import{createDatabaseClient as vt}from"@makaio/framework/storage/drizzle/client";import{AdapterSubsystemToken as yt,FileAdapterConfigRepository as bt,createAdapterSubsystemContributionProcessor as xt,createAdapterSubsystemPackage as St}from"@makaio/framework/adapter-subsystem";import{loadOrCreateMachineIdentity as Ct,loadOrCreateMachineIdentity as wt,machineKeysExist as Tt,validateMachineKeys as Et}from"@makaio/framework/node/machine-identity";import{resolveWorkspaceRoot as Dt}from"@makaio/framework/utils/workspace-root";import{Hono as Ot}from"hono";import{CliNamespace as kt}from"@makaio/framework/kernel/cli";import{startBusServer as At}from"@makaio/framework/node/bus-server";import{WebSocketServer as jt}from"ws";import{ConfigProvider as Mt}from"@makaio/framework/providers";import{KernelSubjects as B}from"@makaio/framework/kernel/namespace";import{FrameworkServicesCoreNamespaces as Nt,SessionOrchestratorToken as Pt,createArtifactKindContributionProcessor as Ft,createArtifactLifecycleHookContributionProcessor as It,createFacetNamespaceContributionProcessor as Lt,createModelRegistryPackage as Rt,createSurfaceBindingContributionProcessor as zt,createToolContributionProcessor as Bt,createTransitionContributionProcessor as Vt,createWorkflowBlockContributionProcessor as Ht,frameworkCorePackages as Ut}from"@makaio/framework/services";import{createLogImportContributionProcessor as Wt,logImportRegistryPackage as Gt}from"@makaio/framework/services/log-import";import{createWorkflowEnginePackage as Kt}from"@makaio/framework/workflow-engine/package";import{PreferenceValueSchema as qt,PreferencesSubjects as Jt}from"@makaio/framework/services/preferences";import{resolveConnectorCredentials as Yt,resolveCredentialRef as Xt}from"@makaio/framework/adapters/config";import{DefinitionSubjects as Zt}from"@makaio/framework/services/definition";import{ProviderRuntimeSubjects as Qt}from"@makaio/framework/services/provider-runtime";import{SettingsSubjects as $t}from"@makaio/framework/services/settings/namespace";import{parseWorkspaceGlobs as en}from"@makaio/framework/utils/workspace-packages";import{serveStatic as tn}from"@hono/node-server/serve-static";function nn(e){return e.on(_e.getCapabilities,async t=>{let{adapterName:n,adapterId:r}=t.payload;if(r){await t.next();return}if(n){let r=await e.requestOptional(Ye.resolveId,{adapterName:n}),i=r.handled?r.data.adapterId:void 0;i&&(t.payload.adapterId=i)}await t.next()},{priority:20})}function rn(e){let{coordinator:t,configRepository:n,platformDefaults:r}=e,i=St({configRepository:n,coordinator:t,platformDefaults:r});return t.registerContributionProcessor(xt({getAdapterSubsystemService:()=>t.getExtensionService(yt)})),{adapterSubsystemPackage:i}}function an(e){let{bus:t,currentMachineId:n}=e,r=Xe(t,{currentMachineId:n,listKnownAdapterNames:e.listKnownAdapterNames??(async()=>{let{configs:e}=await t.request(ct.listAdapterConfigs,{});return e.map(e=>e.name)})}),i=nn(t);return{cleanup:()=>{r.cleanup(),i()}}}function on(e=`sqlite`){let{migrations:t}=Ve(e);return t.resolveSourceChainDir?.()??j.resolve(import.meta.dirname,`..`,t.chainDirName)}var sn=class extends Error{expectedDialect;journalDialect;constructor(e,t,n,r){super(`Migration journal at ${r} declares dialect '${n??`unknown`}', but the target database speaks '${e}'. Point the runner at a migrations directory generated for '${e}' (journal dialect '${t}').`),this.name=`MigrationDialectMismatchError`,this.expectedDialect=e,this.journalDialect=n}};function cn(e={}){let t=typeof e==`string`?void 0:e.expectedDialect,n=typeof e==`string`?e:e.migrationsDir??on(t),r=j.join(n,`meta`,`_journal.json`);if(!F(r))throw Error(`Cannot find migrations journal at ${r}`);let i=JSON.parse(ue(r,`utf-8`));if(t!==void 0){let e=Ve(t).migrations.journalDialect;if(i.dialect!==e)throw new sn(t,e,i.dialect,r)}return i.entries.map(e=>{let t=ue(j.join(n,`${e.tag}.sql`),`utf-8`);return{tag:e.tag,sql:t.split(`--> statement-breakpoint`),folderMillis:e.when,hash:N(`sha256`).update(t).digest(`hex`),bps:e.breakpoints}})}function ln(e){return e.replace(/--.*$/gm,``).trim()}async function un(e,t){try{await e.run(z.raw(`ROLLBACK`))}catch(e){console.error(`[storage-migrations] Failed to roll back migration transaction`,{...t,rollbackError:e})}}async function dn(e){let{migrations:t}=e.engine;if(await e.session.run(z.raw(t.beginTransactionStatement)),t.acquireTransactionLock)try{await t.acquireTransactionLock(e.session,e.tableName)}catch(t){throw await un(e.session,{migrationsTable:e.tableName}),t}}async function fn(e){let t=e.engine.migrations.acquireTransactionLock!==void 0;t&&await dn(e);try{await e.session.run(z.raw(e.engine.migrations.buildLedgerDdl(e.tableName)));let n=await e.session.all(z`SELECT hash FROM ${e.tableId}`);return t&&await e.session.run(z.raw(`COMMIT`)),new Set(n.map(e=>e.hash))}catch(n){throw t&&await un(e.session,{migrationsTable:e.tableName}),n}}async function pn(e,t){try{await e.session.run(z`INSERT INTO ${e.tableId} ("hash", "created_at") VALUES (${t.hash}, ${t.folderMillis})`),await e.session.run(z.raw(`COMMIT`))}catch(e){throw console.error(`[storage-migrations] Failed to finalize migration`,{hash:t.hash,folderMillis:t.folderMillis,error:e}),e}}async function mn(e,t){return e.engine.migrations.acquireTransactionLock===void 0||(await e.session.all(z`SELECT hash FROM ${e.tableId} WHERE hash = ${t.hash}`)).length===0?!1:(console.warn(`[storage-migrations] Migration already recorded by a concurrent runner, skipping`,{hash:t.hash,folderMillis:t.folderMillis}),await e.session.run(z.raw(`COMMIT`)),!0)}async function hn(e,t){await e.session.run(z.raw(`ROLLBACK`)),await dn(e),!await mn(e,t)&&await pn(e,t)}async function gn(e,t){await dn(e);try{if(await mn(e,t))return;for(let[n,r]of t.sql.entries())if(ln(r))try{await e.session.run(z.raw(r))}catch(i){if(n===0&&/^\s*CREATE\s/i.test(r)&&e.engine.errors.isDuplicateObjectError(i)){if(t.sql.length>1)throw Error(`Cannot adopt multi-statement migration '${t.tag}' because its first schema object already exists. Reset the database or provide an incremental migration.`,{cause:i});console.warn(`[storage-migrations] Schema object already exists, adopting into ledger`,{hash:t.hash,folderMillis:t.folderMillis,statementIndex:n}),await hn(e,t);return}throw console.error(`[storage-migrations] Failed to apply migration statement`,{hash:t.hash,folderMillis:t.folderMillis,statementIndex:n,statement:r,error:i}),i}await pn(e,t)}catch(n){throw await un(e.session,{hash:t.hash,folderMillis:t.folderMillis}),n}}async function _n(e,t,n){let r=Be(e),i=Ve(r.dialect),a=n??i.migrations.defaultLedgerTable;await r.withSession(async e=>{let n={session:e,engine:i,tableName:a,tableId:z.identifier(a)},r=await fn(n);for(let e of t)r.has(e.hash)||(await gn(n,e),r.add(e.hash))})}async function vn(e,t={}){await _n(e,cn({migrationsDir:t.migrationsDir,expectedDialect:ze(e)})),await Ge(e).fts.provisionSearchIndex(e)}var yn=class{configPath;constructor(e){this.configPath=A.join(e,`config.json`)}async getConfig(){try{let e=await k.readFile(this.configPath,`utf-8`);return I.parse(JSON.parse(e))}catch(e){if(e.code===`ENOENT`)return I.parse({});if(e instanceof SyntaxError||e instanceof Error&&e.name===`ZodError`)return console.warn(`[FileConfigStorage] Failed to parse config, falling back to defaults:`,e),I.parse({});throw e}}async saveConfig(e){let t=A.dirname(this.configPath);await k.mkdir(t,{recursive:!0}),await k.writeFile(this.configPath,JSON.stringify(e,null,2),{encoding:`utf-8`,mode:384}),await k.chmod(this.configPath,384)}};function bn(e){try{let t=A.resolve(Dt(e),`static/model-registry.yaml`);return F(t)?t:void 0}catch{return}}async function xn(e,t){await new Promise((n,r)=>{if(e.address()){n();return}let i=e=>{if(o(),e.code===`EADDRINUSE`){r(Error(`Port ${t} is already in use`));return}r(e)},a=()=>{o(),n()},o=()=>{e.off(`error`,i),e.off(`listening`,a)};e.once(`error`,i),e.once(`listening`,a)}),e.on(`error`,e=>{console.error(`[HttpServer] Post-bind error:`,e)})}function Sn(e){let t=e.address();if(typeof t==`object`&&t&&`port`in t)return t.port;throw Error(`HTTP server is not bound to a TCP address`)}function Cn(e,t){let n=e,r=!1;return{fetch:(e,i,a)=>{if(!r)return new Response(`Makaio runtime is booting`,{status:503,headers:{"Retry-After":`1`}});let{pathname:o}=new URL(e.url);return t?.health&&e.method===`GET`&&o===`/health`?Response.json(t.health()):e.method===`GET`&&o===`/bus`?new Response(`WebSocket endpoint`,{status:426,headers:{Upgrade:`websocket`}}):n.fetch(e,i,a)},markReady(){r=!0},replaceApp(e){n=e}}}const wn=[`extension`,`static-fallback`];function Tn(e){let t=[];function n(e){let t=new Ot,n=[...e].sort((e,t)=>wn.indexOf(e.phase)-wn.indexOf(t.phase));for(let e of n)e.mount(t);return t}function r(){return n(t)}function i(r){e&&e.replaceApp(n(r)),t=r}return{add(e){i([...t,e])},remove(e){let n=t.filter(t=>t.owner!==e);n.length!==t.length&&i(n)},build:r,get contributions(){return[...t]}}}function En(e,t){if(!(e instanceof Error))return!1;let{rootPackageName:n,subpath:r}=On(t),i=(r===void 0?[t]:[t,n]).flatMap(e=>[`Cannot find package '${e}'`,`Cannot find module '${e}'`,`Cannot find package "${e}"`,`Cannot find module "${e}"`]),a=e;return(a.code===`ERR_MODULE_NOT_FOUND`||a.code===`MODULE_NOT_FOUND`)&&i.some(t=>e.message.includes(t))||a.code===`ERR_PACKAGE_PATH_NOT_EXPORTED`&&r!==void 0&&e.message.includes(`Package subpath '${r}' is not defined by "exports"`)&&kn(e.message,n)?!0:i.some(t=>e.message.includes(t))}async function Dn(e){try{return await import(e)}catch(t){if(En(t,e))return null;throw t}}function On(e){let t=e.split(`/`);return e.startsWith(`@`)?{rootPackageName:t.slice(0,2).join(`/`),subpath:t.length>2?`./${t.slice(2).join(`/`)}`:void 0}:{rootPackageName:t[0]??e,subpath:t.length>1?`./${t.slice(1).join(`/`)}`:void 0}}function kn(e,t){let n=t,r=t.replaceAll(`/`,`\\`);return e.includes(`/${n}/package.json`)||e.includes(`\\${r}\\package.json`)}function An(e){let t=e.url?.split(`?`)[0]??``;return t===`/bus`?!0:(t===`/`||t===``)&&e.headers.origin===void 0}function jn(e,t){return(n,r,i)=>{if(!An(n))return;let a=e();if(!a||!t()){r.destroy();return}a.handleUpgrade(n,r,i,e=>{a.emit(`connection`,e,n)})}}var Mn=class{options;busServer=null;websocketServer=null;upgradeHandlerServer=null;upgradeHandler=null;busReady=!1;connecting=!1;constructor(e){this.options=e}get dispatchingAuth(){return this.options.auth instanceof Oe?this.options.auth:void 0}async connect(e,t){if(this.connecting||this.busServer||this.websocketServer)throw Error(`[BusServerTransport] connect() called while transport is already connected or connecting`);if(this.options.httpServer.address()===null)throw Error(`[BusServerTransport] httpServer must already be listening before connect() is called`);this.connecting=!0;try{let t=new jt({noServer:!0});this.websocketServer=t;let n=jn(()=>this.websocketServer,()=>this.busReady);this.options.httpServer.on(`upgrade`,n),this.upgradeHandlerServer=this.options.httpServer,this.upgradeHandler=n,this.busServer=await At({websocket:t,bus:e,auth:this.options.auth,loopbackName:this.options.loopbackName??`node`}),this.busReady=!0}catch(e){throw await this.stopBusServer(`startup error`),this.detachUpgradeHandler(),await this.stopWebSocketServer(`startup error`),e}finally{this.connecting=!1}}async disconnect(){await this.stopBusServer(`shutdown`),this.detachUpgradeHandler(),await this.stopWebSocketServer(`shutdown`)}async stopBusServer(e){this.busReady=!1,this.busServer&&=(await this.busServer.stop().catch(t=>{console.error(`[BusServerTransport] Failed to stop bus server during ${e}:`,t)}),null)}detachUpgradeHandler(){this.upgradeHandlerServer&&this.upgradeHandler&&this.upgradeHandlerServer.off(`upgrade`,this.upgradeHandler),this.upgradeHandlerServer=null,this.upgradeHandler=null}async stopWebSocketServer(e){this.websocketServer&&=(await new Promise((e,t)=>{this.websocketServer.close(n=>n?t(n):e())}).catch(t=>{t instanceof Error&&t.message===`The server is not running`||console.error(`[BusServerTransport] Failed to close WebSocket server during ${e}:`,t)}),null)}},Nn=class extends Mt{keysDir;constructor(e,t){super(e),this.keysDir=A.join(t,`keys`)}async getConfig(e){let t=await super.getConfig(e);return t.bus?.remote&&!t.bus.remote.secret&&(t.bus.remote.secret=this.generateSecret(),(await this.getStoredConfig()).bus?.remote?.url===t.bus.remote.url&&await this.saveConfig(await this.prepareConfigForPersistence(t))),t}generateSecret(){return M.randomBytes(32).toString(`base64`)}async getMachineId(){return(await wt(this.keysDir)).machineId}getEnv(e){return process.env[e]}};function Pn(e,t){return{extensions:e.discovery??new s(void 0,{extensionsDir:j.join(t,`extensions`),nodeModulesDir:j.join(t,`node_modules`)})}}function Fn(e){return F(j.join(e,`meta`,`_journal.json`))}function In(e,t={}){let{moduleDir:n=import.meta.dirname,getMigrationsFolder:r=on}=t,i=Ve(e).migrations.chainDirName,a=[],o=j.resolve(n,`..`,i);if(Fn(o))return o;a.push(o);try{let t=r(e);if(Fn(t))return t;a.push(t)}catch(t){a.push(`getMigrationsFolder('${e}') unavailable: ${t instanceof Error?t.message:String(t)}`)}throw Error(`resolveBundledMigrationsDir: no '${e}' migrations directory with meta/_journal.json found. Probed: ${a.join(`; `)}. Pass an explicit migrations directory (boot option 'centralMigrationsDir' or InitializeNodeDatabaseOptions.migrationsDir) when migrations are staged elsewhere.`)}function Ln(e){if(process.platform===`win32`)return!0;let t=e?.code;return t===`ENOSYS`||t===`EINVAL`}function Rn(e){return e===void 0||e.trim()===``?void 0:e}function zn(e){try{let t=new URL(e);if(t.host!==``)return`${t.protocol}//${t.host}${t.pathname}`}catch{}let t=e.indexOf(`:`);return t===-1?`<unparseable database URL>`:`${e.slice(0,t+1)}…`}async function Bn(e,t,n){let r;try{r=await import(O(oe(A.resolve(t,`package.json`)).resolve(e.packageName)).href)}catch(t){throw Error(`initializeNodeDatabase: the database URL from ${n} targets the '${e.dialect}' storage engine, but '${e.packageName}' could not be loaded. Install ${e.packageName} in the host application, or pass its already-loaded storageEngine via the 'database.engines' boot option.`,{cause:t})}let i=r.storageEngine;if(i===void 0||i.dialect!==e.dialect)throw Error(`initializeNodeDatabase: '${e.packageName}' does not provide a storage engine for dialect '${e.dialect}'. Auto-resolved engine packages must export 'storageEngine: StorageEngine' with a matching dialect.`);Re(e.dialect)===void 0&&Ue(i)}async function Vn(e){let t=Rn(e.database?.url),n=t??Rn(process.env.MAKAIO_DATABASE_URL);if(n!==void 0){let r=t===void 0?`the MAKAIO_DATABASE_URL environment variable`:`the 'database.url' boot option`,i=Ke(n);if(i.kind===`missing-engine`&&(await Bn(i,e.database?.enginePackageImportBasePath??process.cwd(),r),i=Ke(n)),i.kind!==`engine`){let e=Fe.map(e=>e.packageName).join(`, `);throw Error(`initializeNodeDatabase: unsupported database URL '${zn(n)}' from ${r}. URL targets require a storage engine that claims the URL (e.g. postgres:// / postgresql:// via ${e}); SQLite targets are configured via the dbPath option or MAKAIO_DATABASE_PATH.`)}return{kind:`url`,url:n,dialect:i.engine.dialect}}let r=A.resolve(Rn(e.dbPath)??Rn(process.env.MAKAIO_DATABASE_PATH)??A.join(e.makaioHome,`makaio.db`));return{kind:`file`,dbPath:r,url:O(r).href}}async function Hn(e){for(let t of e.database?.engines??[])Ue(t);let t=await Vn(e);if(t.kind===`url`){let n=await vt({url:t.url,postgres:{poolMax:e.database?.poolMax}});try{let r=e.migrationsDir??In(t.dialect);return await vn(n.db,{migrationsDir:r}),{databaseClient:n}}catch(e){throw await n.close(),e}}let{dbPath:n}=t,r=A.dirname(n);await P.promises.mkdir(r,{recursive:!0});let i=await vt({url:t.url});try{await vn(i.db,{migrationsDir:e.migrationsDir});try{await P.promises.chmod(n,384)}catch(e){if(!Ln(e))throw e;console.warn(`[initializeNodeDatabase] Failed to set SQLite file permissions (continuing; this may be unsupported on Windows):`,e)}return{databaseClient:i,dbPath:n}}catch(e){throw await i.close(),e}}const Un=D.object({npmName:D.string(),version:D.string(),source:D.enum([`new`,`upgraded`,`already-present`])}),Wn=D.object({npmName:D.string(),reason:D.string()}),Gn=D.object({success:D.boolean(),packageName:D.string(),version:D.string().optional(),restartRequired:D.boolean(),error:D.string().optional(),installed:D.array(Un).optional(),skipped:D.array(Wn).optional(),warnings:D.array(D.string()).optional()}),Kn=D.object({success:D.boolean(),packageName:D.string(),error:D.string().optional(),restartRequired:D.boolean()}),qn=D.object({name:D.string(),version:D.string(),description:D.string().optional(),hasDescriptor:D.boolean().default(!1),serverImportPath:D.string().min(1).optional()}),Jn=D.object({packageName:D.string(),latestVersion:D.string(),success:D.boolean(),error:D.string().optional()}),Yn=D.object({name:D.string(),displayName:D.string(),description:D.string(),icon:D.string().optional(),tags:D.array(D.string()).optional(),descriptorName:D.string().min(1).optional()}),Xn=D.object({$schema:D.string(),updatedAt:D.string(),adapters:D.array(Yn),extensions:D.array(Yn)}),Zn=D.object({name:D.string(),currentVersion:D.string(),latestVersion:D.string(),description:D.string().optional()}),Qn=de(`packages`,{list:{request:D.object({}),response:D.object({packages:D.array(qn)})},install:{request:D.object({packageName:D.string().optional(),packageNames:D.array(D.string()).min(1).optional(),source:D.enum([`npm`,`local`]).optional(),force:D.boolean().optional()}).refine(e=>e.packageName!==void 0||e.packageNames!==void 0,{message:`Expected packageName or packageNames`}),response:Gn},uninstall:{request:D.object({packageName:D.string()}),response:Kn},getLatestVersion:{request:D.object({packageName:D.string()}),response:Jn},getRegistry:{request:D.object({}),response:Xn},checkUpdates:{request:D.object({}),response:D.object({updates:D.array(Zn)})},installed:D.object({packageName:D.string(),version:D.string()}),uninstalled:D.object({packageName:D.string()})}),V=Qn.subjects;async function $n(e,t,n){if(!A.isAbsolute(e))return;let r;try{r=await k.realpath(e)}catch{return}let i=er(t,n),a=[A.resolve(r,`src`,`${i}.ts`),A.resolve(r,`dist`,`${i}.mjs`)];for(let e of a){let t=await tr(e);if(t!==void 0&&nr(t,r))return t}}function er(e,t){return t===!0?e:t}async function tr(e){try{return await k.realpath(e)}catch{return}}function nr(e,t){let n=A.relative(t,e);return n.length>0&&!n.startsWith(`..`)&&!A.isAbsolute(n)}var rr=class{extensionsDir;constructor(e){this.extensionsDir=A.resolve(e)}async install(e){try{let t=A.resolve(e.endsWith(`descriptor.json`)?A.dirname(e):e),n=await k.realpath(t),r=await this.readDescriptor(n);Ce(r)||await this.validateEntrypoints(n,r.entrypoints);let i=this.linkPathFor(r.name);await k.mkdir(A.dirname(i),{recursive:!0});try{if((await k.lstat(i)).isSymbolicLink())await k.unlink(i);else throw Error(`${i} already exists and is not a symlink`)}catch(e){if(e.code!==`ENOENT`)throw e}let a=process.platform===`win32`?`junction`:`dir`;return await k.symlink(n,i,a),{success:!0,packageName:r.name,version:r.version,restartRequired:!0}}catch(e){return{success:!1,packageName:``,error:e instanceof Error?e.message:String(e),restartRequired:!1}}}async uninstall(e){try{let t=this.linkPathFor(e);if(await k.unlink(t),e.startsWith(`@`)){let e=A.dirname(t);(await k.readdir(e).catch(()=>null))?.length===0&&await k.rmdir(e).catch(()=>{})}return{success:!0,packageName:e,restartRequired:!0}}catch(t){return{success:!1,packageName:e,error:t instanceof Error?t.message:String(t),restartRequired:!1}}}async list(){try{await k.access(this.extensionsDir)}catch{return[]}let e=await k.readdir(this.extensionsDir),t=[];for(let n of e){let e=A.join(this.extensionsDir,n);if(n.startsWith(`@`)){let n=await k.readdir(e).catch(()=>[]);for(let r of n){let n=A.join(e,r),i=await this.readLocalEntry(n);i!==null&&t.push(i)}}else{let n=await this.readLocalEntry(e);n!==null&&t.push(n)}}return t}async readLocalEntry(e){try{if(!(await k.lstat(e)).isSymbolicLink())return null;let t=await k.readlink(e),n=await k.realpath(A.resolve(A.dirname(e),t)),r=A.join(n,`descriptor.json`),i=await k.readFile(r,`utf-8`),a=Te(JSON.parse(i));if(!a.success)return null;let o=a.data.entrypoints?.server,s=o===void 0?void 0:await $n(n,`server`,o);return{name:a.data.name,version:a.data.version,sourcePath:n,source:`local`,...s!==void 0&&{serverImportPath:s}}}catch{return null}}async readDescriptor(e){let t=A.join(e,`descriptor.json`),n=await k.readFile(t,`utf-8`).catch(()=>{throw Error(`descriptor.json not found at ${t}`)}),r=Te(JSON.parse(n));if(!r.success)throw Error(`Invalid descriptor.json: ${r.error.message}`);return r.data}async validateEntrypoints(e,t){await Promise.all(Object.entries(t).map(async([t,n])=>{if(n!==void 0&&await $n(e,t,n)===void 0){let e=er(t,n);throw Error(`${t} entrypoint "${e}" has no resolvable candidate: neither src/${e}.ts nor dist/${e}.mjs exists within the extension root`)}}))}linkPathFor(e){let t=A.resolve(this.extensionsDir,...e.split(`/`)),n=A.relative(this.extensionsDir,t);if(n===``||n.startsWith(`..`)||A.isAbsolute(n))throw Error(`Invalid extension name: ${e}`);return t}};const ir=`nodeLinker: node-modules`,ar=/^[A-Za-z]:[\\/]/;let or=null;function H(){return or||(or=Promise.all([import(`../lib-Ba55od_d.mjs`).then(e=>t(e.t(),1)),import(`../lib-ZKtnbCqH.mjs`).then(e=>t(e.t(),1)),import(`../lib-CM_BUxN8.mjs`).then(e=>t(e.default,1))]).then(([e,t,n])=>({Configuration:e.Configuration,Project:e.Project,Cache:e.Cache,StreamReport:e.StreamReport,structUtils:e.structUtils,ppath:t.ppath,npath:t.npath,xfs:t.xfs,getPluginConfiguration:n.getPluginConfiguration})),or)}var sr=class{makaioHome;constructor(e){this.makaioHome=e}async initialize(){try{let{npath:e,ppath:t,xfs:n}=await H(),r=e.toPortablePath(this.makaioHome),i=t.join(r,`package.json`);if(await n.mkdirpPromise(r),await this.ensureYarnRc(r,n,t),await n.existsPromise(i))return;await n.writeJsonPromise(i,{name:`makaio-packages`,version:`1.0.0`,private:!0,description:`Makaio installed packages`,dependencies:{}}),console.info(`[YarnPackageManager] Created package.json at %s`,i)}catch(e){throw Error(`Failed to initialize package.json`,{cause:e})}}async ensureYarnRc(e,t,n){let r=n.join(e,`.yarnrc.yml`),i=await t.existsPromise(r)?await t.readFilePromise(r,`utf8`):``,a=fr(i);i!==a&&(await t.writeFilePromise(r,a),console.info(`[YarnPackageManager] Wrote .yarnrc.yml at %s`,r))}async loadYarnState(){let{Configuration:e,Project:t,Cache:n,npath:r,getPluginConfiguration:i}=await H(),a=r.toPortablePath(this.makaioHome),o=await e.find(a,i()),{project:s}=await t.find(o,a);return{configuration:o,project:s,cache:await n.find(o)}}async runProjectInstall(e,t,n){let{StreamReport:r}=await H();if((await r.start({configuration:e,stdout:process.stdout},async e=>{await t.install({cache:n,report:e})})).hasErrors())throw Error(`Yarn install failed with errors`)}async parsePackageDescriptor(e){let{structUtils:t}=await H(),n=t.parseDescriptor(e);return n.range===`unknown`?t.makeDescriptor(n,`latest`):n}async installPackage(e){try{let{structUtils:t}=await H(),{configuration:n,project:r,cache:i}=await this.loadYarnState(),a=await this.parsePackageDescriptor(e),o=t.stringifyIdent(a),s=r.topLevelWorkspace.manifest.dependencies.get(a.identHash);r.topLevelWorkspace.manifest.dependencies.set(a.identHash,a),await this.runProjectInstall(n,r,i);let c=r.storedResolutions.get(a.descriptorHash);if(!c)throw Error(`Package resolution not found after installation`);let l=r.storedPackages.get(c);if(!l)throw Error(`Package not found after installation`);let u=l.version??`unknown`;if(!(await this.readInstalledDescriptor(o)).hasDescriptor)throw s?r.topLevelWorkspace.manifest.dependencies.set(a.identHash,s):r.topLevelWorkspace.manifest.dependencies.delete(a.identHash),await this.runProjectInstall(n,r,i),Error(`Installed package ${o} does not contain a valid descriptor.json`);return console.info(`[YarnPackageManager] Installed %s@%s`,o,u),u}catch(t){throw Error(`Failed to install ${e}`,{cause:t})}}async uninstallPackage(e){try{let{structUtils:t}=await H(),{configuration:n,project:r,cache:i}=await this.loadYarnState(),a=t.parseIdent(e);if(!r.topLevelWorkspace.manifest.dependencies.delete(a.identHash))throw Error(`Package ${e} not found in dependencies`);await this.runProjectInstall(n,r,i),console.info(`[YarnPackageManager] Uninstalled %s`,e)}catch(t){throw Error(`Failed to uninstall ${e}`,{cause:t})}}async listPackages(){try{let{xfs:e,npath:t,ppath:n,structUtils:r}=await H(),i=t.toPortablePath(this.makaioHome),a=n.join(i,`package.json`);if(!await e.existsPromise(a))return[];let{project:o}=await this.loadYarnState(),s=[];for(let[,e]of o.topLevelWorkspace.manifest.dependencies){let t=r.stringifyIdent(e),n=o.storedResolutions.get(e.descriptorHash),i=(n?o.storedPackages.get(n):void 0)?.version??r.parseRange(e.range).selector,a=await this.readInstalledDescriptor(t);a.hasDescriptor&&s.push({name:t,version:i,hasDescriptor:!0,...a.serverImportPath!==void 0&&{serverImportPath:a.serverImportPath}})}return s}catch(e){throw Error(`Failed to list packages`,{cause:e})}}async ensureFrameworkDependency(e){let t=ur(e);try{let{structUtils:e}=await H(),{configuration:n,project:r,cache:i}=await this.loadYarnState(),a=e.makeDescriptor(e.parseIdent(`@makaio/framework`),t);if(r.topLevelWorkspace.manifest.dependencies.get(a.identHash)?.range===t)return;r.topLevelWorkspace.manifest.dependencies.set(a.identHash,a),await this.runProjectInstall(n,r,i),console.info(`[YarnPackageManager] Ensured @makaio/framework@%s`,t)}catch(e){throw Error(`Failed to ensure @makaio/framework@${t}`,{cause:e})}}async getLatestVersion(e){return this.resolvePackageVersion(e)}async readInstalledDescriptor(e){let t=await this.readInstalledExtensionDescriptor(e);if(t===null)return{hasDescriptor:!1};let n=await this.resolveInstalledServerEntrypoint(e,t);return{hasDescriptor:!0,...n!==void 0&&{serverImportPath:n}}}async resolveInstalledServerEntrypoint(e,t){let n=t.entrypoints?.server;if(n!==void 0)return $n(A.join(this.makaioHome,`node_modules`,...e.split(`/`)),`server`,n)}async readInstalledExtensionDescriptor(e){let t=A.join(this.makaioHome,`node_modules`,...e.split(`/`),`descriptor.json`),n;try{let e=await k.readFile(t,`utf-8`);n=JSON.parse(e)}catch(e){if(e instanceof SyntaxError||pr(e))return null;throw e}let r=Te(n);return r.success?r.data:null}async listInstalledExtensionDescriptors(){let e=A.join(this.makaioHome,`package.json`),t;try{let n=await k.readFile(e,`utf-8`);t=JSON.parse(n)}catch(e){if(pr(e))return[];throw e}let n=Object.keys(t.dependencies??{});return(await Promise.all(n.map(async e=>{let t=await this.readInstalledExtensionDescriptor(e);return t===null?null:{npmName:e,version:await this.readInstalledPackageVersion(e),descriptor:t}}))).filter(e=>e!==null)}async readInstalledPackageVersion(e){let t=A.join(this.makaioHome,`node_modules`,...e.split(`/`),`package.json`);try{let e=await k.readFile(t,`utf-8`),n=JSON.parse(e);return typeof n.version==`string`?n.version:`unknown`}catch{return`unknown`}}async readManifestSnapshot(){let e=A.join(this.makaioHome,`package.json`),t=await k.readFile(e,`utf-8`);return JSON.parse(t)}async writeManifestAndReinstall(e){let t=A.join(this.makaioHome,`package.json`);await k.writeFile(t,`${JSON.stringify(e,null,2)}\n`,`utf-8`);let{configuration:n,project:r,cache:i}=await this.loadYarnState();await this.runProjectInstall(n,r,i)}async resolvePackageVersion(e){try{let{StreamReport:t}=await H(),{configuration:n,project:r}=await this.loadYarnState(),i=await this.parsePackageDescriptor(e),a=`unknown`;return await t.start({configuration:n,stdout:process.stdout},async e=>{let t=n.makeResolver(),o=await t.getCandidates(i,{},{project:r,resolver:t,report:e});if(o.length>0){let e=o[0];a=e.reference.match(/^npm:(.+)$/)?.[1]??e.reference}}),a}catch(t){throw Error(`Failed to resolve version for ${e}`,{cause:t})}}};function cr(e,t){return!t||t===`latest`?e:`${e}@${t}`}function lr(e){if(e.startsWith(`@`)){let t=e.indexOf(`/`);if(t===-1)return e;let n=e.indexOf(`@`,t+1);return n===-1?e:e.slice(0,n)}let t=e.indexOf(`@`);return t===-1?e:e.slice(0,t)}function ur(e){return e.localPackagePath?`portal:${dr(e.localPackagePath)}`:e.versionRange}function dr(e){let t=(ar.test(e)?e:A.resolve(e)).replace(/\\/g,`/`);return ar.test(t)?`/${t}`:t}function fr(e){let t=e.split(/\r?\n/),n=!1,r=t.map(e=>/^\s*nodeLinker\s*:/.test(e)?(n=!0,ir):e);if(!n){let t=e.trimEnd();return`${t}${t.length>0?`
2
2
  `:``}${ir}\n`}return`${r.join(`
3
3
  `).trimEnd()}\n`}function pr(e){if(typeof e!=`object`||!e||!(`code`in e))return!1;let t=e.code;return t===`ENOENT`||t===`ENOTDIR`}function mr(e){if(e.startsWith(`git+`))return{kind:`git`,raw:e,resolved:e};let t=e===`~`||e.startsWith(`~/`)||e.startsWith(`~\\`);if(e.startsWith(`~`)&&!t)throw Error(`Unsupported home-relative path syntax: ${e}`);return e.startsWith(`.`)||A.isAbsolute(e)||A.win32.isAbsolute(e)||t?{kind:`local`,raw:e,resolved:t?A.resolve(Qe.homedir(),e===`~`?`.`:e.slice(2)):A.resolve(e)}:{kind:`npm`,raw:e,resolved:e}}var hr=class{packages;names;constructor(e,t){this.packages=e,this.names=t}async resolve(e,t={}){let n=t.snapshot!==null,r=n?t.snapshot===void 0?await this.packages.readManifestSnapshot():t.snapshot:null;try{return await this.runBfs(e,t.force===!0)}catch(e){if(n)try{await this.packages.writeManifestAndReinstall(r)}catch(t){throw AggregateError([e,t],`Dependency resolution failed and rollback failed: ${vr(e)}`)}throw e}}async runBfs(e,t){let n=await this.readInstalledIndex(),r=e.map(e=>{let t=_r(e),n=gr(t.npmName);return{npmName:t.npmName,...n?{expectedDescriptorName:n}:{},...t.requiredRange?{requiredRange:t.requiredRange}:{},optional:!1,path:[t.npmName],root:!0}}),i=new Set,a=[],o=[],s=[];for(;r.length>0;){let e=r.shift(),s=i.has(e.npmName),c=n.byNpmName.get(e.npmName);if(s){if(c&&this.assertDescriptorMatches(e,c.descriptor),c&&this.descriptorRangeSatisfied(c.descriptor,e.requiredRange))continue;if(!c)throw Error(`Package ${e.npmName} was resolved but is missing from the installed index`)}if(c&&this.assertDescriptorMatches(e,c.descriptor),c&&this.shouldUseCurrentDescriptor(c.descriptor,e)){a.push({npmName:e.npmName,version:c.version,source:`already-present`}),await this.enqueueDependencies(r,e,c.descriptor),i.add(e.npmName);continue}let l=cr(e.npmName,e.requiredRange),u,d;try{u=await this.packages.installPackage(l);let r=await this.packages.readInstalledExtensionDescriptor(e.npmName);if(!r)throw Error(`Installed package ${e.npmName} does not contain a valid descriptor.json`);this.assertDescriptorMatches(e,r),this.assertDescriptorVersionSatisfies(e,r),await this.assertDependentsCompatible(e.npmName,r.version,n,t),d=r}catch(t){if(e.optional){o.push({npmName:e.npmName,reason:t instanceof Error?t.message:String(t)});continue}throw t}a.push({npmName:e.npmName,version:u,source:c?`upgraded`:`new`}),c={npmName:e.npmName,version:u,descriptor:d},n.byNpmName.set(e.npmName,c),await this.enqueueDependencies(r,e,d),i.add(e.npmName)}return{installed:a,skipped:o,warnings:s}}async readInstalledIndex(){let e=await this.packages.listInstalledExtensionDescriptors();return{byNpmName:new Map(e.map(e=>[e.npmName,e]))}}descriptorRangeSatisfied(e,t){return t===void 0||De(e.version,t)}shouldUseCurrentDescriptor(e,t){return t.root&&t.requiredRange===void 0?!1:this.descriptorRangeSatisfied(e,t.requiredRange)}assertDescriptorMatches(e,t){if(!(e.expectedDescriptorName===void 0||t.name===e.expectedDescriptorName))throw Error(`Installed package ${e.npmName} declares descriptor name "${t.name}", expected "${e.expectedDescriptorName}"`)}assertDescriptorVersionSatisfies(e,t){if(!this.descriptorRangeSatisfied(t,e.requiredRange))throw Error(`Installed package ${e.npmName} descriptor version ${t.version} does not satisfy ${t.name} ${e.requiredRange}`)}async assertDependentsCompatible(e,t,n,r){if(r)return;let i=[];for(let r of n.byNpmName.values())for(let n of r.descriptor.dependencies??[])await this.names.resolveNpmPackageName(n.name)===e&&!De(t,n.version)&&i.push(`${r.npmName} requires ${n.name} ${n.version}`);if(i.length>0)throw Error(`Cannot install ${e}; existing dependencies would be violated:\n${i.join(`
4
4
  `)}`)}async enqueueDependencies(e,t,n){for(let r of n.dependencies??[]){let n=await this.names.resolveNpmPackageName(r.name);if(t.path.includes(n))throw Error(`Circular dependency detected: ${[...t.path,n].join(` -> `)}`);e.push({npmName:n,expectedDescriptorName:r.name,requiredRange:r.version,optional:r.optional===!0,path:[...t.path,n],root:!1})}}};function gr(e){return e.startsWith(`@`)?void 0:e}function _r(e){let t=lr(e);if(t.length===e.length)return{npmName:t};let n=e.slice(t.length+1);return n===`latest`?{npmName:t}:{npmName:t,requiredRange:n}}function vr(e){return e instanceof Error?e.message:String(e)}var yr=class{registryClient;lookupMapPromise=null;constructor(e){this.registryClient=e}async resolveNpmPackageName(e){if(e.startsWith(`@`))return e;let t;try{t=await this.getLookupMap()}catch(t){throw Error(`Cannot resolve descriptor name "${e}": package registry is unavailable`,{cause:t})}return t.get(e)||`@makaio/${e}`}getLookupMap(){if(this.lookupMapPromise)return this.lookupMapPromise;let e=this.registryClient.getRegistry().then(e=>{let t=new Map;for(let n of[...e.adapters,...e.extensions])n.descriptorName&&t.set(n.descriptorName,n.name);return t}).catch(t=>{throw this.lookupMapPromise===e&&(this.lookupMapPromise=null),t});return this.lookupMapPromise=e,this.lookupMapPromise}},br=class{inner;portalMap;constructor(e,t){this.inner=e,this.portalMap=t}async installPackage(e){let t=lr(e),n=this.portalMap.get(t);if(n!==void 0){let e=`${t}@portal:${dr(n)}`;return this.inner.installPackage(e)}return this.inner.installPackage(e)}readInstalledExtensionDescriptor(e){return this.inner.readInstalledExtensionDescriptor(e)}listInstalledExtensionDescriptors(){return this.inner.listInstalledExtensionDescriptors()}readManifestSnapshot(){return this.inner.readManifestSnapshot()}writeManifestAndReinstall(e){return this.inner.writeManifestAndReinstall(e)}},xr=class{cache=null;inFlightFetch=null;registryUrl;cacheTtlMs;fetchTimeoutMs;fetchImpl;constructor(e={}){this.registryUrl=e.registryUrl??`https://raw.githubusercontent.com/makaio-ai/makaio/develop/registry/packages.json`,this.cacheTtlMs=e.cacheTtlMs??36e5,this.fetchTimeoutMs=e.fetchTimeoutMs??1e4,this.fetchImpl=e.fetchImpl??fetch}async getRegistry(){if(this.cache&&Date.now()-this.cache.timestamp<this.cacheTtlMs)return this.cache.data;this.inFlightFetch??=this.fetchAndCacheRegistry();try{return await this.inFlightFetch}finally{this.inFlightFetch=null}}async fetchAndCacheRegistry(){let e=new AbortController,t=setTimeout(()=>e.abort(),this.fetchTimeoutMs);try{let t=await this.fetchImpl(this.registryUrl,{signal:e.signal});if(!t.ok)throw Error(`HTTP ${t.status}: ${t.statusText}`);let n=await t.json(),r=Xn.parse(n);return this.cache={data:r,timestamp:Date.now()},r}catch(e){let t=e instanceof Error?e:Error(String(e));throw Error(`Failed to fetch package registry`,{cause:t})}finally{clearTimeout(t)}}clearCache(){this.cache=null}},Sr=t(r(),1),Cr=`1.0.0`;function wr(){let e=Cr;if(typeof e!=`string`||e.length===0)throw Error(`Package manager package metadata must include a string version.`);return`^${e}`}const Tr=wr();var Er=class extends Me{yarnManager;registryService;localInstaller;dependencyResolver;frameworkPeerRange;frameworkPackagePath;constructor(e,t,n={}){super(e),this.yarnManager=n.yarnManager??new sr(t),this.registryService=n.registryService??new xr,this.localInstaller=n.localInstaller??new rr(A.join(t,`extensions`)),this.frameworkPeerRange=n.frameworkPeerRange??Tr,this.frameworkPackagePath=n.frameworkPackagePath;let r=n.devPortalPackages?.size?new br(this.yarnManager,n.devPortalPackages):this.yarnManager;this.dependencyResolver=n.dependencyResolver??new hr(r,new yr(this.registryService))}async onInit(){await this.yarnManager.initialize(),console.info(`[PackageManagerService] Initialized`),this.registerPackageHandlers(),this.registerRegistryHandlers()}normalizePackageName(e){if(typeof e!=`string`)return null;let t=e.trim();return t.length>0?t:null}validatePackageNamePayload(e,t){return this.normalizePackageName(e)||(t(),null)}createInvalidPackageNameResult(e){return e?{success:!1,packageName:``,latestVersion:e.latestVersion,error:`Invalid packageName`}:{success:!1,packageName:``,error:`Invalid packageName`,restartRequired:!1}}async emitInstalled(e,t){try{await this.bus.emit(V.installed,{packageName:e,version:t})}catch(e){console.error(`[PackageManagerService] installed emit failed:`,e)}}async emitUninstalled(e){try{await this.bus.emit(V.uninstalled,{packageName:e})}catch(e){console.error(`[PackageManagerService] uninstalled emit failed:`,e)}}registerPackageHandlers(){this.registerListHandler(),this.registerInstallHandler(),this.registerUninstallHandler()}registerListHandler(){this.registerHandler(V.list,async e=>{try{let[t,n]=await Promise.all([this.yarnManager.listPackages(),this.localInstaller.list()]),r=[...t,...n.map(e=>({name:e.name,version:e.version,hasDescriptor:!0,...e.serverImportPath!==void 0&&{serverImportPath:e.serverImportPath}}))];e.setResult({packages:r})}catch(t){let n=t instanceof Error?t.message:String(t);console.error(`[PackageManagerService] List failed:`,n),e.setResult({packages:[]})}})}async ensureFrameworkPeer(){try{await this.yarnManager.ensureFrameworkDependency({versionRange:this.frameworkPeerRange,...this.frameworkPackagePath?{localPackagePath:this.frameworkPackagePath}:{}})}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to ensure @makaio/framework dependency ${this.frameworkPeerRange}: ${t}`,{cause:e})}}async installNpmPackages(e,t){let n=await this.yarnManager.readManifestSnapshot(),r;try{await this.ensureFrameworkPeer(),r=await this.dependencyResolver.resolve(e,{force:t,snapshot:null})}catch(e){try{await this.yarnManager.writeManifestAndReinstall(n)}catch(t){let n=e instanceof Error?e.message:String(e);throw AggregateError([e,t],`Package install failed and rollback failed: ${n}`)}throw e}for(let e of r.installed)e.source!==`already-present`&&await this.emitInstalled(e.npmName,e.version);let i=r.installed[0];return{success:!0,packageName:i?.npmName??e[0]??``,version:i?.version,restartRequired:!0,installed:[...r.installed],skipped:[...r.skipped],warnings:[...r.warnings]}}registerInstallHandler(){this.registerHandler(V.install,async e=>{let t=e.payload.packageNames??(e.payload.packageName===void 0?[]:[e.payload.packageName]),n=t.map(e=>this.normalizePackageName(e)).filter(e=>e!==null);if(n.length!==t.length||n.length===0){e.setResult(this.createInvalidPackageNameResult());return}let r;if(e.payload.source!==void 0)r={kind:e.payload.source};else{let t=n.map(e=>mr(e));r=t[0];let i=t.find(e=>e.kind!==r.kind);if(i){e.setResult({success:!1,packageName:``,error:`Cannot mix install sources: ${r.kind} and ${i.kind}`,restartRequired:!1});return}}if(r.kind===`git`){e.setResult({success:!1,packageName:n[0],error:`Git URL installs are not yet supported`,restartRequired:!1});return}if(r.kind===`local`){if(n.length>1){e.setResult({success:!1,packageName:``,error:`Local installs only support a single path`,restartRequired:!1});return}let t=await this.localInstaller.install(n[0]);t.success&&await this.emitInstalled(t.packageName,t.version??`unknown`),e.setResult(t);return}try{e.setResult(await this.installNpmPackages(n,e.payload.force))}catch(t){let r=t instanceof Error?t.message:String(t);console.error(`[PackageManagerService] Install failed:`,r),e.setResult({success:!1,packageName:n[0]??``,error:r,restartRequired:!1})}})}registerUninstallHandler(){this.registerHandler(V.uninstall,async e=>{let t=this.validatePackageNamePayload(e.payload.packageName,()=>{e.setResult(this.createInvalidPackageNameResult())});if(t){if((await this.localInstaller.list()).find(e=>e.name===t)){let n=await this.localInstaller.uninstall(t);n.success&&await this.emitUninstalled(t),e.setResult(n);return}try{await this.yarnManager.uninstallPackage(t),await this.emitUninstalled(t),e.setResult({success:!0,packageName:t,restartRequired:!0})}catch(n){let r=n instanceof Error?n.message:String(n);console.error(`[PackageManagerService] Uninstall failed:`,r),e.setResult({success:!1,packageName:t,error:r,restartRequired:!1})}}})}registerRegistryHandlers(){this.registerHandler(V.getLatestVersion,async e=>{let t=this.validatePackageNamePayload(e.payload.packageName,()=>{e.setResult(this.createInvalidPackageNameResult({latestVersion:`unknown`}))});if(t)try{let n=await this.yarnManager.getLatestVersion(t);e.setResult({success:!0,packageName:t,latestVersion:n})}catch(n){let r=n instanceof Error?n.message:String(n);console.error(`[PackageManagerService] Version check failed:`,r),e.setResult({success:!1,packageName:t,latestVersion:`unknown`,error:r})}}),this.registerHandler(V.getRegistry,async e=>{try{let t=await this.registryService.getRegistry();e.setResult(t)}catch(t){let n=t instanceof Error?t.message:String(t);console.error(`[PackageManagerService] Registry fetch failed:`,n),e.setResult({$schema:`makaio/package-registry/v1`,updatedAt:new Date().toISOString(),adapters:[],extensions:[]})}}),this.registerHandler(V.checkUpdates,async e=>{try{let t=await this.checkForUpdates();e.setResult({updates:t})}catch(t){let n=t instanceof Error?t.message:String(t);console.error(`[PackageManagerService] Update check failed:`,n),e.setResult({updates:[]})}})}async checkForUpdates(){try{let e=await this.yarnManager.listPackages(),t=[];return await Promise.all(e.map(async e=>{try{let n=await this.yarnManager.getLatestVersion(e.name);Sr.valid(e.version)&&Sr.valid(n)&&Sr.gt(n,e.version)&&t.push({name:e.name,currentVersion:e.version,latestVersion:n,description:e.description})}catch(t){console.warn(`[PackageManagerService] Failed to check updates for %s:`,e.name,t)}})),console.info(`[PackageManagerService] Found %d package updates`,t.length),t}catch(e){throw Error(`Failed to check for updates`,{cause:e})}}};function Dr(e={}){return{name:`makaio.package-manager`,displayName:`Package Manager`,version:`0.1.0`,critical:!0,namespaces:[Qn],create:t=>new Er(t.bus,t.makaioHome,{registryService:e.registryService,dependencyResolver:e.dependencyResolver,frameworkPeerRange:e.frameworkPeerRange,frameworkPackagePath:e.frameworkPackagePath,devPortalPackages:e.devPortalPackages})}}function Or(e){return{filter:e=>!!e.http,async processActivated(t,n){e.add({owner:t,phase:`extension`,mount:e=>n.http.mount(e)})},async processStopped(t){e.remove(t)}}}const kr={resolve(e,t){return!e&&!t?null:e?t?e.updatedAt>t.updatedAt?e:t:e:t}};function Ar(e){return{scope:e.scope,surface:e.surface??`any`,context:e.context??`any`,viewport:e.viewport??`any`}}function jr(e){return{scope:e.scope,surface:e.surface===`any`?void 0:e.surface,context:e.context===`any`?void 0:e.context,viewport:e.viewport===`any`?void 0:e.viewport}}function Mr(e,t){return[`makaio:prefs`,e.scope,e.surface||`any`,e.context||`any`,e.viewport||`any`,t].join(`:`)}function Nr(e){return typeof e==`object`&&!!e&&`value`in e&&`updatedAt`in e&&typeof e.value==`string`&&typeof e.updatedAt==`number`}function Pr(e){try{let t=JSON.parse(e);return Nr(t)?t:{value:JSON.stringify(t),updatedAt:0}}catch{return null}}const Fr=Le(`preferences`,e=>({scope:e.text(`scope`).notNull(),surface:e.text(`surface`).notNull().default(`any`),context:e.text(`context`).notNull().default(`any`),viewport:e.text(`viewport`).notNull().default(`any`),category:e.text(`category`).notNull(),value:e.text(`value`).notNull(),updatedAt:e.epochMs(`updated_at`).notNull()}),{sqlite:e=>[Ne(`preferences_pk`).on(e.scope,e.surface,e.context,e.viewport,e.category)],postgres:e=>[Pe(`preferences_pk`).on(e.scope,e.surface,e.context,e.viewport,e.category)]}),Ir=Fr.sqlite,Lr=Fr.postgres,Rr=Ie({preferences:Ir},{preferences:Lr});function zr(e,t,n){let r=[];return n!==void 0&&r.push(R(e.category,n)),t&&(t.scope!==void 0&&r.push(R(e.scope,t.scope)),t.surface!==void 0&&r.push(R(e.surface,t.surface)),t.context!==void 0&&r.push(R(e.context,t.context)),t.viewport!==void 0&&r.push(R(e.viewport,t.viewport))),r}async function Br(e,t,n){let{preferences:r}=We(e,Rr),i=zr(r,t,n);return(i.length>0?await e.select().from(r).where(qe(...i)):await e.select().from(r)).map(e=>{let t;try{t=JSON.parse(e.value)}catch{t=null}let n=qt.safeParse(t);return{key:jr(e),category:e.category,value:n.success?n.data:null,updatedAt:e.updatedAt}})}async function Vr(e,t,n){let{preferences:r}=We(e,Rr),i=Ar(t),[a]=await e.select().from(r).where(qe(R(r.scope,i.scope),R(r.surface,i.surface),R(r.context,i.context),R(r.viewport,i.viewport),R(r.category,n))).limit(1);return a}var Hr=class{db;conflictResolver;constructor(e){this.db=e.db,this.conflictResolver=e.conflictResolver??kr}async get(e,t){let n=await this.readFromDb(e,t),r=this.readFromLocalStorage(e,t),i=r?.updatedAt===0?r:null;!n&&r&&!i&&this.removeFromLocalStorage(e,t);let a=this.conflictResolver.resolve(i,n);if(!a)return null;let o;try{o=JSON.parse(a.value)}catch{return null}let s=qt.safeParse(o);return s.success?(await this.syncResolvedPreference(e,t,a,r,n),s.data):null}async set(e,t,n){let r=Date.now(),i=JSON.stringify(n??null);this.writeToLocalStorage(e,t,{value:i,updatedAt:r}),await this.writeToDb(e,t,i,r)}async delete(e,t){this.removeFromLocalStorage(e,t),await this.deleteFromDb(e,t)}async list(e,t){return Br(this.db,e,t)}async writeToDb(e,t,n,r){let{preferences:i}=We(this.db,Rr),a=Ar(e);await this.db.insert(i).values({...a,category:t,value:n,updatedAt:r}).onConflictDoUpdate({target:[i.scope,i.surface,i.context,i.viewport,i.category],set:{value:n,updatedAt:r}})}readFromLocalStorage(e,t){let n=Mr(e,t),r=globalThis.localStorage?.getItem(n);return r?Pr(r):null}writeToLocalStorage(e,t,n){let r=Mr(e,t);try{globalThis.localStorage?.setItem(r,JSON.stringify(n))}catch(e){console.warn(`[StorageCoordinator] localStorage write failed:`,e)}}removeFromLocalStorage(e,t){let n=Mr(e,t);try{globalThis.localStorage?.removeItem(n)}catch(e){console.warn(`[StorageCoordinator] localStorage delete failed:`,e)}}async syncResolvedPreference(e,t,n,r,i){this.isSameStoredPreference(n,i)||await this.writeToDb(e,t,n.value,n.updatedAt),r&&!this.isSameStoredPreference(n,r)&&this.writeToLocalStorage(e,t,n)}isSameStoredPreference(e,t){return!e||!t?!1:e.value===t.value&&e.updatedAt===t.updatedAt}async readFromDb(e,t){let n=await Vr(this.db,e,t);return n?{value:n.value,updatedAt:n.updatedAt}:null}async deleteFromDb(e,t){let{preferences:n}=We(this.db,Rr),r=Ar(e);await this.db.delete(n).where(qe(R(n.scope,r.scope),R(n.surface,r.surface),R(n.context,r.context),R(n.viewport,r.viewport),R(n.category,t)))}};function Ur(e,t,n){let r=new Hr({db:t}),i=e.on(Jt.get,async e=>{let{key:t,category:n}=e.payload,i=await r.get(t,n);e.setResult({value:i})}),a=e.on(Jt.set,async e=>{let{key:t,category:n,value:i}=e.payload;await r.set(t,n,i),e.setResult({success:!0})}),o=e.on(Jt.delete,async e=>{let{key:t,category:n}=e.payload;await r.delete(t,n),e.setResult({success:!0})}),s=e.on(Jt.list,async e=>{let{key:t,category:n}=e.payload,i=await r.list(t,n);e.setResult({items:i})});return()=>{i(),a(),o(),s()}}const Wr={name:`preferences-storage`,displayName:`Preferences Storage`,version:`0.1.0`,critical:!0,storage:{registerHandlers:He(Ur)}},Gr=ce(se);function Kr(e,t){if(!e.ok)throw Error(`HTTP ${e.status} ${e.statusText} fetching ${t}`)}function qr(e){return{fetchTimeoutMs:e.fetchTimeoutMs??3e4,downloadTimeoutMs:e.downloadTimeoutMs??6e5,execTimeoutMs:e.execTimeoutMs??12e4,extractTimeoutMs:e.extractTimeoutMs??3e5}}async function Jr(e,t){try{return await fetch(e,{signal:AbortSignal.timeout(t)})}catch(n){let r=n instanceof Error?n.name:``;throw r===`AbortError`||r===`TimeoutError`?Error(`Timed out fetching ${e} after ${t}ms`,{cause:n}):n}}async function Yr(e,t,n,r){await k.mkdir(t,{recursive:!0}),n===`tar.gz`?await Gr(`tar`,[`-xzf`,e,`-C`,t],{timeout:r}).catch(n=>{throw n.code===`ENOENT`?Error(`tar extraction failed: host executable "tar" was not found on PATH`):Error(`tar extraction failed: ${e} → ${t}\nstderr: ${n.stderr??``}\n${String(n.message)}`)}):await Gr(`unzip`,[`-q`,e,`-d`,t],{timeout:r}).catch(n=>{throw n.code===`ENOENT`?Error(`zip extraction failed: host executable "unzip" was not found on PATH`):Error(`unzip extraction failed: ${e} → ${t}\nstderr: ${n.stderr??``}\n${String(n.message)}`)})}async function Xr(e,t,n,r){let{stdout:i}=await Gr(e,t,{cwd:n?.cwd,env:n?.env===void 0?process.env:{...process.env,...n.env},shell:!1,timeout:r}).catch(n=>{if(n.code===`ENOENT`)throw Error(`Command failed: host executable "${e}" was not found on PATH`);let r=n.stderr??``;throw Error(`Command failed: ${e} ${t.join(` `)}\nstderr: ${r}\n${String(n.message)}`)});return(i??``).trim()}function Zr(e={}){let{fetchTimeoutMs:t,downloadTimeoutMs:n,execTimeoutMs:r,extractTimeoutMs:i}=qr(e);return{async fetchText(e){let n=await Jr(e,t);return Kr(n,e),n.text()},async fetchJson(e){let n=await Jr(e,t);return Kr(n,e),n.json()},async downloadFile(e,t,r){let i=await Jr(e,n);if(Kr(i,e),i.body===null)throw Error(`Response body is null for URL: ${e}`);let a=i.headers.get(`content-length`),o=a===null?null:parseInt(a,10),s=o!==null&&!isNaN(o)?o:null;await k.mkdir(A.dirname(t),{recursive:!0});let c=P.createWriteStream(t),l=0,u=new gt({transform(e,t,n){l+=e.length,r?.(l,s),n(null,e)}});try{await _t(ht.from(i.body),u,c)}catch(e){throw await k.rm(t,{force:!0}),e}return t},exec(e,t,n){return Xr(e,t,n,r)},async extractArchive(e,t,n){await Yr(e,t,n,i)},async deleteFile(e){await k.rm(e,{force:!0})},async computeChecksum(e,t=`sha256`){return new Promise((n,r)=>{let i=N(t),a=P.createReadStream(e);a.on(`error`,r),a.on(`data`,e=>i.update(e)),a.on(`end`,()=>n(i.digest(`hex`)))})},async removeDirectory(e){await k.rm(e,{recursive:!0,force:!0})}}}function Qr(e){let t,n=!1;for(let r=e.length-1;r>=0;--r){let i=e[r];try{i()}catch(e){n||=(t=e,!0)}}if(e.length=0,n)throw t}function $r(e,t){try{return t()}catch(t){try{Qr(e)}catch{}throw t}}function ei(e,t){for(let n of e){let e=n.providers.find(e=>e.definition.id===t);if(e)return e}}function ti(e,t,n){for(let r of t){let t=e.find(e=>e.name===r.adapterName);if(t?.providers.some(e=>e.definition.id===n))return t}}function ni(e){let{$schema:t,...n}=e;return n}function ri(e,t){let n=e.definition,r=Date.now();return{id:n.id,packageName:t,name:n.name,description:n.description,endpoints:n.endpoints,defaultModel:n.defaultModel,fastModel:n.fastModel,availableModels:n.availableModels??[],defaultModelFilterMode:`show-all`,credentialEnvVars:n.credentialEnvVars,capabilities:n.capabilities,enabled:!0,createdAt:r,updatedAt:r}}function ii(e,t,n,r){let i=[];return $r(i,()=>(i.push(e.on($t.adapter.getConfigSchema,({payload:e,setResult:n})=>{let r=t().find(t=>t.name===e.adapterName);if(!r?.adapterConfigSchema){n({hasSchema:!1,schema:null});return}n({hasSchema:!0,schema:D.toJSONSchema(r.adapterConfigSchema)})})),i.push(e.on(Zt.getCredentialSchema,({payload:e,setResult:n})=>{let r=ei(t(),e.definitionId)?.credentialSchema;if(r){n({hasSchema:!0,schema:D.toJSONSchema(r)});return}n({hasSchema:!1,schema:null})})),i.push(e.on(Zt.getConfigSchema,({payload:e,setResult:n})=>{let r=ei(t(),e.definitionId)?.configSchema;if(r){n({hasSchema:!0,schema:D.toJSONSchema(r)});return}n({hasSchema:!1,schema:null})})),r&&i.push(e.on($t.extension.getConfigSchema,({payload:e,setResult:t})=>{let n=r(e.extensionName);if(!n?.configSchema){t({hasSchema:!1,schema:null,uiConfig:null});return}t({hasSchema:!0,schema:ni(D.toJSONSchema(n.configSchema)),uiConfig:n.uiConfig??null})})),i.push(e.on($e.get,({payload:e,setResult:n})=>{for(let r of t()){let t=r.providers.find(t=>t.definition.id===e.id);if(t){n({provider:ri(t,r.packageName)});return}}n({provider:null})},{priority:-1})),i.push(e.on($e.list,({setResult:e})=>{let n=[],r=new Set;for(let e of t())for(let t of e.providers)r.has(t.definition.id)||(r.add(t.definition.id),n.push(ri(t,e.packageName)));e({providers:n})},{priority:-1})),i.push(e.on(Qt.fetchModels,async({payload:r,setResult:i})=>{let{config:a}=await e.request(ct.getProviderConfig,{id:r.providerConfigId});if(!a)throw Error(`Provider config '${r.providerConfigId}' not found`);let{bindings:o}=await e.request(ct.listBindingsByConfig,{providerConfigId:r.providerConfigId}),s=ti(t(),o,a.definitionId);if(!s)throw Error(o.length===0?`Provider config '${r.providerConfigId}' is not bound to an adapter`:`No loaded adapter bound to provider config '${r.providerConfigId}' for definition '${a.definitionId}'`);let c=await Ze(e,r.providerConfigId),l=s.options.adapterId,u=l?n().get(l):void 0;if(!l||!u)throw Error(`Adapter instance for '${s.name}' not initialized`);if(!(`fetchModels`in u)||typeof u.fetchModels!=`function`)throw Error(`Adapter '${s.name}' does not support model fetching`);let d=await Yt(e,c.credentialRefs),f=c.endpointOverrides?Object.values(c.endpointOverrides).find(e=>e!==void 0):void 0;i({models:await u.fetchModels(f,d)})})),()=>{Qr(i)}))}function ai(e,t){let n=new Map;for(let[r,i]of e)t.has(r)&&n.set(r,i);return n}function oi(...e){let t=new Map;for(let n of e)for(let[e,r]of n)t.set(e,{...t.get(e)??{},...r});return t}function si(e,t){let n=[e.on(L.get,async e=>{let n=await t.getConfig();e.setResult({config:n})}),e.on(L.update,async e=>{let n=I.parse(e.payload.config),r=await t.prepareConfigForPersistence(n);await t.saveConfig(r),e.setResult({success:!0})})];return()=>{for(let e of n)e()}}var U=n((e=>{let t=Symbol.for(`yaml.alias`),n=Symbol.for(`yaml.document`),r=Symbol.for(`yaml.map`),i=Symbol.for(`yaml.pair`),a=Symbol.for(`yaml.scalar`),o=Symbol.for(`yaml.seq`),s=Symbol.for(`yaml.node.type`),c=e=>!!e&&typeof e==`object`&&e[s]===t,l=e=>!!e&&typeof e==`object`&&e[s]===n,u=e=>!!e&&typeof e==`object`&&e[s]===r,d=e=>!!e&&typeof e==`object`&&e[s]===i,f=e=>!!e&&typeof e==`object`&&e[s]===a,p=e=>!!e&&typeof e==`object`&&e[s]===o;function m(e){if(e&&typeof e==`object`)switch(e[s]){case r:case o:return!0}return!1}function h(e){if(e&&typeof e==`object`)switch(e[s]){case t:case r:case a:case o:return!0}return!1}e.ALIAS=t,e.DOC=n,e.MAP=r,e.NODE_TYPE=s,e.PAIR=i,e.SCALAR=a,e.SEQ=o,e.hasAnchor=e=>(f(e)||m(e))&&!!e.anchor,e.isAlias=c,e.isCollection=m,e.isDocument=l,e.isMap=u,e.isNode=h,e.isPair=d,e.isScalar=f,e.isSeq=p})),ci=n((e=>{var t=U();let n=Symbol(`break visit`),r=Symbol(`skip children`),i=Symbol(`remove node`);function a(e,n){let r=l(n);t.isDocument(e)?o(null,e.contents,r,Object.freeze([e]))===i&&(e.contents=null):o(null,e,r,Object.freeze([]))}a.BREAK=n,a.SKIP=r,a.REMOVE=i;function o(e,r,a,s){let c=u(e,r,a,s);if(t.isNode(c)||t.isPair(c))return d(e,s,c),o(e,c,a,s);if(typeof c!=`symbol`){if(t.isCollection(r)){s=Object.freeze(s.concat(r));for(let e=0;e<r.items.length;++e){let t=o(e,r.items[e],a,s);if(typeof t==`number`)e=t-1;else if(t===n)return n;else t===i&&(r.items.splice(e,1),--e)}}else if(t.isPair(r)){s=Object.freeze(s.concat(r));let e=o(`key`,r.key,a,s);if(e===n)return n;e===i&&(r.key=null);let t=o(`value`,r.value,a,s);if(t===n)return n;t===i&&(r.value=null)}}return c}async function s(e,n){let r=l(n);t.isDocument(e)?await c(null,e.contents,r,Object.freeze([e]))===i&&(e.contents=null):await c(null,e,r,Object.freeze([]))}s.BREAK=n,s.SKIP=r,s.REMOVE=i;async function c(e,r,a,o){let s=await u(e,r,a,o);if(t.isNode(s)||t.isPair(s))return d(e,o,s),c(e,s,a,o);if(typeof s!=`symbol`){if(t.isCollection(r)){o=Object.freeze(o.concat(r));for(let e=0;e<r.items.length;++e){let t=await c(e,r.items[e],a,o);if(typeof t==`number`)e=t-1;else if(t===n)return n;else t===i&&(r.items.splice(e,1),--e)}}else if(t.isPair(r)){o=Object.freeze(o.concat(r));let e=await c(`key`,r.key,a,o);if(e===n)return n;e===i&&(r.key=null);let t=await c(`value`,r.value,a,o);if(t===n)return n;t===i&&(r.value=null)}}return s}function l(e){return typeof e==`object`&&(e.Collection||e.Node||e.Value)?Object.assign({Alias:e.Node,Map:e.Node,Scalar:e.Node,Seq:e.Node},e.Value&&{Map:e.Value,Scalar:e.Value,Seq:e.Value},e.Collection&&{Map:e.Collection,Seq:e.Collection},e):e}function u(e,n,r,i){if(typeof r==`function`)return r(e,n,i);if(t.isMap(n))return r.Map?.(e,n,i);if(t.isSeq(n))return r.Seq?.(e,n,i);if(t.isPair(n))return r.Pair?.(e,n,i);if(t.isScalar(n))return r.Scalar?.(e,n,i);if(t.isAlias(n))return r.Alias?.(e,n,i)}function d(e,n,r){let i=n[n.length-1];if(t.isCollection(i))i.items[e]=r;else if(t.isPair(i))e===`key`?i.key=r:i.value=r;else if(t.isDocument(i))i.contents=r;else{let e=t.isAlias(i)?`alias`:`scalar`;throw Error(`Cannot replace node with ${e} parent`)}}e.visit=a,e.visitAsync=s})),li=n((e=>{var t=U(),n=ci();let r={"!":`%21`,",":`%2C`,"[":`%5B`,"]":`%5D`,"{":`%7B`,"}":`%7D`},i=e=>e.replace(/[!,[\]{}]/g,e=>r[e]);var a=class e{constructor(t,n){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},e.defaultYaml,t),this.tags=Object.assign({},e.defaultTags,n)}clone(){let t=new e(this.yaml,this.tags);return t.docStart=this.docStart,t}atDocument(){let t=new e(this.yaml,this.tags);switch(this.yaml.version){case`1.1`:this.atNextDocument=!0;break;case`1.2`:this.atNextDocument=!1,this.yaml={explicit:e.defaultYaml.explicit,version:`1.2`},this.tags=Object.assign({},e.defaultTags);break}return t}add(t,n){this.atNextDocument&&=(this.yaml={explicit:e.defaultYaml.explicit,version:`1.1`},this.tags=Object.assign({},e.defaultTags),!1);let r=t.trim().split(/[ \t]+/),i=r.shift();switch(i){case`%TAG`:{if(r.length!==2&&(n(0,`%TAG directive should contain exactly two parts`),r.length<2))return!1;let[e,t]=r;return this.tags[e]=t,!0}case`%YAML`:{if(this.yaml.explicit=!0,r.length!==1)return n(0,`%YAML directive should contain exactly one part`),!1;let[e]=r;if(e===`1.1`||e===`1.2`)return this.yaml.version=e,!0;{let t=/^\d+\.\d+$/.test(e);return n(6,`Unsupported YAML version ${e}`,t),!1}}default:return n(0,`Unknown directive ${i}`,!0),!1}}tagName(e,t){if(e===`!`)return`!`;if(e[0]!==`!`)return t(`Not a valid tag: ${e}`),null;if(e[1]===`<`){let n=e.slice(2,-1);return n===`!`||n===`!!`?(t(`Verbatim tags aren't resolved, so ${e} is invalid.`),null):(e[e.length-1]!==`>`&&t(`Verbatim tags must end with a >`),n)}let[,n,r]=e.match(/^(.*!)([^!]*)$/s);r||t(`The ${e} tag has no suffix`);let i=this.tags[n];if(i)try{return i+decodeURIComponent(r)}catch(e){return t(String(e)),null}return n===`!`?e:(t(`Could not resolve tag: ${e}`),null)}tagString(e){for(let[t,n]of Object.entries(this.tags))if(e.startsWith(n))return t+i(e.substring(n.length));return e[0]===`!`?e:`!<${e}>`}toString(e){let r=this.yaml.explicit?[`%YAML ${this.yaml.version||`1.2`}`]:[],i=Object.entries(this.tags),a;if(e&&i.length>0&&t.isNode(e.contents)){let r={};n.visit(e.contents,(e,n)=>{t.isNode(n)&&n.tag&&(r[n.tag]=!0)}),a=Object.keys(r)}else a=[];for(let[t,n]of i)t===`!!`&&n===`tag:yaml.org,2002:`||(!e||a.some(e=>e.startsWith(n)))&&r.push(`%TAG ${t} ${n}`);return r.join(`
@@ -1 +1 @@
1
- import{i as e,n as t,r as n}from"../../await-trigger-DwVldnMt.mjs";import{a as r,i,n as a,o,r as s,s as c,t as l}from"../../workflow-worker-BIpYi6o7.mjs";export{i as InProcessWorkflowRunner,l as PiscinaThinWorkflowProvider,c as ThinWorkflowPiscinaRunner,r as WorkerNodeRunner,a as createNodeWorkflowRunner,s as createNodeWorkflowRunnerPackageOptions,t as loadWorkflowFromConfig,n as loadWorkflowModule,e as loadWorkflowModules,o as resolveWorkflowWorkerEntry};
1
+ import{i as e,n as t,r as n}from"../../await-trigger-DwVldnMt.mjs";import{a as r,i,n as a,o,r as s,s as c,t as l}from"../../workflow-worker-dH70EbjE.mjs";export{i as InProcessWorkflowRunner,l as PiscinaThinWorkflowProvider,c as ThinWorkflowPiscinaRunner,r as WorkerNodeRunner,a as createNodeWorkflowRunner,s as createNodeWorkflowRunnerPackageOptions,t as loadWorkflowFromConfig,n as loadWorkflowModule,e as loadWorkflowModules,o as resolveWorkflowWorkerEntry};
@@ -258,7 +258,7 @@ declare const sessions: _$drizzle_orm_sqlite_core0.SQLiteTableWithColumns<{
258
258
  tableName: "sessions";
259
259
  dataType: "string";
260
260
  columnType: "SQLiteText";
261
- data: "active" | "archived" | "closed" | "discovered";
261
+ data: "discovered" | "closed" | "active" | "archived";
262
262
  driverParam: string;
263
263
  notNull: true;
264
264
  hasDefault: false;
@@ -1130,7 +1130,7 @@ declare const agents: _$drizzle_orm_sqlite_core0.SQLiteTableWithColumns<{
1130
1130
  tableName: "agents";
1131
1131
  dataType: "string";
1132
1132
  columnType: "SQLiteText";
1133
- data: "active" | "idle" | "dead" | "disposed";
1133
+ data: "idle" | "active" | "dead" | "disposed";
1134
1134
  driverParam: string;
1135
1135
  notNull: true;
1136
1136
  hasDefault: false;
@@ -29,8 +29,8 @@ type SurfaceId = z.infer<typeof SurfaceIdSchema>;
29
29
  * A page is visible on a surface when the surface provides all required capabilities.
30
30
  */
31
31
  declare const SurfaceCapabilitySchema: z.ZodEnum<{
32
- filesystem: "filesystem";
33
32
  native: "native";
33
+ filesystem: "filesystem";
34
34
  dom: "dom";
35
35
  "multi-window": "multi-window";
36
36
  touch: "touch";