@agentxjs/portagent 0.1.9 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,20 @@
1
+ /*! *****************************************************************************
2
+ Copyright (c) Microsoft Corporation. All rights reserved.
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use
4
+ this file except in compliance with the License. You may obtain a copy of the
5
+ License at http://www.apache.org/licenses/LICENSE-2.0
6
+
7
+ THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
8
+ KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
9
+ WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
10
+ MERCHANTABLITY OR NON-INFRINGEMENT.
11
+
12
+ See the Apache Version 2.0 License for specific language governing permissions
13
+ and limitations under the License.
14
+ ***************************************************************************** */var h=function(t,e){return h=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var r in o)o.hasOwnProperty(r)&&(n[r]=o[r])},h(t,e)};function f(t,e){h(t,e);function n(){this.constructor=t}t.prototype=e===null?Object.create(e):(n.prototype=e.prototype,new n)}function p(t){var e=typeof Symbol=="function"&&t[Symbol.iterator],n=0;return e?e.call(t):{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}}}function d(t,e){var n=typeof Symbol=="function"&&t[Symbol.iterator];if(!n)return t;var o=n.call(t),r,i=[],s;try{for(;(e===void 0||e-- >0)&&!(r=o.next()).done;)i.push(r.value)}catch(c){s={error:c}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(s)throw s.error}}return i}function y(){for(var t=[],e=0;e<arguments.length;e++)t=t.concat(d(arguments[e]));return t}var _=(function(){function t(e,n){this.target=n,this.type=e}return t})(),m=(function(t){f(e,t);function e(n,o){var r=t.call(this,"error",o)||this;return r.message=n.message,r.error=n,r}return e})(_),b=(function(t){f(e,t);function e(n,o,r){n===void 0&&(n=1e3),o===void 0&&(o="");var i=t.call(this,"close",r)||this;return i.wasClean=!0,i.code=n,i.reason=o,i}return e})(_);/*!
15
+ * Reconnecting WebSocket
16
+ * by Pedro Ladaria <pedro.ladaria@gmail.com>
17
+ * https://github.com/pladaria/reconnecting-websocket
18
+ * License MIT
19
+ */var g=function(){if(typeof WebSocket<"u")return WebSocket},v=function(t){return typeof t<"u"&&!!t&&t.CLOSING===2},a={maxReconnectionDelay:1e4,minReconnectionDelay:1e3+Math.random()*4e3,minUptime:5e3,reconnectionDelayGrowFactor:1.3,connectionTimeout:4e3,maxRetries:1/0,maxEnqueuedMessages:1/0},E=(function(){function t(e,n,o){var r=this;o===void 0&&(o={}),this._listeners={error:[],message:[],open:[],close:[]},this._retryCount=-1,this._shouldReconnect=!0,this._connectLock=!1,this._binaryType="blob",this._closeCalled=!1,this._messageQueue=[],this.onclose=null,this.onerror=null,this.onmessage=null,this.onopen=null,this._handleOpen=function(i){r._debug("open event");var s=r._options.minUptime,c=s===void 0?a.minUptime:s;clearTimeout(r._connectTimeout),r._uptimeTimeout=setTimeout(function(){return r._acceptOpen()},c),r._ws.binaryType=r._binaryType,r._messageQueue.forEach(function(u){return r._ws.send(u)}),r._messageQueue=[],r.onopen&&r.onopen(i),r._listeners.open.forEach(function(u){return r._callEventListener(i,u)})},this._handleMessage=function(i){r._debug("message event"),r.onmessage&&r.onmessage(i),r._listeners.message.forEach(function(s){return r._callEventListener(i,s)})},this._handleError=function(i){r._debug("error event",i.message),r._disconnect(void 0,i.message==="TIMEOUT"?"timeout":void 0),r.onerror&&r.onerror(i),r._debug("exec error listeners"),r._listeners.error.forEach(function(s){return r._callEventListener(i,s)}),r._connect()},this._handleClose=function(i){r._debug("close event"),r._clearTimeouts(),r._shouldReconnect&&r._connect(),r.onclose&&r.onclose(i),r._listeners.close.forEach(function(s){return r._callEventListener(i,s)})},this._url=e,this._protocols=n,this._options=o,this._options.startClosed&&(this._shouldReconnect=!1),this._connect()}return Object.defineProperty(t,"CONNECTING",{get:function(){return 0},enumerable:!0,configurable:!0}),Object.defineProperty(t,"OPEN",{get:function(){return 1},enumerable:!0,configurable:!0}),Object.defineProperty(t,"CLOSING",{get:function(){return 2},enumerable:!0,configurable:!0}),Object.defineProperty(t,"CLOSED",{get:function(){return 3},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"CONNECTING",{get:function(){return t.CONNECTING},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"OPEN",{get:function(){return t.OPEN},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"CLOSING",{get:function(){return t.CLOSING},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"CLOSED",{get:function(){return t.CLOSED},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"binaryType",{get:function(){return this._ws?this._ws.binaryType:this._binaryType},set:function(e){this._binaryType=e,this._ws&&(this._ws.binaryType=e)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"retryCount",{get:function(){return Math.max(this._retryCount,0)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"bufferedAmount",{get:function(){var e=this._messageQueue.reduce(function(n,o){return typeof o=="string"?n+=o.length:o instanceof Blob?n+=o.size:n+=o.byteLength,n},0);return e+(this._ws?this._ws.bufferedAmount:0)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"extensions",{get:function(){return this._ws?this._ws.extensions:""},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"protocol",{get:function(){return this._ws?this._ws.protocol:""},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"readyState",{get:function(){return this._ws?this._ws.readyState:this._options.startClosed?t.CLOSED:t.CONNECTING},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"url",{get:function(){return this._ws?this._ws.url:""},enumerable:!0,configurable:!0}),t.prototype.close=function(e,n){if(e===void 0&&(e=1e3),this._closeCalled=!0,this._shouldReconnect=!1,this._clearTimeouts(),!this._ws){this._debug("close enqueued: no ws instance");return}if(this._ws.readyState===this.CLOSED){this._debug("close: already closed");return}this._ws.close(e,n)},t.prototype.reconnect=function(e,n){this._shouldReconnect=!0,this._closeCalled=!1,this._retryCount=-1,!this._ws||this._ws.readyState===this.CLOSED?this._connect():(this._disconnect(e,n),this._connect())},t.prototype.send=function(e){if(this._ws&&this._ws.readyState===this.OPEN)this._debug("send",e),this._ws.send(e);else{var n=this._options.maxEnqueuedMessages,o=n===void 0?a.maxEnqueuedMessages:n;this._messageQueue.length<o&&(this._debug("enqueue",e),this._messageQueue.push(e))}},t.prototype.addEventListener=function(e,n){this._listeners[e]&&this._listeners[e].push(n)},t.prototype.dispatchEvent=function(e){var n,o,r=this._listeners[e.type];if(r)try{for(var i=p(r),s=i.next();!s.done;s=i.next()){var c=s.value;this._callEventListener(e,c)}}catch(u){n={error:u}}finally{try{s&&!s.done&&(o=i.return)&&o.call(i)}finally{if(n)throw n.error}}return!0},t.prototype.removeEventListener=function(e,n){this._listeners[e]&&(this._listeners[e]=this._listeners[e].filter(function(o){return o!==n}))},t.prototype._debug=function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];this._options.debug&&console.log.apply(console,y(["RWS>"],e))},t.prototype._getNextDelay=function(){var e=this._options,n=e.reconnectionDelayGrowFactor,o=n===void 0?a.reconnectionDelayGrowFactor:n,r=e.minReconnectionDelay,i=r===void 0?a.minReconnectionDelay:r,s=e.maxReconnectionDelay,c=s===void 0?a.maxReconnectionDelay:s,u=0;return this._retryCount>0&&(u=i*Math.pow(o,this._retryCount-1),u>c&&(u=c)),this._debug("next delay",u),u},t.prototype._wait=function(){var e=this;return new Promise(function(n){setTimeout(n,e._getNextDelay())})},t.prototype._getNextUrl=function(e){if(typeof e=="string")return Promise.resolve(e);if(typeof e=="function"){var n=e();if(typeof n=="string")return Promise.resolve(n);if(n.then)return n}throw Error("Invalid URL")},t.prototype._connect=function(){var e=this;if(!(this._connectLock||!this._shouldReconnect)){this._connectLock=!0;var n=this._options,o=n.maxRetries,r=o===void 0?a.maxRetries:o,i=n.connectionTimeout,s=i===void 0?a.connectionTimeout:i,c=n.WebSocket,u=c===void 0?g():c;if(this._retryCount>=r){this._debug("max retries reached",this._retryCount,">=",r);return}if(this._retryCount++,this._debug("connect",this._retryCount),this._removeListeners(),!v(u))throw Error("No valid WebSocket class provided");this._wait().then(function(){return e._getNextUrl(e._url)}).then(function(l){e._closeCalled||(e._debug("connect",{url:l,protocols:e._protocols}),e._ws=e._protocols?new u(l,e._protocols):new u(l),e._ws.binaryType=e._binaryType,e._connectLock=!1,e._addListeners(),e._connectTimeout=setTimeout(function(){return e._handleTimeout()},s))})}},t.prototype._handleTimeout=function(){this._debug("timeout event"),this._handleError(new m(Error("TIMEOUT"),this))},t.prototype._disconnect=function(e,n){if(e===void 0&&(e=1e3),this._clearTimeouts(),!!this._ws){this._removeListeners();try{this._ws.close(e,n),this._handleClose(new b(e,n,this))}catch{}}},t.prototype._acceptOpen=function(){this._debug("accept open"),this._retryCount=0},t.prototype._callEventListener=function(e,n){"handleEvent"in n?n.handleEvent(e):n(e)},t.prototype._removeListeners=function(){this._ws&&(this._debug("removeListeners"),this._ws.removeEventListener("open",this._handleOpen),this._ws.removeEventListener("close",this._handleClose),this._ws.removeEventListener("message",this._handleMessage),this._ws.removeEventListener("error",this._handleError))},t.prototype._addListeners=function(){this._ws&&(this._debug("addListeners"),this._ws.addEventListener("open",this._handleOpen),this._ws.addEventListener("close",this._handleClose),this._ws.addEventListener("message",this._handleMessage),this._ws.addEventListener("error",this._handleError))},t.prototype._clearTimeouts=function(){clearTimeout(this._connectTimeout),clearTimeout(this._uptimeTimeout)},t})();export{E as default};
20
+ //# sourceMappingURL=reconnecting-websocket-mjs-Dd04wD44.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconnecting-websocket-mjs-Dd04wD44.js","sources":["../../../../../node_modules/.pnpm/reconnecting-websocket@4.4.0/node_modules/reconnecting-websocket/dist/reconnecting-websocket-mjs.js"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nfunction __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nfunction __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nfunction __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nfunction __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\n\nvar Event = /** @class */ (function () {\r\n function Event(type, target) {\r\n this.target = target;\r\n this.type = type;\r\n }\r\n return Event;\r\n}());\r\nvar ErrorEvent = /** @class */ (function (_super) {\r\n __extends(ErrorEvent, _super);\r\n function ErrorEvent(error, target) {\r\n var _this = _super.call(this, 'error', target) || this;\r\n _this.message = error.message;\r\n _this.error = error;\r\n return _this;\r\n }\r\n return ErrorEvent;\r\n}(Event));\r\nvar CloseEvent = /** @class */ (function (_super) {\r\n __extends(CloseEvent, _super);\r\n function CloseEvent(code, reason, target) {\r\n if (code === void 0) { code = 1000; }\r\n if (reason === void 0) { reason = ''; }\r\n var _this = _super.call(this, 'close', target) || this;\r\n _this.wasClean = true;\r\n _this.code = code;\r\n _this.reason = reason;\r\n return _this;\r\n }\r\n return CloseEvent;\r\n}(Event));\n\n/*!\r\n * Reconnecting WebSocket\r\n * by Pedro Ladaria <pedro.ladaria@gmail.com>\r\n * https://github.com/pladaria/reconnecting-websocket\r\n * License MIT\r\n */\r\nvar getGlobalWebSocket = function () {\r\n if (typeof WebSocket !== 'undefined') {\r\n // @ts-ignore\r\n return WebSocket;\r\n }\r\n};\r\n/**\r\n * Returns true if given argument looks like a WebSocket class\r\n */\r\nvar isWebSocket = function (w) { return typeof w !== 'undefined' && !!w && w.CLOSING === 2; };\r\nvar DEFAULT = {\r\n maxReconnectionDelay: 10000,\r\n minReconnectionDelay: 1000 + Math.random() * 4000,\r\n minUptime: 5000,\r\n reconnectionDelayGrowFactor: 1.3,\r\n connectionTimeout: 4000,\r\n maxRetries: Infinity,\r\n maxEnqueuedMessages: Infinity,\r\n startClosed: false,\r\n debug: false,\r\n};\r\nvar ReconnectingWebSocket = /** @class */ (function () {\r\n function ReconnectingWebSocket(url, protocols, options) {\r\n var _this = this;\r\n if (options === void 0) { options = {}; }\r\n this._listeners = {\r\n error: [],\r\n message: [],\r\n open: [],\r\n close: [],\r\n };\r\n this._retryCount = -1;\r\n this._shouldReconnect = true;\r\n this._connectLock = false;\r\n this._binaryType = 'blob';\r\n this._closeCalled = false;\r\n this._messageQueue = [];\r\n /**\r\n * An event listener to be called when the WebSocket connection's readyState changes to CLOSED\r\n */\r\n this.onclose = null;\r\n /**\r\n * An event listener to be called when an error occurs\r\n */\r\n this.onerror = null;\r\n /**\r\n * An event listener to be called when a message is received from the server\r\n */\r\n this.onmessage = null;\r\n /**\r\n * An event listener to be called when the WebSocket connection's readyState changes to OPEN;\r\n * this indicates that the connection is ready to send and receive data\r\n */\r\n this.onopen = null;\r\n this._handleOpen = function (event) {\r\n _this._debug('open event');\r\n var _a = _this._options.minUptime, minUptime = _a === void 0 ? DEFAULT.minUptime : _a;\r\n clearTimeout(_this._connectTimeout);\r\n _this._uptimeTimeout = setTimeout(function () { return _this._acceptOpen(); }, minUptime);\r\n _this._ws.binaryType = _this._binaryType;\r\n // send enqueued messages (messages sent before websocket open event)\r\n _this._messageQueue.forEach(function (message) { return _this._ws.send(message); });\r\n _this._messageQueue = [];\r\n if (_this.onopen) {\r\n _this.onopen(event);\r\n }\r\n _this._listeners.open.forEach(function (listener) { return _this._callEventListener(event, listener); });\r\n };\r\n this._handleMessage = function (event) {\r\n _this._debug('message event');\r\n if (_this.onmessage) {\r\n _this.onmessage(event);\r\n }\r\n _this._listeners.message.forEach(function (listener) { return _this._callEventListener(event, listener); });\r\n };\r\n this._handleError = function (event) {\r\n _this._debug('error event', event.message);\r\n _this._disconnect(undefined, event.message === 'TIMEOUT' ? 'timeout' : undefined);\r\n if (_this.onerror) {\r\n _this.onerror(event);\r\n }\r\n _this._debug('exec error listeners');\r\n _this._listeners.error.forEach(function (listener) { return _this._callEventListener(event, listener); });\r\n _this._connect();\r\n };\r\n this._handleClose = function (event) {\r\n _this._debug('close event');\r\n _this._clearTimeouts();\r\n if (_this._shouldReconnect) {\r\n _this._connect();\r\n }\r\n if (_this.onclose) {\r\n _this.onclose(event);\r\n }\r\n _this._listeners.close.forEach(function (listener) { return _this._callEventListener(event, listener); });\r\n };\r\n this._url = url;\r\n this._protocols = protocols;\r\n this._options = options;\r\n if (this._options.startClosed) {\r\n this._shouldReconnect = false;\r\n }\r\n this._connect();\r\n }\r\n Object.defineProperty(ReconnectingWebSocket, \"CONNECTING\", {\r\n get: function () {\r\n return 0;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ReconnectingWebSocket, \"OPEN\", {\r\n get: function () {\r\n return 1;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ReconnectingWebSocket, \"CLOSING\", {\r\n get: function () {\r\n return 2;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ReconnectingWebSocket, \"CLOSED\", {\r\n get: function () {\r\n return 3;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ReconnectingWebSocket.prototype, \"CONNECTING\", {\r\n get: function () {\r\n return ReconnectingWebSocket.CONNECTING;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ReconnectingWebSocket.prototype, \"OPEN\", {\r\n get: function () {\r\n return ReconnectingWebSocket.OPEN;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ReconnectingWebSocket.prototype, \"CLOSING\", {\r\n get: function () {\r\n return ReconnectingWebSocket.CLOSING;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ReconnectingWebSocket.prototype, \"CLOSED\", {\r\n get: function () {\r\n return ReconnectingWebSocket.CLOSED;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ReconnectingWebSocket.prototype, \"binaryType\", {\r\n get: function () {\r\n return this._ws ? this._ws.binaryType : this._binaryType;\r\n },\r\n set: function (value) {\r\n this._binaryType = value;\r\n if (this._ws) {\r\n this._ws.binaryType = value;\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ReconnectingWebSocket.prototype, \"retryCount\", {\r\n /**\r\n * Returns the number or connection retries\r\n */\r\n get: function () {\r\n return Math.max(this._retryCount, 0);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ReconnectingWebSocket.prototype, \"bufferedAmount\", {\r\n /**\r\n * The number of bytes of data that have been queued using calls to send() but not yet\r\n * transmitted to the network. This value resets to zero once all queued data has been sent.\r\n * This value does not reset to zero when the connection is closed; if you keep calling send(),\r\n * this will continue to climb. Read only\r\n */\r\n get: function () {\r\n var bytes = this._messageQueue.reduce(function (acc, message) {\r\n if (typeof message === 'string') {\r\n acc += message.length; // not byte size\r\n }\r\n else if (message instanceof Blob) {\r\n acc += message.size;\r\n }\r\n else {\r\n acc += message.byteLength;\r\n }\r\n return acc;\r\n }, 0);\r\n return bytes + (this._ws ? this._ws.bufferedAmount : 0);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ReconnectingWebSocket.prototype, \"extensions\", {\r\n /**\r\n * The extensions selected by the server. This is currently only the empty string or a list of\r\n * extensions as negotiated by the connection\r\n */\r\n get: function () {\r\n return this._ws ? this._ws.extensions : '';\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ReconnectingWebSocket.prototype, \"protocol\", {\r\n /**\r\n * A string indicating the name of the sub-protocol the server selected;\r\n * this will be one of the strings specified in the protocols parameter when creating the\r\n * WebSocket object\r\n */\r\n get: function () {\r\n return this._ws ? this._ws.protocol : '';\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ReconnectingWebSocket.prototype, \"readyState\", {\r\n /**\r\n * The current state of the connection; this is one of the Ready state constants\r\n */\r\n get: function () {\r\n if (this._ws) {\r\n return this._ws.readyState;\r\n }\r\n return this._options.startClosed\r\n ? ReconnectingWebSocket.CLOSED\r\n : ReconnectingWebSocket.CONNECTING;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ReconnectingWebSocket.prototype, \"url\", {\r\n /**\r\n * The URL as resolved by the constructor\r\n */\r\n get: function () {\r\n return this._ws ? this._ws.url : '';\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Closes the WebSocket connection or connection attempt, if any. If the connection is already\r\n * CLOSED, this method does nothing\r\n */\r\n ReconnectingWebSocket.prototype.close = function (code, reason) {\r\n if (code === void 0) { code = 1000; }\r\n this._closeCalled = true;\r\n this._shouldReconnect = false;\r\n this._clearTimeouts();\r\n if (!this._ws) {\r\n this._debug('close enqueued: no ws instance');\r\n return;\r\n }\r\n if (this._ws.readyState === this.CLOSED) {\r\n this._debug('close: already closed');\r\n return;\r\n }\r\n this._ws.close(code, reason);\r\n };\r\n /**\r\n * Closes the WebSocket connection or connection attempt and connects again.\r\n * Resets retry counter;\r\n */\r\n ReconnectingWebSocket.prototype.reconnect = function (code, reason) {\r\n this._shouldReconnect = true;\r\n this._closeCalled = false;\r\n this._retryCount = -1;\r\n if (!this._ws || this._ws.readyState === this.CLOSED) {\r\n this._connect();\r\n }\r\n else {\r\n this._disconnect(code, reason);\r\n this._connect();\r\n }\r\n };\r\n /**\r\n * Enqueue specified data to be transmitted to the server over the WebSocket connection\r\n */\r\n ReconnectingWebSocket.prototype.send = function (data) {\r\n if (this._ws && this._ws.readyState === this.OPEN) {\r\n this._debug('send', data);\r\n this._ws.send(data);\r\n }\r\n else {\r\n var _a = this._options.maxEnqueuedMessages, maxEnqueuedMessages = _a === void 0 ? DEFAULT.maxEnqueuedMessages : _a;\r\n if (this._messageQueue.length < maxEnqueuedMessages) {\r\n this._debug('enqueue', data);\r\n this._messageQueue.push(data);\r\n }\r\n }\r\n };\r\n /**\r\n * Register an event handler of a specific event type\r\n */\r\n ReconnectingWebSocket.prototype.addEventListener = function (type, listener) {\r\n if (this._listeners[type]) {\r\n // @ts-ignore\r\n this._listeners[type].push(listener);\r\n }\r\n };\r\n ReconnectingWebSocket.prototype.dispatchEvent = function (event) {\r\n var e_1, _a;\r\n var listeners = this._listeners[event.type];\r\n if (listeners) {\r\n try {\r\n for (var listeners_1 = __values(listeners), listeners_1_1 = listeners_1.next(); !listeners_1_1.done; listeners_1_1 = listeners_1.next()) {\r\n var listener = listeners_1_1.value;\r\n this._callEventListener(event, listener);\r\n }\r\n }\r\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\r\n finally {\r\n try {\r\n if (listeners_1_1 && !listeners_1_1.done && (_a = listeners_1.return)) _a.call(listeners_1);\r\n }\r\n finally { if (e_1) throw e_1.error; }\r\n }\r\n }\r\n return true;\r\n };\r\n /**\r\n * Removes an event listener\r\n */\r\n ReconnectingWebSocket.prototype.removeEventListener = function (type, listener) {\r\n if (this._listeners[type]) {\r\n // @ts-ignore\r\n this._listeners[type] = this._listeners[type].filter(function (l) { return l !== listener; });\r\n }\r\n };\r\n ReconnectingWebSocket.prototype._debug = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n if (this._options.debug) {\r\n // not using spread because compiled version uses Symbols\r\n // tslint:disable-next-line\r\n console.log.apply(console, __spread(['RWS>'], args));\r\n }\r\n };\r\n ReconnectingWebSocket.prototype._getNextDelay = function () {\r\n var _a = this._options, _b = _a.reconnectionDelayGrowFactor, reconnectionDelayGrowFactor = _b === void 0 ? DEFAULT.reconnectionDelayGrowFactor : _b, _c = _a.minReconnectionDelay, minReconnectionDelay = _c === void 0 ? DEFAULT.minReconnectionDelay : _c, _d = _a.maxReconnectionDelay, maxReconnectionDelay = _d === void 0 ? DEFAULT.maxReconnectionDelay : _d;\r\n var delay = 0;\r\n if (this._retryCount > 0) {\r\n delay =\r\n minReconnectionDelay * Math.pow(reconnectionDelayGrowFactor, this._retryCount - 1);\r\n if (delay > maxReconnectionDelay) {\r\n delay = maxReconnectionDelay;\r\n }\r\n }\r\n this._debug('next delay', delay);\r\n return delay;\r\n };\r\n ReconnectingWebSocket.prototype._wait = function () {\r\n var _this = this;\r\n return new Promise(function (resolve) {\r\n setTimeout(resolve, _this._getNextDelay());\r\n });\r\n };\r\n ReconnectingWebSocket.prototype._getNextUrl = function (urlProvider) {\r\n if (typeof urlProvider === 'string') {\r\n return Promise.resolve(urlProvider);\r\n }\r\n if (typeof urlProvider === 'function') {\r\n var url = urlProvider();\r\n if (typeof url === 'string') {\r\n return Promise.resolve(url);\r\n }\r\n if (!!url.then) {\r\n return url;\r\n }\r\n }\r\n throw Error('Invalid URL');\r\n };\r\n ReconnectingWebSocket.prototype._connect = function () {\r\n var _this = this;\r\n if (this._connectLock || !this._shouldReconnect) {\r\n return;\r\n }\r\n this._connectLock = true;\r\n var _a = this._options, _b = _a.maxRetries, maxRetries = _b === void 0 ? DEFAULT.maxRetries : _b, _c = _a.connectionTimeout, connectionTimeout = _c === void 0 ? DEFAULT.connectionTimeout : _c, _d = _a.WebSocket, WebSocket = _d === void 0 ? getGlobalWebSocket() : _d;\r\n if (this._retryCount >= maxRetries) {\r\n this._debug('max retries reached', this._retryCount, '>=', maxRetries);\r\n return;\r\n }\r\n this._retryCount++;\r\n this._debug('connect', this._retryCount);\r\n this._removeListeners();\r\n if (!isWebSocket(WebSocket)) {\r\n throw Error('No valid WebSocket class provided');\r\n }\r\n this._wait()\r\n .then(function () { return _this._getNextUrl(_this._url); })\r\n .then(function (url) {\r\n // close could be called before creating the ws\r\n if (_this._closeCalled) {\r\n return;\r\n }\r\n _this._debug('connect', { url: url, protocols: _this._protocols });\r\n _this._ws = _this._protocols\r\n ? new WebSocket(url, _this._protocols)\r\n : new WebSocket(url);\r\n _this._ws.binaryType = _this._binaryType;\r\n _this._connectLock = false;\r\n _this._addListeners();\r\n _this._connectTimeout = setTimeout(function () { return _this._handleTimeout(); }, connectionTimeout);\r\n });\r\n };\r\n ReconnectingWebSocket.prototype._handleTimeout = function () {\r\n this._debug('timeout event');\r\n this._handleError(new ErrorEvent(Error('TIMEOUT'), this));\r\n };\r\n ReconnectingWebSocket.prototype._disconnect = function (code, reason) {\r\n if (code === void 0) { code = 1000; }\r\n this._clearTimeouts();\r\n if (!this._ws) {\r\n return;\r\n }\r\n this._removeListeners();\r\n try {\r\n this._ws.close(code, reason);\r\n this._handleClose(new CloseEvent(code, reason, this));\r\n }\r\n catch (error) {\r\n // ignore\r\n }\r\n };\r\n ReconnectingWebSocket.prototype._acceptOpen = function () {\r\n this._debug('accept open');\r\n this._retryCount = 0;\r\n };\r\n ReconnectingWebSocket.prototype._callEventListener = function (event, listener) {\r\n if ('handleEvent' in listener) {\r\n // @ts-ignore\r\n listener.handleEvent(event);\r\n }\r\n else {\r\n // @ts-ignore\r\n listener(event);\r\n }\r\n };\r\n ReconnectingWebSocket.prototype._removeListeners = function () {\r\n if (!this._ws) {\r\n return;\r\n }\r\n this._debug('removeListeners');\r\n this._ws.removeEventListener('open', this._handleOpen);\r\n this._ws.removeEventListener('close', this._handleClose);\r\n this._ws.removeEventListener('message', this._handleMessage);\r\n // @ts-ignore\r\n this._ws.removeEventListener('error', this._handleError);\r\n };\r\n ReconnectingWebSocket.prototype._addListeners = function () {\r\n if (!this._ws) {\r\n return;\r\n }\r\n this._debug('addListeners');\r\n this._ws.addEventListener('open', this._handleOpen);\r\n this._ws.addEventListener('close', this._handleClose);\r\n this._ws.addEventListener('message', this._handleMessage);\r\n // @ts-ignore\r\n this._ws.addEventListener('error', this._handleError);\r\n };\r\n ReconnectingWebSocket.prototype._clearTimeouts = function () {\r\n clearTimeout(this._connectTimeout);\r\n clearTimeout(this._uptimeTimeout);\r\n };\r\n return ReconnectingWebSocket;\r\n}());\n\nexport default ReconnectingWebSocket;\n"],"names":["extendStatics","d","b","p","__extends","__","__values","o","m","i","__read","n","ar","e","error","__spread","Event","type","target","ErrorEvent","_super","_this","CloseEvent","code","reason","getGlobalWebSocket","isWebSocket","w","DEFAULT","ReconnectingWebSocket","url","protocols","options","event","_a","minUptime","message","listener","value","bytes","acc","data","maxEnqueuedMessages","e_1","listeners","listeners_1","listeners_1_1","e_1_1","l","args","_i","_b","reconnectionDelayGrowFactor","_c","minReconnectionDelay","_d","maxReconnectionDelay","delay","resolve","urlProvider","maxRetries","connectionTimeout","WebSocket"],"mappings":"AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gFAgBA,IAAIA,EAAgB,SAASC,EAAGC,EAAG,CAC/B,OAAAF,EAAgB,OAAO,gBAClB,CAAE,UAAW,CAAA,aAAgB,OAAS,SAAUC,EAAGC,EAAG,CAAED,EAAE,UAAYC,CAAG,GAC1E,SAAUD,EAAGC,EAAG,CAAE,QAASC,KAAKD,EAAOA,EAAE,eAAeC,CAAC,IAAGF,EAAEE,CAAC,EAAID,EAAEC,CAAC,EAAG,EACtEH,EAAcC,EAAGC,CAAC,CAC7B,EAEA,SAASE,EAAUH,EAAGC,EAAG,CACrBF,EAAcC,EAAGC,CAAC,EAClB,SAASG,GAAK,CAAE,KAAK,YAAcJ,CAAG,CACtCA,EAAE,UAAYC,IAAM,KAAO,OAAO,OAAOA,CAAC,GAAKG,EAAG,UAAYH,EAAE,UAAW,IAAIG,EACnF,CAEA,SAASC,EAASC,EAAG,CACjB,IAAIC,EAAI,OAAO,QAAW,YAAcD,EAAE,OAAO,QAAQ,EAAGE,EAAI,EAChE,OAAID,EAAUA,EAAE,KAAKD,CAAC,EACf,CACH,KAAM,UAAY,CACd,OAAIA,GAAKE,GAAKF,EAAE,SAAQA,EAAI,QACrB,CAAE,MAAOA,GAAKA,EAAEE,GAAG,EAAG,KAAM,CAACF,EACxC,CACR,CACA,CAEA,SAASG,EAAOH,EAAGI,EAAG,CAClB,IAAIH,EAAI,OAAO,QAAW,YAAcD,EAAE,OAAO,QAAQ,EACzD,GAAI,CAACC,EAAG,OAAOD,EACf,IAAIE,EAAID,EAAE,KAAKD,CAAC,EAAG,EAAGK,EAAK,CAAA,EAAIC,EAC/B,GAAI,CACA,MAAQF,IAAM,QAAUA,KAAM,IAAM,EAAE,EAAIF,EAAE,KAAI,GAAI,MAAMG,EAAG,KAAK,EAAE,KAAK,CAC7E,OACOE,EAAO,CAAED,EAAI,CAAE,MAAOC,CAAK,CAAI,QAC1C,CACQ,GAAI,CACI,GAAK,CAAC,EAAE,OAASN,EAAIC,EAAE,SAAYD,EAAE,KAAKC,CAAC,CACnD,QACR,CAAkB,GAAII,EAAG,MAAMA,EAAE,KAAO,CACpC,CACA,OAAOD,CACX,CAEA,SAASG,GAAW,CAChB,QAASH,EAAK,CAAA,EAAIH,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAC3CG,EAAKA,EAAG,OAAOF,EAAO,UAAUD,CAAC,CAAC,CAAC,EACvC,OAAOG,CACX,CAEA,IAAII,GAAuB,UAAY,CACnC,SAASA,EAAMC,EAAMC,EAAQ,CACzB,KAAK,OAASA,EACd,KAAK,KAAOD,CAChB,CACA,OAAOD,CACX,GAAC,EACGG,GAA4B,SAAUC,EAAQ,CAC9ChB,EAAUe,EAAYC,CAAM,EAC5B,SAASD,EAAWL,EAAOI,EAAQ,CAC/B,IAAIG,EAAQD,EAAO,KAAK,KAAM,QAASF,CAAM,GAAK,KAClD,OAAAG,EAAM,QAAUP,EAAM,QACtBO,EAAM,MAAQP,EACPO,CACX,CACA,OAAOF,CACX,GAAEH,CAAK,EACHM,GAA4B,SAAUF,EAAQ,CAC9ChB,EAAUkB,EAAYF,CAAM,EAC5B,SAASE,EAAWC,EAAMC,EAAQN,EAAQ,CAClCK,IAAS,SAAUA,EAAO,KAC1BC,IAAW,SAAUA,EAAS,IAClC,IAAIH,EAAQD,EAAO,KAAK,KAAM,QAASF,CAAM,GAAK,KAClD,OAAAG,EAAM,SAAW,GACjBA,EAAM,KAAOE,EACbF,EAAM,OAASG,EACRH,CACX,CACA,OAAOC,CACX,GAAEN,CAAK,EAEP;AAAA;AAAA;AAAA;AAAA;AAAA,GAMA,IAAIS,EAAqB,UAAY,CACjC,GAAI,OAAO,UAAc,IAErB,OAAO,SAEf,EAIIC,EAAc,SAAUC,EAAG,CAAE,OAAO,OAAOA,EAAM,KAAe,CAAC,CAACA,GAAKA,EAAE,UAAY,CAAG,EACxFC,EAAU,CACV,qBAAsB,IACtB,qBAAsB,IAAO,KAAK,OAAM,EAAK,IAC7C,UAAW,IACX,4BAA6B,IAC7B,kBAAmB,IACnB,WAAY,IACZ,oBAAqB,GAGzB,EACIC,GAAuC,UAAY,CACnD,SAASA,EAAsBC,EAAKC,EAAWC,EAAS,CACpD,IAAIX,EAAQ,KACRW,IAAY,SAAUA,EAAU,CAAA,GACpC,KAAK,WAAa,CACd,MAAO,CAAA,EACP,QAAS,CAAA,EACT,KAAM,CAAA,EACN,MAAO,CAAA,CACnB,EACQ,KAAK,YAAc,GACnB,KAAK,iBAAmB,GACxB,KAAK,aAAe,GACpB,KAAK,YAAc,OACnB,KAAK,aAAe,GACpB,KAAK,cAAgB,GAIrB,KAAK,QAAU,KAIf,KAAK,QAAU,KAIf,KAAK,UAAY,KAKjB,KAAK,OAAS,KACd,KAAK,YAAc,SAAUC,EAAO,CAChCZ,EAAM,OAAO,YAAY,EACzB,IAAIa,EAAKb,EAAM,SAAS,UAAWc,EAAYD,IAAO,OAASN,EAAQ,UAAYM,EACnF,aAAab,EAAM,eAAe,EAClCA,EAAM,eAAiB,WAAW,UAAY,CAAE,OAAOA,EAAM,aAAe,EAAGc,CAAS,EACxFd,EAAM,IAAI,WAAaA,EAAM,YAE7BA,EAAM,cAAc,QAAQ,SAAUe,EAAS,CAAE,OAAOf,EAAM,IAAI,KAAKe,CAAO,CAAG,CAAC,EAClFf,EAAM,cAAgB,GAClBA,EAAM,QACNA,EAAM,OAAOY,CAAK,EAEtBZ,EAAM,WAAW,KAAK,QAAQ,SAAUgB,EAAU,CAAE,OAAOhB,EAAM,mBAAmBY,EAAOI,CAAQ,CAAG,CAAC,CAC3G,EACA,KAAK,eAAiB,SAAUJ,EAAO,CACnCZ,EAAM,OAAO,eAAe,EACxBA,EAAM,WACNA,EAAM,UAAUY,CAAK,EAEzBZ,EAAM,WAAW,QAAQ,QAAQ,SAAUgB,EAAU,CAAE,OAAOhB,EAAM,mBAAmBY,EAAOI,CAAQ,CAAG,CAAC,CAC9G,EACA,KAAK,aAAe,SAAUJ,EAAO,CACjCZ,EAAM,OAAO,cAAeY,EAAM,OAAO,EACzCZ,EAAM,YAAY,OAAWY,EAAM,UAAY,UAAY,UAAY,MAAS,EAC5EZ,EAAM,SACNA,EAAM,QAAQY,CAAK,EAEvBZ,EAAM,OAAO,sBAAsB,EACnCA,EAAM,WAAW,MAAM,QAAQ,SAAUgB,EAAU,CAAE,OAAOhB,EAAM,mBAAmBY,EAAOI,CAAQ,CAAG,CAAC,EACxGhB,EAAM,SAAQ,CAClB,EACA,KAAK,aAAe,SAAUY,EAAO,CACjCZ,EAAM,OAAO,aAAa,EAC1BA,EAAM,eAAc,EAChBA,EAAM,kBACNA,EAAM,SAAQ,EAEdA,EAAM,SACNA,EAAM,QAAQY,CAAK,EAEvBZ,EAAM,WAAW,MAAM,QAAQ,SAAUgB,EAAU,CAAE,OAAOhB,EAAM,mBAAmBY,EAAOI,CAAQ,CAAG,CAAC,CAC5G,EACA,KAAK,KAAOP,EACZ,KAAK,WAAaC,EAClB,KAAK,SAAWC,EACZ,KAAK,SAAS,cACd,KAAK,iBAAmB,IAE5B,KAAK,SAAQ,CACjB,CACA,cAAO,eAAeH,EAAuB,aAAc,CACvD,IAAK,UAAY,CACb,MAAO,EACX,EACA,WAAY,GACZ,aAAc,EACtB,CAAK,EACD,OAAO,eAAeA,EAAuB,OAAQ,CACjD,IAAK,UAAY,CACb,MAAO,EACX,EACA,WAAY,GACZ,aAAc,EACtB,CAAK,EACD,OAAO,eAAeA,EAAuB,UAAW,CACpD,IAAK,UAAY,CACb,MAAO,EACX,EACA,WAAY,GACZ,aAAc,EACtB,CAAK,EACD,OAAO,eAAeA,EAAuB,SAAU,CACnD,IAAK,UAAY,CACb,MAAO,EACX,EACA,WAAY,GACZ,aAAc,EACtB,CAAK,EACD,OAAO,eAAeA,EAAsB,UAAW,aAAc,CACjE,IAAK,UAAY,CACb,OAAOA,EAAsB,UACjC,EACA,WAAY,GACZ,aAAc,EACtB,CAAK,EACD,OAAO,eAAeA,EAAsB,UAAW,OAAQ,CAC3D,IAAK,UAAY,CACb,OAAOA,EAAsB,IACjC,EACA,WAAY,GACZ,aAAc,EACtB,CAAK,EACD,OAAO,eAAeA,EAAsB,UAAW,UAAW,CAC9D,IAAK,UAAY,CACb,OAAOA,EAAsB,OACjC,EACA,WAAY,GACZ,aAAc,EACtB,CAAK,EACD,OAAO,eAAeA,EAAsB,UAAW,SAAU,CAC7D,IAAK,UAAY,CACb,OAAOA,EAAsB,MACjC,EACA,WAAY,GACZ,aAAc,EACtB,CAAK,EACD,OAAO,eAAeA,EAAsB,UAAW,aAAc,CACjE,IAAK,UAAY,CACb,OAAO,KAAK,IAAM,KAAK,IAAI,WAAa,KAAK,WACjD,EACA,IAAK,SAAUS,EAAO,CAClB,KAAK,YAAcA,EACf,KAAK,MACL,KAAK,IAAI,WAAaA,EAE9B,EACA,WAAY,GACZ,aAAc,EACtB,CAAK,EACD,OAAO,eAAeT,EAAsB,UAAW,aAAc,CAIjE,IAAK,UAAY,CACb,OAAO,KAAK,IAAI,KAAK,YAAa,CAAC,CACvC,EACA,WAAY,GACZ,aAAc,EACtB,CAAK,EACD,OAAO,eAAeA,EAAsB,UAAW,iBAAkB,CAOrE,IAAK,UAAY,CACb,IAAIU,EAAQ,KAAK,cAAc,OAAO,SAAUC,EAAKJ,EAAS,CAC1D,OAAI,OAAOA,GAAY,SACnBI,GAAOJ,EAAQ,OAEVA,aAAmB,KACxBI,GAAOJ,EAAQ,KAGfI,GAAOJ,EAAQ,WAEZI,CACX,EAAG,CAAC,EACJ,OAAOD,GAAS,KAAK,IAAM,KAAK,IAAI,eAAiB,EACzD,EACA,WAAY,GACZ,aAAc,EACtB,CAAK,EACD,OAAO,eAAeV,EAAsB,UAAW,aAAc,CAKjE,IAAK,UAAY,CACb,OAAO,KAAK,IAAM,KAAK,IAAI,WAAa,EAC5C,EACA,WAAY,GACZ,aAAc,EACtB,CAAK,EACD,OAAO,eAAeA,EAAsB,UAAW,WAAY,CAM/D,IAAK,UAAY,CACb,OAAO,KAAK,IAAM,KAAK,IAAI,SAAW,EAC1C,EACA,WAAY,GACZ,aAAc,EACtB,CAAK,EACD,OAAO,eAAeA,EAAsB,UAAW,aAAc,CAIjE,IAAK,UAAY,CACb,OAAI,KAAK,IACE,KAAK,IAAI,WAEb,KAAK,SAAS,YACfA,EAAsB,OACtBA,EAAsB,UAChC,EACA,WAAY,GACZ,aAAc,EACtB,CAAK,EACD,OAAO,eAAeA,EAAsB,UAAW,MAAO,CAI1D,IAAK,UAAY,CACb,OAAO,KAAK,IAAM,KAAK,IAAI,IAAM,EACrC,EACA,WAAY,GACZ,aAAc,EACtB,CAAK,EAKDA,EAAsB,UAAU,MAAQ,SAAUN,EAAMC,EAAQ,CAK5D,GAJID,IAAS,SAAUA,EAAO,KAC9B,KAAK,aAAe,GACpB,KAAK,iBAAmB,GACxB,KAAK,eAAc,EACf,CAAC,KAAK,IAAK,CACX,KAAK,OAAO,gCAAgC,EAC5C,MACJ,CACA,GAAI,KAAK,IAAI,aAAe,KAAK,OAAQ,CACrC,KAAK,OAAO,uBAAuB,EACnC,MACJ,CACA,KAAK,IAAI,MAAMA,EAAMC,CAAM,CAC/B,EAKAK,EAAsB,UAAU,UAAY,SAAUN,EAAMC,EAAQ,CAChE,KAAK,iBAAmB,GACxB,KAAK,aAAe,GACpB,KAAK,YAAc,GACf,CAAC,KAAK,KAAO,KAAK,IAAI,aAAe,KAAK,OAC1C,KAAK,SAAQ,GAGb,KAAK,YAAYD,EAAMC,CAAM,EAC7B,KAAK,SAAQ,EAErB,EAIAK,EAAsB,UAAU,KAAO,SAAUY,EAAM,CACnD,GAAI,KAAK,KAAO,KAAK,IAAI,aAAe,KAAK,KACzC,KAAK,OAAO,OAAQA,CAAI,EACxB,KAAK,IAAI,KAAKA,CAAI,MAEjB,CACD,IAAIP,EAAK,KAAK,SAAS,oBAAqBQ,EAAsBR,IAAO,OAASN,EAAQ,oBAAsBM,EAC5G,KAAK,cAAc,OAASQ,IAC5B,KAAK,OAAO,UAAWD,CAAI,EAC3B,KAAK,cAAc,KAAKA,CAAI,EAEpC,CACJ,EAIAZ,EAAsB,UAAU,iBAAmB,SAAUZ,EAAMoB,EAAU,CACrE,KAAK,WAAWpB,CAAI,GAEpB,KAAK,WAAWA,CAAI,EAAE,KAAKoB,CAAQ,CAE3C,EACAR,EAAsB,UAAU,cAAgB,SAAUI,EAAO,CAC7D,IAAIU,EAAKT,EACLU,EAAY,KAAK,WAAWX,EAAM,IAAI,EAC1C,GAAIW,EACA,GAAI,CACA,QAASC,EAAcvC,EAASsC,CAAS,EAAGE,EAAgBD,EAAY,KAAI,EAAI,CAACC,EAAc,KAAMA,EAAgBD,EAAY,KAAI,EAAI,CACrI,IAAIR,EAAWS,EAAc,MAC7B,KAAK,mBAAmBb,EAAOI,CAAQ,CAC3C,CACJ,OACOU,EAAO,CAAEJ,EAAM,CAAE,MAAOI,CAAK,CAAI,QACpD,CACgB,GAAI,CACID,GAAiB,CAACA,EAAc,OAASZ,EAAKW,EAAY,SAASX,EAAG,KAAKW,CAAW,CAC9F,QAChB,CAA0B,GAAIF,EAAK,MAAMA,EAAI,KAAO,CACxC,CAEJ,MAAO,EACX,EAIAd,EAAsB,UAAU,oBAAsB,SAAUZ,EAAMoB,EAAU,CACxE,KAAK,WAAWpB,CAAI,IAEpB,KAAK,WAAWA,CAAI,EAAI,KAAK,WAAWA,CAAI,EAAE,OAAO,SAAU+B,EAAG,CAAE,OAAOA,IAAMX,CAAU,CAAC,EAEpG,EACAR,EAAsB,UAAU,OAAS,UAAY,CAEjD,QADIoB,EAAO,CAAA,EACFC,EAAK,EAAGA,EAAK,UAAU,OAAQA,IACpCD,EAAKC,CAAE,EAAI,UAAUA,CAAE,EAEvB,KAAK,SAAS,OAGd,QAAQ,IAAI,MAAM,QAASnC,EAAS,CAAC,MAAM,EAAGkC,CAAI,CAAC,CAE3D,EACApB,EAAsB,UAAU,cAAgB,UAAY,CACxD,IAAIK,EAAK,KAAK,SAAUiB,EAAKjB,EAAG,4BAA6BkB,EAA8BD,IAAO,OAASvB,EAAQ,4BAA8BuB,EAAIE,EAAKnB,EAAG,qBAAsBoB,EAAuBD,IAAO,OAASzB,EAAQ,qBAAuByB,EAAIE,EAAKrB,EAAG,qBAAsBsB,EAAuBD,IAAO,OAAS3B,EAAQ,qBAAuB2B,EAC7VE,EAAQ,EACZ,OAAI,KAAK,YAAc,IACnBA,EACIH,EAAuB,KAAK,IAAIF,EAA6B,KAAK,YAAc,CAAC,EACjFK,EAAQD,IACRC,EAAQD,IAGhB,KAAK,OAAO,aAAcC,CAAK,EACxBA,CACX,EACA5B,EAAsB,UAAU,MAAQ,UAAY,CAChD,IAAIR,EAAQ,KACZ,OAAO,IAAI,QAAQ,SAAUqC,EAAS,CAClC,WAAWA,EAASrC,EAAM,cAAa,CAAE,CAC7C,CAAC,CACL,EACAQ,EAAsB,UAAU,YAAc,SAAU8B,EAAa,CACjE,GAAI,OAAOA,GAAgB,SACvB,OAAO,QAAQ,QAAQA,CAAW,EAEtC,GAAI,OAAOA,GAAgB,WAAY,CACnC,IAAI7B,EAAM6B,IACV,GAAI,OAAO7B,GAAQ,SACf,OAAO,QAAQ,QAAQA,CAAG,EAE9B,GAAMA,EAAI,KACN,OAAOA,CAEf,CACA,MAAM,MAAM,aAAa,CAC7B,EACAD,EAAsB,UAAU,SAAW,UAAY,CACnD,IAAIR,EAAQ,KACZ,GAAI,OAAK,cAAgB,CAAC,KAAK,kBAG/B,MAAK,aAAe,GACpB,IAAIa,EAAK,KAAK,SAAUiB,EAAKjB,EAAG,WAAY0B,EAAaT,IAAO,OAASvB,EAAQ,WAAauB,EAAIE,EAAKnB,EAAG,kBAAmB2B,EAAoBR,IAAO,OAASzB,EAAQ,kBAAoByB,EAAIE,EAAKrB,EAAG,UAAW4B,EAAYP,IAAO,OAAS9B,EAAkB,EAAK8B,EACvQ,GAAI,KAAK,aAAeK,EAAY,CAChC,KAAK,OAAO,sBAAuB,KAAK,YAAa,KAAMA,CAAU,EACrE,MACJ,CAIA,GAHA,KAAK,cACL,KAAK,OAAO,UAAW,KAAK,WAAW,EACvC,KAAK,iBAAgB,EACjB,CAAClC,EAAYoC,CAAS,EACtB,MAAM,MAAM,mCAAmC,EAEnD,KAAK,MAAK,EACL,KAAK,UAAY,CAAE,OAAOzC,EAAM,YAAYA,EAAM,IAAI,CAAG,CAAC,EAC1D,KAAK,SAAUS,EAAK,CAEjBT,EAAM,eAGVA,EAAM,OAAO,UAAW,CAAE,IAAKS,EAAK,UAAWT,EAAM,UAAU,CAAE,EACjEA,EAAM,IAAMA,EAAM,WACZ,IAAIyC,EAAUhC,EAAKT,EAAM,UAAU,EACnC,IAAIyC,EAAUhC,CAAG,EACvBT,EAAM,IAAI,WAAaA,EAAM,YAC7BA,EAAM,aAAe,GACrBA,EAAM,cAAa,EACnBA,EAAM,gBAAkB,WAAW,UAAY,CAAE,OAAOA,EAAM,gBAAkB,EAAGwC,CAAiB,EACxG,CAAC,EACL,EACAhC,EAAsB,UAAU,eAAiB,UAAY,CACzD,KAAK,OAAO,eAAe,EAC3B,KAAK,aAAa,IAAIV,EAAW,MAAM,SAAS,EAAG,IAAI,CAAC,CAC5D,EACAU,EAAsB,UAAU,YAAc,SAAUN,EAAMC,EAAQ,CAGlE,GAFID,IAAS,SAAUA,EAAO,KAC9B,KAAK,eAAc,EACf,EAAC,KAAK,IAGV,MAAK,iBAAgB,EACrB,GAAI,CACA,KAAK,IAAI,MAAMA,EAAMC,CAAM,EAC3B,KAAK,aAAa,IAAIF,EAAWC,EAAMC,EAAQ,IAAI,CAAC,CACxD,MACc,CAEd,EACJ,EACAK,EAAsB,UAAU,YAAc,UAAY,CACtD,KAAK,OAAO,aAAa,EACzB,KAAK,YAAc,CACvB,EACAA,EAAsB,UAAU,mBAAqB,SAAUI,EAAOI,EAAU,CACxE,gBAAiBA,EAEjBA,EAAS,YAAYJ,CAAK,EAI1BI,EAASJ,CAAK,CAEtB,EACAJ,EAAsB,UAAU,iBAAmB,UAAY,CACtD,KAAK,MAGV,KAAK,OAAO,iBAAiB,EAC7B,KAAK,IAAI,oBAAoB,OAAQ,KAAK,WAAW,EACrD,KAAK,IAAI,oBAAoB,QAAS,KAAK,YAAY,EACvD,KAAK,IAAI,oBAAoB,UAAW,KAAK,cAAc,EAE3D,KAAK,IAAI,oBAAoB,QAAS,KAAK,YAAY,EAC3D,EACAA,EAAsB,UAAU,cAAgB,UAAY,CACnD,KAAK,MAGV,KAAK,OAAO,cAAc,EAC1B,KAAK,IAAI,iBAAiB,OAAQ,KAAK,WAAW,EAClD,KAAK,IAAI,iBAAiB,QAAS,KAAK,YAAY,EACpD,KAAK,IAAI,iBAAiB,UAAW,KAAK,cAAc,EAExD,KAAK,IAAI,iBAAiB,QAAS,KAAK,YAAY,EACxD,EACAA,EAAsB,UAAU,eAAiB,UAAY,CACzD,aAAa,KAAK,eAAe,EACjC,aAAa,KAAK,cAAc,CACpC,EACOA,CACX,GAAC","x_google_ignoreList":[0]}
@@ -5,7 +5,7 @@
5
5
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>Portagent - AgentX Portal</title>
8
- <script type="module" crossorigin src="/assets/index-CNC7DxMj.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-Bq2LVeC5.js"></script>
9
9
  <link rel="stylesheet" crossorigin href="/assets/index-DYPjKVjB.css">
10
10
  </head>
11
11
  <body>
@@ -531,7 +531,7 @@ function getDataPaths() {
531
531
  }
532
532
  var PORT = parseInt(process.env.PORT || "5200", 10);
533
533
  var JWT_SECRET = process.env.JWT_SECRET || crypto.randomUUID();
534
- var INVITE_CODE_REQUIRED = process.env.INVITE_CODE_REQUIRED !== "false";
534
+ var INVITE_CODE_REQUIRED = process.env.INVITE_CODE_REQUIRED === "true";
535
535
  async function createApp() {
536
536
  const paths = getDataPaths();
537
537
  const app = new Hono2();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/index.ts","../../src/server/auth.ts","../../src/server/database/SQLiteUserRepository.ts","../../src/server/logger.ts"],"sourcesContent":["/**\n * Portagent Server\n *\n * Hono-based server that combines:\n * - AgentX API (via WebSocket on /ws)\n * - Authentication (JWT)\n * - Static file serving (Vite build output)\n *\n * Single port architecture:\n * - HTTP requests handled by Hono\n * - WebSocket upgrade on /ws path handled by AgentX\n */\n\nimport { dirname, resolve } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { createServer } from \"http\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nimport { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { serveStatic } from \"@hono/node-server/serve-static\";\nimport { existsSync, readFileSync } from \"fs\";\n\nimport { createAgentX } from \"agentxjs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { mkdirSync } from \"node:fs\";\n\nimport { createAuthMiddleware, authRoutes } from \"./auth\";\nimport { SQLiteUserRepository } from \"./database\";\nimport { PinoLoggerFactory } from \"./logger\";\n\n/**\n * Get data directory paths\n * Uses DATA_DIR env var, or defaults to ~/.agentx\n *\n * Directory structure:\n * data-dir/\n * ├── data/ # Database files\n * │ ├── agentx.db\n * │ └── portagent.db\n * └── logs/ # Log files\n * └── portagent.log\n */\nfunction getDataPaths() {\n const dataDir = process.env.DATA_DIR || join(homedir(), \".agentx\");\n const dataDirPath = join(dataDir, \"data\");\n const logsDirPath = join(dataDir, \"logs\");\n\n // Ensure directories exist\n mkdirSync(dataDirPath, { recursive: true });\n mkdirSync(logsDirPath, { recursive: true });\n\n return {\n dataDir,\n dataDirPath,\n logsDirPath,\n userDbPath: join(dataDirPath, \"portagent.db\"),\n agentxDbPath: join(dataDirPath, \"agentx.db\"),\n logFilePath: join(logsDirPath, \"portagent.log\"),\n };\n}\n\n// Configuration from environment\nconst PORT = parseInt(process.env.PORT || \"5200\", 10);\nconst JWT_SECRET = process.env.JWT_SECRET || crypto.randomUUID();\nconst INVITE_CODE_REQUIRED = process.env.INVITE_CODE_REQUIRED !== \"false\"; // default: true\n\n/**\n * Create and configure the Hono app\n */\nasync function createApp() {\n const paths = getDataPaths();\n const app = new Hono();\n\n // CORS\n app.use(\n \"*\",\n cors({\n origin: \"*\",\n allowMethods: [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"HEAD\", \"OPTIONS\"],\n allowHeaders: [\"Content-Type\", \"Authorization\"],\n })\n );\n\n // Check API key\n const apiKey = process.env.LLM_PROVIDER_KEY;\n if (!apiKey) {\n console.error(\"Error: LLM_PROVIDER_KEY is required\");\n console.log(\"\\nSet it via environment variable:\");\n console.log(\" export LLM_PROVIDER_KEY=sk-ant-xxx\");\n process.exit(1);\n }\n\n // Create HTTP server using @hono/node-server's serve function internally\n // We need to create the server ourselves to pass it to AgentX\n const { getRequestListener } = await import(\"@hono/node-server\");\n const listener = getRequestListener(app.fetch);\n const server = createServer(listener);\n\n // Create logger factory\n const logLevel = (process.env.LOG_LEVEL || \"info\") as \"debug\" | \"info\" | \"warn\" | \"error\";\n const loggerFactory = new PinoLoggerFactory({\n level: logLevel,\n logDir: paths.logsDirPath,\n pretty: process.env.NODE_ENV !== \"production\",\n });\n\n // Create AgentX instance attached to HTTP server\n // WebSocket upgrade will be handled on /ws path\n const agentx = await createAgentX({\n llm: {\n apiKey,\n baseUrl: process.env.LLM_PROVIDER_URL,\n model: process.env.LLM_PROVIDER_MODEL,\n },\n storage: {\n driver: \"sqlite\",\n path: paths.agentxDbPath,\n },\n logger: {\n level: logLevel,\n factory: loggerFactory,\n },\n server, // Attach to existing HTTP server\n });\n\n // Initialize user repository (separate database)\n const userRepository = new SQLiteUserRepository(paths.userDbPath);\n\n // Auth middleware\n const authMiddleware = createAuthMiddleware(JWT_SECRET);\n\n // ============================================================\n // Routes\n // ============================================================\n\n // Health check (no auth)\n app.get(\"/health\", (c) => c.json({ status: \"ok\", timestamp: Date.now() }));\n\n // Auth routes (register, login)\n app.route(\n \"/api/auth\",\n authRoutes(userRepository, JWT_SECRET, agentx, { inviteCodeRequired: INVITE_CODE_REQUIRED })\n );\n\n // AgentX info endpoint (protected)\n app.use(\"/agentx/*\", authMiddleware);\n app.get(\"/agentx/info\", (c) => {\n return c.json({\n version: \"0.1.0\",\n wsPath: \"/ws\",\n });\n });\n\n // Static files\n const publicDir = resolve(__dirname, \"../public\");\n const isDev = process.env.NODE_ENV !== \"production\";\n\n if (existsSync(publicDir)) {\n // Serve static files\n app.use(\"/*\", serveStatic({ root: publicDir }));\n\n // SPA fallback - serve index.html for all unmatched routes\n app.get(\"*\", (c) => {\n const indexPath = resolve(publicDir, \"index.html\");\n if (existsSync(indexPath)) {\n const html = readFileSync(indexPath, \"utf-8\");\n return c.html(html);\n }\n return c.text(\"Not Found\", 404);\n });\n } else if (isDev) {\n app.get(\"*\", (c) => {\n return c.text(\n \"Static files not found. Run 'pnpm build:client' first, or use 'pnpm dev' for development.\",\n 404\n );\n });\n }\n\n return { app, server, agentx, userRepository, paths };\n}\n\n/**\n * Start the server\n */\nasync function startServer() {\n const { server, agentx, userRepository, paths } = await createApp();\n\n console.log(`\n ____ _ _\n | _ \\\\ ___ _ __| |_ __ _ __ _ ___ _ __ | |_\n | |_) / _ \\\\| '__| __/ _\\` |/ _\\` |/ _ \\\\ '_ \\\\| __|\n | __/ (_) | | | || (_| | (_| | __/ | | | |_\n |_| \\\\___/|_| \\\\__\\\\__,_|\\\\__, |\\\\___|_| |_|\\\\__|\n |___/\n\n AgentX Portal - Your AI Agent Gateway (Multi-User Mode)\n`);\n\n console.log(\"Configuration:\");\n console.log(` Port: ${PORT}`);\n console.log(` Data Dir: ${paths.dataDir}`);\n console.log(` API Key: ${process.env.LLM_PROVIDER_KEY!.substring(0, 15)}...`);\n console.log(` User DB: ${paths.userDbPath}`);\n console.log(` AgentX DB: ${paths.agentxDbPath}`);\n console.log(` Logs: ${paths.logsDirPath}`);\n console.log(` Invite Code: ${INVITE_CODE_REQUIRED ? \"required\" : \"disabled\"}`);\n\n console.log(`\\nEndpoints:`);\n console.log(` GET /health - Health check`);\n console.log(` POST /api/auth/register - Register new user`);\n console.log(` POST /api/auth/login - Login`);\n console.log(` GET /api/auth/verify - Verify token`);\n console.log(` GET /agentx/info - Platform info`);\n console.log(` WS /ws - WebSocket connection`);\n\n // Start HTTP server (WebSocket is already attached)\n server.listen(PORT, \"0.0.0.0\", () => {\n console.log(`\\n🚀 Server running at http://localhost:${PORT}`);\n console.log(`🔌 WebSocket available at ws://localhost:${PORT}/ws`);\n });\n\n // Graceful shutdown\n const shutdown = async () => {\n console.log(\"\\nShutting down...\");\n await agentx.dispose();\n userRepository.close();\n server.close();\n console.log(\"Server stopped\");\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n\nexport { createApp, startServer };\n","/**\n * Authentication Module\n *\n * Multi-user authentication with JWT tokens.\n * Supports user registration and login.\n */\n\nimport { Hono } from \"hono\";\nimport { createMiddleware } from \"hono/factory\";\nimport * as jose from \"jose\";\nimport type { AgentX } from \"agentxjs\";\nimport type { UserRepository } from \"./user/UserRepository\";\nimport type { UserInfo } from \"./user/types\";\n\nconst TOKEN_EXPIRY = \"7d\"; // 7 days\n\n/**\n * Validate invite code\n * Valid code is the Unix timestamp (in seconds) of today's 00:00:01\n */\nfunction isValidInviteCode(code: string): boolean {\n const timestamp = parseInt(code, 10);\n if (isNaN(timestamp)) return false;\n\n // Get today's 00:00:01 in local timezone\n const now = new Date();\n const todayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 1);\n const expectedTimestamp = Math.floor(todayStart.getTime() / 1000);\n\n return timestamp === expectedTimestamp;\n}\n\n/**\n * Generate a random password\n */\nexport function generatePassword(): string {\n const chars = \"ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789\";\n let password = \"\";\n for (let i = 0; i < 12; i++) {\n password += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return password;\n}\n\n/**\n * Create JWT token\n */\nasync function createToken(secret: string, userId: string): Promise<string> {\n const secretKey = new TextEncoder().encode(secret);\n const token = await new jose.SignJWT({ sub: userId })\n .setProtectedHeader({ alg: \"HS256\" })\n .setIssuedAt()\n .setExpirationTime(TOKEN_EXPIRY)\n .sign(secretKey);\n return token;\n}\n\n/**\n * Verify JWT token\n */\nasync function verifyToken(secret: string, token: string): Promise<{ userId: string } | null> {\n try {\n const secretKey = new TextEncoder().encode(secret);\n const { payload } = await jose.jwtVerify(token, secretKey);\n return { userId: payload.sub as string };\n } catch {\n return null;\n }\n}\n\n/**\n * Convert UserRecord to safe UserInfo (remove password hash)\n */\nfunction toUserInfo(user: {\n userId: string;\n username: string;\n email: string;\n containerId: string;\n displayName?: string;\n avatar?: string;\n createdAt: number;\n}): UserInfo {\n return {\n userId: user.userId,\n username: user.username,\n email: user.email,\n containerId: user.containerId,\n displayName: user.displayName,\n avatar: user.avatar,\n createdAt: user.createdAt,\n };\n}\n\n/**\n * Auth configuration\n */\nexport interface AuthConfig {\n inviteCodeRequired?: boolean;\n}\n\n/**\n * Auth routes\n */\nexport function authRoutes(\n userRepository: UserRepository,\n jwtSecret: string,\n agentx: AgentX,\n config: AuthConfig = {}\n): Hono {\n const app = new Hono();\n const { inviteCodeRequired = true } = config;\n\n // Config endpoint (public, for frontend to know requirements)\n app.get(\"/config\", (c) => {\n return c.json({ inviteCodeRequired });\n });\n\n // Register\n app.post(\"/register\", async (c) => {\n try {\n const body = await c.req.json<{\n username?: string;\n email?: string;\n password?: string;\n displayName?: string;\n avatar?: string;\n inviteCode?: string;\n }>();\n\n // Validation\n if (!body.username || !body.password) {\n return c.json({ error: \"Username and password are required\" }, 400);\n }\n\n // Validate invite code (only if required)\n if (inviteCodeRequired && (!body.inviteCode || !isValidInviteCode(body.inviteCode))) {\n return c.json({ error: \"Invalid invite code\" }, 400);\n }\n\n // Basic validation\n if (body.username.length < 3) {\n return c.json({ error: \"Username must be at least 3 characters\" }, 400);\n }\n\n if (body.password.length < 6) {\n return c.json({ error: \"Password must be at least 6 characters\" }, 400);\n }\n\n // Email format validation (only if provided)\n if (body.email && !body.email.includes(\"@\")) {\n return c.json({ error: \"Invalid email format\" }, 400);\n }\n\n // Create Container for the user first\n // Generate a unique container ID for the user\n const containerId = `user-${crypto.randomUUID()}`;\n const containerRes = await agentx.request(\"container_create_request\", { containerId });\n if (containerRes.data.error) {\n return c.json({ error: \"Failed to create user container\" }, 500);\n }\n\n // Create user with the container ID\n const user = await userRepository.createUser({\n username: body.username,\n email: body.email,\n password: body.password,\n containerId,\n displayName: body.displayName,\n avatar: body.avatar,\n });\n\n // Generate token\n const token = await createToken(jwtSecret, user.userId);\n\n return c.json(\n {\n token,\n user: toUserInfo(user),\n expiresIn: TOKEN_EXPIRY,\n },\n 201\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Registration failed\";\n return c.json({ error: message }, 400);\n }\n });\n\n // Login\n app.post(\"/login\", async (c) => {\n try {\n const body = await c.req.json<{\n usernameOrEmail?: string;\n password?: string;\n }>();\n\n if (!body.usernameOrEmail || !body.password) {\n return c.json({ error: \"Username/email and password are required\" }, 400);\n }\n\n // Verify credentials\n const user = await userRepository.verifyPassword(body.usernameOrEmail, body.password);\n\n if (!user) {\n return c.json({ error: \"Invalid credentials\" }, 401);\n }\n\n // Generate token\n const token = await createToken(jwtSecret, user.userId);\n\n return c.json({\n token,\n user: toUserInfo(user),\n expiresIn: TOKEN_EXPIRY,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Login failed\";\n return c.json({ error: message }, 500);\n }\n });\n\n // Verify token\n app.get(\"/verify\", async (c) => {\n const authHeader = c.req.header(\"Authorization\");\n if (!authHeader || !authHeader.startsWith(\"Bearer \")) {\n return c.json({ valid: false }, 401);\n }\n\n const token = authHeader.slice(7);\n const result = await verifyToken(jwtSecret, token);\n\n if (!result) {\n return c.json({ valid: false }, 401);\n }\n\n // Get user info\n const user = await userRepository.findUserById(result.userId);\n if (!user || !user.isActive) {\n return c.json({ valid: false }, 401);\n }\n\n return c.json({ valid: true, user: toUserInfo(user) });\n });\n\n // Logout (client-side only, just for API consistency)\n app.post(\"/logout\", (c) => {\n return c.json({ success: true });\n });\n\n return app;\n}\n\n/**\n * Create auth middleware\n */\nexport function createAuthMiddleware(jwtSecret: string) {\n return createMiddleware(async (c, next) => {\n // Skip auth for SSE connections with token in query\n const url = new URL(c.req.url);\n const queryToken = url.searchParams.get(\"token\");\n\n // Check Authorization header first\n const authHeader = c.req.header(\"Authorization\");\n let token: string | null = null;\n\n if (authHeader && authHeader.startsWith(\"Bearer \")) {\n token = authHeader.slice(7);\n } else if (queryToken) {\n // Allow token in query param for SSE (EventSource doesn't support headers)\n token = queryToken;\n }\n\n if (!token) {\n return c.json({ error: \"Unauthorized\" }, 401);\n }\n\n const result = await verifyToken(jwtSecret, token);\n if (!result) {\n return c.json({ error: \"Invalid token\" }, 401);\n }\n\n // Set user info in context\n c.set(\"userId\", result.userId);\n\n // Also set as custom header for downstream handlers\n c.header(\"X-User-Id\", result.userId);\n\n await next();\n });\n}\n","/**\n * SQLiteUserRepository - SQLite implementation of UserRepository\n *\n * Manages user data in separate portagent.db database.\n * This is independent from AgentX's agentx.db.\n *\n * Relationship to AgentX:\n * - User (portagent.db) ←→ Container.config.ownerId (agentx.db)\n * - User.userId is stored in Container.config.ownerId field\n */\n\nimport Database from \"better-sqlite3\";\nimport { randomUUID } from \"crypto\";\nimport { hash, compare } from \"bcrypt\";\nimport type { UserRepository } from \"../user/UserRepository\";\nimport type { UserRecord, RegisterUserInput } from \"../user/types\";\n\nconst SALT_ROUNDS = 10;\n\n/**\n * SQLite implementation of UserRepository\n */\nexport class SQLiteUserRepository implements UserRepository {\n private db: Database.Database;\n\n constructor(dbPath: string) {\n this.db = new Database(dbPath);\n this.initDatabase();\n }\n\n /**\n * Initialize database schema\n */\n private initDatabase(): void {\n // Enable foreign keys\n this.db.pragma(\"foreign_keys = ON\");\n\n // Create users table\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS users (\n userId TEXT PRIMARY KEY,\n username TEXT UNIQUE NOT NULL,\n email TEXT UNIQUE NOT NULL,\n passwordHash TEXT NOT NULL,\n containerId TEXT NOT NULL,\n displayName TEXT,\n avatar TEXT,\n isActive INTEGER NOT NULL DEFAULT 1,\n createdAt INTEGER NOT NULL,\n updatedAt INTEGER NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_users_username ON users(username);\n CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);\n CREATE INDEX IF NOT EXISTS idx_users_containerId ON users(containerId);\n `);\n }\n\n /**\n * Create a new user\n */\n async createUser(input: RegisterUserInput): Promise<UserRecord> {\n // Check if username exists\n if (await this.usernameExists(input.username)) {\n throw new Error(`Username '${input.username}' already exists`);\n }\n\n // Check if email exists (only if provided)\n if (input.email && (await this.emailExists(input.email))) {\n throw new Error(`Email '${input.email}' already exists`);\n }\n\n // Hash password\n const passwordHash = await hash(input.password, SALT_ROUNDS);\n\n // Create user record\n const userId = randomUUID();\n const now = Date.now();\n\n // Use placeholder email if not provided (to satisfy DB constraint)\n const email = input.email || `${userId}@noemail.portagent`;\n\n const user: UserRecord = {\n userId,\n username: input.username,\n email,\n passwordHash,\n containerId: input.containerId,\n displayName: input.displayName,\n avatar: input.avatar,\n isActive: true,\n createdAt: now,\n updatedAt: now,\n };\n\n // Insert into database\n const stmt = this.db.prepare(`\n INSERT INTO users (\n userId, username, email, passwordHash, containerId, displayName, avatar, isActive, createdAt, updatedAt\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n user.userId,\n user.username,\n user.email,\n user.passwordHash,\n user.containerId,\n user.displayName,\n user.avatar,\n user.isActive ? 1 : 0,\n user.createdAt,\n user.updatedAt\n );\n\n return user;\n }\n\n /**\n * Find user by ID\n */\n async findUserById(userId: string): Promise<UserRecord | null> {\n const stmt = this.db.prepare(`\n SELECT * FROM users WHERE userId = ?\n `);\n\n const row = stmt.get(userId) as any;\n return row ? this.rowToUser(row) : null;\n }\n\n /**\n * Find user by username\n */\n async findUserByUsername(username: string): Promise<UserRecord | null> {\n const stmt = this.db.prepare(`\n SELECT * FROM users WHERE username = ?\n `);\n\n const row = stmt.get(username) as any;\n return row ? this.rowToUser(row) : null;\n }\n\n /**\n * Find user by email\n */\n async findUserByEmail(email: string): Promise<UserRecord | null> {\n const stmt = this.db.prepare(`\n SELECT * FROM users WHERE email = ?\n `);\n\n const row = stmt.get(email) as any;\n return row ? this.rowToUser(row) : null;\n }\n\n /**\n * Find user by username or email\n */\n async findUserByUsernameOrEmail(usernameOrEmail: string): Promise<UserRecord | null> {\n const stmt = this.db.prepare(`\n SELECT * FROM users WHERE username = ? OR email = ?\n `);\n\n const row = stmt.get(usernameOrEmail, usernameOrEmail) as any;\n return row ? this.rowToUser(row) : null;\n }\n\n /**\n * Update user\n */\n async updateUser(\n userId: string,\n updates: Partial<Omit<UserRecord, \"userId\">>\n ): Promise<UserRecord> {\n const user = await this.findUserById(userId);\n if (!user) {\n throw new Error(`User ${userId} not found`);\n }\n\n // Build SET clause dynamically\n const fields: string[] = [];\n const values: any[] = [];\n\n if (updates.username !== undefined) {\n fields.push(\"username = ?\");\n values.push(updates.username);\n }\n if (updates.email !== undefined) {\n fields.push(\"email = ?\");\n values.push(updates.email);\n }\n if (updates.passwordHash !== undefined) {\n fields.push(\"passwordHash = ?\");\n values.push(updates.passwordHash);\n }\n if (updates.displayName !== undefined) {\n fields.push(\"displayName = ?\");\n values.push(updates.displayName);\n }\n if (updates.avatar !== undefined) {\n fields.push(\"avatar = ?\");\n values.push(updates.avatar);\n }\n if (updates.isActive !== undefined) {\n fields.push(\"isActive = ?\");\n values.push(updates.isActive ? 1 : 0);\n }\n\n // Always update updatedAt\n fields.push(\"updatedAt = ?\");\n values.push(Date.now());\n\n if (fields.length === 0) {\n return user; // No updates\n }\n\n // Execute update\n values.push(userId);\n const stmt = this.db.prepare(`\n UPDATE users SET ${fields.join(\", \")} WHERE userId = ?\n `);\n\n stmt.run(...values);\n\n // Return updated user\n return (await this.findUserById(userId))!;\n }\n\n /**\n * Delete user\n */\n async deleteUser(userId: string): Promise<boolean> {\n const stmt = this.db.prepare(`\n DELETE FROM users WHERE userId = ?\n `);\n\n const result = stmt.run(userId);\n return result.changes > 0;\n }\n\n /**\n * List all users\n */\n async listUsers(): Promise<UserRecord[]> {\n const stmt = this.db.prepare(`\n SELECT * FROM users ORDER BY createdAt DESC\n `);\n\n const rows = stmt.all() as any[];\n return rows.map((row) => this.rowToUser(row));\n }\n\n /**\n * Check if username exists\n */\n async usernameExists(username: string): Promise<boolean> {\n const stmt = this.db.prepare(`\n SELECT 1 FROM users WHERE username = ?\n `);\n\n return stmt.get(username) !== undefined;\n }\n\n /**\n * Check if email exists\n */\n async emailExists(email: string): Promise<boolean> {\n const stmt = this.db.prepare(`\n SELECT 1 FROM users WHERE email = ?\n `);\n\n return stmt.get(email) !== undefined;\n }\n\n /**\n * Verify password for login\n *\n * @param usernameOrEmail - Username or email\n * @param password - Plain text password\n * @returns User record if valid, null if invalid\n */\n async verifyPassword(usernameOrEmail: string, password: string): Promise<UserRecord | null> {\n const user = await this.findUserByUsernameOrEmail(usernameOrEmail);\n if (!user) {\n return null;\n }\n\n if (!user.isActive) {\n return null; // Inactive user\n }\n\n const isValid = await compare(password, user.passwordHash);\n return isValid ? user : null;\n }\n\n /**\n * Close database connection\n */\n close(): void {\n this.db.close();\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n private rowToUser(row: any): UserRecord {\n return {\n userId: row.userId,\n username: row.username,\n email: row.email,\n passwordHash: row.passwordHash,\n containerId: row.containerId,\n displayName: row.displayName,\n avatar: row.avatar,\n isActive: row.isActive === 1,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n }\n}\n","/**\n * PinoLogger - Production-grade logger using pino\n *\n * Features:\n * - Fast JSON logging (pino is one of the fastest Node.js loggers)\n * - File logging with daily rotation\n * - Console output with pino-pretty in development\n * - Implements AgentX LoggerFactory interface\n */\n\nimport pino, { type Logger as PinoLogger } from \"pino\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { Logger, LoggerFactory, LogContext, LogLevel } from \"agentxjs\";\n\n/**\n * Map AgentX log levels to pino log levels\n */\nconst LEVEL_MAP: Record<LogLevel, string> = {\n debug: \"debug\",\n info: \"info\",\n warn: \"warn\",\n error: \"error\",\n silent: \"silent\",\n};\n\n/**\n * PinoLoggerAdapter - Adapts pino logger to AgentX Logger interface\n */\nclass PinoLoggerAdapter implements Logger {\n constructor(\n public readonly name: string,\n public readonly level: LogLevel,\n private readonly pino: PinoLogger\n ) {}\n\n debug(message: string, context?: LogContext): void {\n this.pino.debug(context || {}, message);\n }\n\n info(message: string, context?: LogContext): void {\n this.pino.info(context || {}, message);\n }\n\n warn(message: string, context?: LogContext): void {\n this.pino.warn(context || {}, message);\n }\n\n error(message: string | Error, context?: LogContext): void {\n if (message instanceof Error) {\n this.pino.error({ ...context, err: message }, message.message);\n } else {\n this.pino.error(context || {}, message);\n }\n }\n\n isDebugEnabled(): boolean {\n return this.pino.isLevelEnabled(\"debug\");\n }\n\n isInfoEnabled(): boolean {\n return this.pino.isLevelEnabled(\"info\");\n }\n\n isWarnEnabled(): boolean {\n return this.pino.isLevelEnabled(\"warn\");\n }\n\n isErrorEnabled(): boolean {\n return this.pino.isLevelEnabled(\"error\");\n }\n}\n\n/**\n * PinoLoggerFactory - Creates pino-based loggers\n *\n * Supports multiple output targets:\n * - Console (with pretty printing in dev)\n * - File (JSON format, daily rotation)\n */\nexport class PinoLoggerFactory implements LoggerFactory {\n private readonly rootLogger: PinoLogger;\n\n constructor(options: {\n level: LogLevel;\n logDir: string;\n pretty?: boolean; // Use pino-pretty for console output\n }) {\n const { level, logDir, pretty = process.env.NODE_ENV !== \"production\" } = options;\n\n // Ensure log directory exists\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true });\n }\n\n // Create log file path with date\n const getLogFilePath = () => {\n const now = new Date();\n const dateStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, \"0\")}-${String(now.getDate()).padStart(2, \"0\")}`;\n return path.join(logDir, `portagent-${dateStr}.log`);\n };\n\n // Create pino transports\n const targets: pino.TransportTargetOptions[] = [];\n\n // File transport (always JSON)\n targets.push({\n target: \"pino/file\",\n level: LEVEL_MAP[level],\n options: {\n destination: getLogFilePath(),\n mkdir: true,\n },\n });\n\n // Console transport\n if (pretty) {\n targets.push({\n target: \"pino-pretty\",\n level: LEVEL_MAP[level],\n options: {\n colorize: true,\n translateTime: \"SYS:standard\",\n ignore: \"pid,hostname\",\n },\n });\n } else {\n targets.push({\n target: \"pino/file\",\n level: LEVEL_MAP[level],\n options: { destination: 1 }, // stdout\n });\n }\n\n // Create root logger with multi-stream transport\n this.rootLogger = pino({\n level: LEVEL_MAP[level],\n transport: {\n targets,\n },\n });\n }\n\n getLogger(name: string): Logger {\n const childLogger = this.rootLogger.child({ name });\n return new PinoLoggerAdapter(name, this.rootLogger.level as LogLevel, childLogger);\n }\n}\n"],"mappings":";AAaA,SAAS,SAAS,eAAe;AACjC,SAAS,qBAAqB;AAC9B,SAAS,oBAAoB;AAK7B,SAAS,QAAAA,aAAY;AACrB,SAAS,YAAY;AACrB,SAAS,mBAAmB;AAC5B,SAAS,YAAY,oBAAoB;AAEzC,SAAS,oBAAoB;AAC7B,SAAS,eAAe;AACxB,SAAS,YAAY;AACrB,SAAS,iBAAiB;;;ACrB1B,SAAS,YAAY;AACrB,SAAS,wBAAwB;AACjC,YAAY,UAAU;AAKtB,IAAM,eAAe;AAMrB,SAAS,kBAAkB,MAAuB;AAChD,QAAM,YAAY,SAAS,MAAM,EAAE;AACnC,MAAI,MAAM,SAAS,EAAG,QAAO;AAG7B,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,aAAa,IAAI,KAAK,IAAI,YAAY,GAAG,IAAI,SAAS,GAAG,IAAI,QAAQ,GAAG,GAAG,GAAG,CAAC;AACrF,QAAM,oBAAoB,KAAK,MAAM,WAAW,QAAQ,IAAI,GAAI;AAEhE,SAAO,cAAc;AACvB;AAiBA,eAAe,YAAY,QAAgB,QAAiC;AAC1E,QAAM,YAAY,IAAI,YAAY,EAAE,OAAO,MAAM;AACjD,QAAM,QAAQ,MAAM,IAAS,aAAQ,EAAE,KAAK,OAAO,CAAC,EACjD,mBAAmB,EAAE,KAAK,QAAQ,CAAC,EACnC,YAAY,EACZ,kBAAkB,YAAY,EAC9B,KAAK,SAAS;AACjB,SAAO;AACT;AAKA,eAAe,YAAY,QAAgB,OAAmD;AAC5F,MAAI;AACF,UAAM,YAAY,IAAI,YAAY,EAAE,OAAO,MAAM;AACjD,UAAM,EAAE,QAAQ,IAAI,MAAW,eAAU,OAAO,SAAS;AACzD,WAAO,EAAE,QAAQ,QAAQ,IAAc;AAAA,EACzC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,SAAS,WAAW,MAQP;AACX,SAAO;AAAA,IACL,QAAQ,KAAK;AAAA,IACb,UAAU,KAAK;AAAA,IACf,OAAO,KAAK;AAAA,IACZ,aAAa,KAAK;AAAA,IAClB,aAAa,KAAK;AAAA,IAClB,QAAQ,KAAK;AAAA,IACb,WAAW,KAAK;AAAA,EAClB;AACF;AAYO,SAAS,WACd,gBACA,WACA,QACA,SAAqB,CAAC,GAChB;AACN,QAAM,MAAM,IAAI,KAAK;AACrB,QAAM,EAAE,qBAAqB,KAAK,IAAI;AAGtC,MAAI,IAAI,WAAW,CAAC,MAAM;AACxB,WAAO,EAAE,KAAK,EAAE,mBAAmB,CAAC;AAAA,EACtC,CAAC;AAGD,MAAI,KAAK,aAAa,OAAO,MAAM;AACjC,QAAI;AACF,YAAM,OAAO,MAAM,EAAE,IAAI,KAOtB;AAGH,UAAI,CAAC,KAAK,YAAY,CAAC,KAAK,UAAU;AACpC,eAAO,EAAE,KAAK,EAAE,OAAO,qCAAqC,GAAG,GAAG;AAAA,MACpE;AAGA,UAAI,uBAAuB,CAAC,KAAK,cAAc,CAAC,kBAAkB,KAAK,UAAU,IAAI;AACnF,eAAO,EAAE,KAAK,EAAE,OAAO,sBAAsB,GAAG,GAAG;AAAA,MACrD;AAGA,UAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,eAAO,EAAE,KAAK,EAAE,OAAO,yCAAyC,GAAG,GAAG;AAAA,MACxE;AAEA,UAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,eAAO,EAAE,KAAK,EAAE,OAAO,yCAAyC,GAAG,GAAG;AAAA,MACxE;AAGA,UAAI,KAAK,SAAS,CAAC,KAAK,MAAM,SAAS,GAAG,GAAG;AAC3C,eAAO,EAAE,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AAAA,MACtD;AAIA,YAAM,cAAc,QAAQ,OAAO,WAAW,CAAC;AAC/C,YAAM,eAAe,MAAM,OAAO,QAAQ,4BAA4B,EAAE,YAAY,CAAC;AACrF,UAAI,aAAa,KAAK,OAAO;AAC3B,eAAO,EAAE,KAAK,EAAE,OAAO,kCAAkC,GAAG,GAAG;AAAA,MACjE;AAGA,YAAM,OAAO,MAAM,eAAe,WAAW;AAAA,QAC3C,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,UAAU,KAAK;AAAA,QACf;AAAA,QACA,aAAa,KAAK;AAAA,QAClB,QAAQ,KAAK;AAAA,MACf,CAAC;AAGD,YAAM,QAAQ,MAAM,YAAY,WAAW,KAAK,MAAM;AAEtD,aAAO,EAAE;AAAA,QACP;AAAA,UACE;AAAA,UACA,MAAM,WAAW,IAAI;AAAA,UACrB,WAAW;AAAA,QACb;AAAA,QACA;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,aAAO,EAAE,KAAK,EAAE,OAAO,QAAQ,GAAG,GAAG;AAAA,IACvC;AAAA,EACF,CAAC;AAGD,MAAI,KAAK,UAAU,OAAO,MAAM;AAC9B,QAAI;AACF,YAAM,OAAO,MAAM,EAAE,IAAI,KAGtB;AAEH,UAAI,CAAC,KAAK,mBAAmB,CAAC,KAAK,UAAU;AAC3C,eAAO,EAAE,KAAK,EAAE,OAAO,2CAA2C,GAAG,GAAG;AAAA,MAC1E;AAGA,YAAM,OAAO,MAAM,eAAe,eAAe,KAAK,iBAAiB,KAAK,QAAQ;AAEpF,UAAI,CAAC,MAAM;AACT,eAAO,EAAE,KAAK,EAAE,OAAO,sBAAsB,GAAG,GAAG;AAAA,MACrD;AAGA,YAAM,QAAQ,MAAM,YAAY,WAAW,KAAK,MAAM;AAEtD,aAAO,EAAE,KAAK;AAAA,QACZ;AAAA,QACA,MAAM,WAAW,IAAI;AAAA,QACrB,WAAW;AAAA,MACb,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,aAAO,EAAE,KAAK,EAAE,OAAO,QAAQ,GAAG,GAAG;AAAA,IACvC;AAAA,EACF,CAAC;AAGD,MAAI,IAAI,WAAW,OAAO,MAAM;AAC9B,UAAM,aAAa,EAAE,IAAI,OAAO,eAAe;AAC/C,QAAI,CAAC,cAAc,CAAC,WAAW,WAAW,SAAS,GAAG;AACpD,aAAO,EAAE,KAAK,EAAE,OAAO,MAAM,GAAG,GAAG;AAAA,IACrC;AAEA,UAAM,QAAQ,WAAW,MAAM,CAAC;AAChC,UAAM,SAAS,MAAM,YAAY,WAAW,KAAK;AAEjD,QAAI,CAAC,QAAQ;AACX,aAAO,EAAE,KAAK,EAAE,OAAO,MAAM,GAAG,GAAG;AAAA,IACrC;AAGA,UAAM,OAAO,MAAM,eAAe,aAAa,OAAO,MAAM;AAC5D,QAAI,CAAC,QAAQ,CAAC,KAAK,UAAU;AAC3B,aAAO,EAAE,KAAK,EAAE,OAAO,MAAM,GAAG,GAAG;AAAA,IACrC;AAEA,WAAO,EAAE,KAAK,EAAE,OAAO,MAAM,MAAM,WAAW,IAAI,EAAE,CAAC;AAAA,EACvD,CAAC;AAGD,MAAI,KAAK,WAAW,CAAC,MAAM;AACzB,WAAO,EAAE,KAAK,EAAE,SAAS,KAAK,CAAC;AAAA,EACjC,CAAC;AAED,SAAO;AACT;AAKO,SAAS,qBAAqB,WAAmB;AACtD,SAAO,iBAAiB,OAAO,GAAG,SAAS;AAEzC,UAAM,MAAM,IAAI,IAAI,EAAE,IAAI,GAAG;AAC7B,UAAM,aAAa,IAAI,aAAa,IAAI,OAAO;AAG/C,UAAM,aAAa,EAAE,IAAI,OAAO,eAAe;AAC/C,QAAI,QAAuB;AAE3B,QAAI,cAAc,WAAW,WAAW,SAAS,GAAG;AAClD,cAAQ,WAAW,MAAM,CAAC;AAAA,IAC5B,WAAW,YAAY;AAErB,cAAQ;AAAA,IACV;AAEA,QAAI,CAAC,OAAO;AACV,aAAO,EAAE,KAAK,EAAE,OAAO,eAAe,GAAG,GAAG;AAAA,IAC9C;AAEA,UAAM,SAAS,MAAM,YAAY,WAAW,KAAK;AACjD,QAAI,CAAC,QAAQ;AACX,aAAO,EAAE,KAAK,EAAE,OAAO,gBAAgB,GAAG,GAAG;AAAA,IAC/C;AAGA,MAAE,IAAI,UAAU,OAAO,MAAM;AAG7B,MAAE,OAAO,aAAa,OAAO,MAAM;AAEnC,UAAM,KAAK;AAAA,EACb,CAAC;AACH;;;ACtRA,OAAO,cAAc;AACrB,SAAS,kBAAkB;AAC3B,SAAS,MAAM,eAAe;AAI9B,IAAM,cAAc;AAKb,IAAM,uBAAN,MAAqD;AAAA,EAClD;AAAA,EAER,YAAY,QAAgB;AAC1B,SAAK,KAAK,IAAI,SAAS,MAAM;AAC7B,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAqB;AAE3B,SAAK,GAAG,OAAO,mBAAmB;AAGlC,SAAK,GAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAiBZ;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,OAA+C;AAE9D,QAAI,MAAM,KAAK,eAAe,MAAM,QAAQ,GAAG;AAC7C,YAAM,IAAI,MAAM,aAAa,MAAM,QAAQ,kBAAkB;AAAA,IAC/D;AAGA,QAAI,MAAM,SAAU,MAAM,KAAK,YAAY,MAAM,KAAK,GAAI;AACxD,YAAM,IAAI,MAAM,UAAU,MAAM,KAAK,kBAAkB;AAAA,IACzD;AAGA,UAAM,eAAe,MAAM,KAAK,MAAM,UAAU,WAAW;AAG3D,UAAM,SAAS,WAAW;AAC1B,UAAM,MAAM,KAAK,IAAI;AAGrB,UAAM,QAAQ,MAAM,SAAS,GAAG,MAAM;AAEtC,UAAM,OAAmB;AAAA,MACvB;AAAA,MACA,UAAU,MAAM;AAAA,MAChB;AAAA,MACA;AAAA,MACA,aAAa,MAAM;AAAA,MACnB,aAAa,MAAM;AAAA,MACnB,QAAQ,MAAM;AAAA,MACd,UAAU;AAAA,MACV,WAAW;AAAA,MACX,WAAW;AAAA,IACb;AAGA,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA,KAI5B;AAED,SAAK;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,WAAW,IAAI;AAAA,MACpB,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,QAA4C;AAC7D,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA,KAE5B;AAED,UAAM,MAAM,KAAK,IAAI,MAAM;AAC3B,WAAO,MAAM,KAAK,UAAU,GAAG,IAAI;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,UAA8C;AACrE,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA,KAE5B;AAED,UAAM,MAAM,KAAK,IAAI,QAAQ;AAC7B,WAAO,MAAM,KAAK,UAAU,GAAG,IAAI;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,OAA2C;AAC/D,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA,KAE5B;AAED,UAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,WAAO,MAAM,KAAK,UAAU,GAAG,IAAI;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,0BAA0B,iBAAqD;AACnF,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA,KAE5B;AAED,UAAM,MAAM,KAAK,IAAI,iBAAiB,eAAe;AACrD,WAAO,MAAM,KAAK,UAAU,GAAG,IAAI;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACJ,QACA,SACqB;AACrB,UAAM,OAAO,MAAM,KAAK,aAAa,MAAM;AAC3C,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,QAAQ,MAAM,YAAY;AAAA,IAC5C;AAGA,UAAM,SAAmB,CAAC;AAC1B,UAAM,SAAgB,CAAC;AAEvB,QAAI,QAAQ,aAAa,QAAW;AAClC,aAAO,KAAK,cAAc;AAC1B,aAAO,KAAK,QAAQ,QAAQ;AAAA,IAC9B;AACA,QAAI,QAAQ,UAAU,QAAW;AAC/B,aAAO,KAAK,WAAW;AACvB,aAAO,KAAK,QAAQ,KAAK;AAAA,IAC3B;AACA,QAAI,QAAQ,iBAAiB,QAAW;AACtC,aAAO,KAAK,kBAAkB;AAC9B,aAAO,KAAK,QAAQ,YAAY;AAAA,IAClC;AACA,QAAI,QAAQ,gBAAgB,QAAW;AACrC,aAAO,KAAK,iBAAiB;AAC7B,aAAO,KAAK,QAAQ,WAAW;AAAA,IACjC;AACA,QAAI,QAAQ,WAAW,QAAW;AAChC,aAAO,KAAK,YAAY;AACxB,aAAO,KAAK,QAAQ,MAAM;AAAA,IAC5B;AACA,QAAI,QAAQ,aAAa,QAAW;AAClC,aAAO,KAAK,cAAc;AAC1B,aAAO,KAAK,QAAQ,WAAW,IAAI,CAAC;AAAA,IACtC;AAGA,WAAO,KAAK,eAAe;AAC3B,WAAO,KAAK,KAAK,IAAI,CAAC;AAEtB,QAAI,OAAO,WAAW,GAAG;AACvB,aAAO;AAAA,IACT;AAGA,WAAO,KAAK,MAAM;AAClB,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA,yBACR,OAAO,KAAK,IAAI,CAAC;AAAA,KACrC;AAED,SAAK,IAAI,GAAG,MAAM;AAGlB,WAAQ,MAAM,KAAK,aAAa,MAAM;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,QAAkC;AACjD,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA,KAE5B;AAED,UAAM,SAAS,KAAK,IAAI,MAAM;AAC9B,WAAO,OAAO,UAAU;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAmC;AACvC,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA,KAE5B;AAED,UAAM,OAAO,KAAK,IAAI;AACtB,WAAO,KAAK,IAAI,CAAC,QAAQ,KAAK,UAAU,GAAG,CAAC;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,UAAoC;AACvD,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA,KAE5B;AAED,WAAO,KAAK,IAAI,QAAQ,MAAM;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,OAAiC;AACjD,UAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA,KAE5B;AAED,WAAO,KAAK,IAAI,KAAK,MAAM;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAe,iBAAyB,UAA8C;AAC1F,UAAM,OAAO,MAAM,KAAK,0BAA0B,eAAe;AACjE,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,KAAK,UAAU;AAClB,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,MAAM,QAAQ,UAAU,KAAK,YAAY;AACzD,WAAO,UAAU,OAAO;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,GAAG,MAAM;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAMQ,UAAU,KAAsB;AACtC,WAAO;AAAA,MACL,QAAQ,IAAI;AAAA,MACZ,UAAU,IAAI;AAAA,MACd,OAAO,IAAI;AAAA,MACX,cAAc,IAAI;AAAA,MAClB,aAAa,IAAI;AAAA,MACjB,aAAa,IAAI;AAAA,MACjB,QAAQ,IAAI;AAAA,MACZ,UAAU,IAAI,aAAa;AAAA,MAC3B,WAAW,IAAI;AAAA,MACf,WAAW,IAAI;AAAA,IACjB;AAAA,EACF;AACF;;;ACrTA,OAAO,UAAyC;AAChD,OAAO,QAAQ;AACf,OAAO,UAAU;AAMjB,IAAM,YAAsC;AAAA,EAC1C,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AACV;AAKA,IAAM,oBAAN,MAA0C;AAAA,EACxC,YACkB,MACA,OACCC,OACjB;AAHgB;AACA;AACC,gBAAAA;AAAA,EAChB;AAAA,EAEH,MAAM,SAAiB,SAA4B;AACjD,SAAK,KAAK,MAAM,WAAW,CAAC,GAAG,OAAO;AAAA,EACxC;AAAA,EAEA,KAAK,SAAiB,SAA4B;AAChD,SAAK,KAAK,KAAK,WAAW,CAAC,GAAG,OAAO;AAAA,EACvC;AAAA,EAEA,KAAK,SAAiB,SAA4B;AAChD,SAAK,KAAK,KAAK,WAAW,CAAC,GAAG,OAAO;AAAA,EACvC;AAAA,EAEA,MAAM,SAAyB,SAA4B;AACzD,QAAI,mBAAmB,OAAO;AAC5B,WAAK,KAAK,MAAM,EAAE,GAAG,SAAS,KAAK,QAAQ,GAAG,QAAQ,OAAO;AAAA,IAC/D,OAAO;AACL,WAAK,KAAK,MAAM,WAAW,CAAC,GAAG,OAAO;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,iBAA0B;AACxB,WAAO,KAAK,KAAK,eAAe,OAAO;AAAA,EACzC;AAAA,EAEA,gBAAyB;AACvB,WAAO,KAAK,KAAK,eAAe,MAAM;AAAA,EACxC;AAAA,EAEA,gBAAyB;AACvB,WAAO,KAAK,KAAK,eAAe,MAAM;AAAA,EACxC;AAAA,EAEA,iBAA0B;AACxB,WAAO,KAAK,KAAK,eAAe,OAAO;AAAA,EACzC;AACF;AASO,IAAM,oBAAN,MAAiD;AAAA,EACrC;AAAA,EAEjB,YAAY,SAIT;AACD,UAAM,EAAE,OAAO,QAAQ,SAAS,QAAQ,IAAI,aAAa,aAAa,IAAI;AAG1E,QAAI,CAAC,GAAG,WAAW,MAAM,GAAG;AAC1B,SAAG,UAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAAA,IAC1C;AAGA,UAAM,iBAAiB,MAAM;AAC3B,YAAM,MAAM,oBAAI,KAAK;AACrB,YAAM,UAAU,GAAG,IAAI,YAAY,CAAC,IAAI,OAAO,IAAI,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,IAAI,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAC7H,aAAO,KAAK,KAAK,QAAQ,aAAa,OAAO,MAAM;AAAA,IACrD;AAGA,UAAM,UAAyC,CAAC;AAGhD,YAAQ,KAAK;AAAA,MACX,QAAQ;AAAA,MACR,OAAO,UAAU,KAAK;AAAA,MACtB,SAAS;AAAA,QACP,aAAa,eAAe;AAAA,QAC5B,OAAO;AAAA,MACT;AAAA,IACF,CAAC;AAGD,QAAI,QAAQ;AACV,cAAQ,KAAK;AAAA,QACX,QAAQ;AAAA,QACR,OAAO,UAAU,KAAK;AAAA,QACtB,SAAS;AAAA,UACP,UAAU;AAAA,UACV,eAAe;AAAA,UACf,QAAQ;AAAA,QACV;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,KAAK;AAAA,QACX,QAAQ;AAAA,QACR,OAAO,UAAU,KAAK;AAAA,QACtB,SAAS,EAAE,aAAa,EAAE;AAAA;AAAA,MAC5B,CAAC;AAAA,IACH;AAGA,SAAK,aAAa,KAAK;AAAA,MACrB,OAAO,UAAU,KAAK;AAAA,MACtB,WAAW;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,MAAsB;AAC9B,UAAM,cAAc,KAAK,WAAW,MAAM,EAAE,KAAK,CAAC;AAClD,WAAO,IAAI,kBAAkB,MAAM,KAAK,WAAW,OAAmB,WAAW;AAAA,EACnF;AACF;;;AHlIA,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAY,QAAQ,UAAU;AA4BpC,SAAS,eAAe;AACtB,QAAM,UAAU,QAAQ,IAAI,YAAY,KAAK,QAAQ,GAAG,SAAS;AACjE,QAAM,cAAc,KAAK,SAAS,MAAM;AACxC,QAAM,cAAc,KAAK,SAAS,MAAM;AAGxC,YAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAC1C,YAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAE1C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,KAAK,aAAa,cAAc;AAAA,IAC5C,cAAc,KAAK,aAAa,WAAW;AAAA,IAC3C,aAAa,KAAK,aAAa,eAAe;AAAA,EAChD;AACF;AAGA,IAAM,OAAO,SAAS,QAAQ,IAAI,QAAQ,QAAQ,EAAE;AACpD,IAAM,aAAa,QAAQ,IAAI,cAAc,OAAO,WAAW;AAC/D,IAAM,uBAAuB,QAAQ,IAAI,yBAAyB;AAKlE,eAAe,YAAY;AACzB,QAAM,QAAQ,aAAa;AAC3B,QAAM,MAAM,IAAIC,MAAK;AAGrB,MAAI;AAAA,IACF;AAAA,IACA,KAAK;AAAA,MACH,QAAQ;AAAA,MACR,cAAc,CAAC,OAAO,QAAQ,OAAO,UAAU,QAAQ,SAAS;AAAA,MAChE,cAAc,CAAC,gBAAgB,eAAe;AAAA,IAChD,CAAC;AAAA,EACH;AAGA,QAAM,SAAS,QAAQ,IAAI;AAC3B,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,qCAAqC;AACnD,YAAQ,IAAI,oCAAoC;AAChD,YAAQ,IAAI,sCAAsC;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAIA,QAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,mBAAmB;AAC/D,QAAM,WAAW,mBAAmB,IAAI,KAAK;AAC7C,QAAM,SAAS,aAAa,QAAQ;AAGpC,QAAM,WAAY,QAAQ,IAAI,aAAa;AAC3C,QAAM,gBAAgB,IAAI,kBAAkB;AAAA,IAC1C,OAAO;AAAA,IACP,QAAQ,MAAM;AAAA,IACd,QAAQ,QAAQ,IAAI,aAAa;AAAA,EACnC,CAAC;AAID,QAAM,SAAS,MAAM,aAAa;AAAA,IAChC,KAAK;AAAA,MACH;AAAA,MACA,SAAS,QAAQ,IAAI;AAAA,MACrB,OAAO,QAAQ,IAAI;AAAA,IACrB;AAAA,IACA,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,MAAM,MAAM;AAAA,IACd;AAAA,IACA,QAAQ;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AAAA,IACA;AAAA;AAAA,EACF,CAAC;AAGD,QAAM,iBAAiB,IAAI,qBAAqB,MAAM,UAAU;AAGhE,QAAM,iBAAiB,qBAAqB,UAAU;AAOtD,MAAI,IAAI,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,MAAM,WAAW,KAAK,IAAI,EAAE,CAAC,CAAC;AAGzE,MAAI;AAAA,IACF;AAAA,IACA,WAAW,gBAAgB,YAAY,QAAQ,EAAE,oBAAoB,qBAAqB,CAAC;AAAA,EAC7F;AAGA,MAAI,IAAI,aAAa,cAAc;AACnC,MAAI,IAAI,gBAAgB,CAAC,MAAM;AAC7B,WAAO,EAAE,KAAK;AAAA,MACZ,SAAS;AAAA,MACT,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,CAAC;AAGD,QAAM,YAAY,QAAQ,WAAW,WAAW;AAChD,QAAM,QAAQ,QAAQ,IAAI,aAAa;AAEvC,MAAI,WAAW,SAAS,GAAG;AAEzB,QAAI,IAAI,MAAM,YAAY,EAAE,MAAM,UAAU,CAAC,CAAC;AAG9C,QAAI,IAAI,KAAK,CAAC,MAAM;AAClB,YAAM,YAAY,QAAQ,WAAW,YAAY;AACjD,UAAI,WAAW,SAAS,GAAG;AACzB,cAAM,OAAO,aAAa,WAAW,OAAO;AAC5C,eAAO,EAAE,KAAK,IAAI;AAAA,MACpB;AACA,aAAO,EAAE,KAAK,aAAa,GAAG;AAAA,IAChC,CAAC;AAAA,EACH,WAAW,OAAO;AAChB,QAAI,IAAI,KAAK,CAAC,MAAM;AAClB,aAAO,EAAE;AAAA,QACP;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,KAAK,QAAQ,QAAQ,gBAAgB,MAAM;AACtD;AAKA,eAAe,cAAc;AAC3B,QAAM,EAAE,QAAQ,QAAQ,gBAAgB,MAAM,IAAI,MAAM,UAAU;AAElE,UAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CASb;AAEC,UAAQ,IAAI,gBAAgB;AAC5B,UAAQ,IAAI,WAAW,IAAI,EAAE;AAC7B,UAAQ,IAAI,eAAe,MAAM,OAAO,EAAE;AAC1C,UAAQ,IAAI,cAAc,QAAQ,IAAI,iBAAkB,UAAU,GAAG,EAAE,CAAC,KAAK;AAC7E,UAAQ,IAAI,cAAc,MAAM,UAAU,EAAE;AAC5C,UAAQ,IAAI,gBAAgB,MAAM,YAAY,EAAE;AAChD,UAAQ,IAAI,WAAW,MAAM,WAAW,EAAE;AAC1C,UAAQ,IAAI,kBAAkB,uBAAuB,aAAa,UAAU,EAAE;AAE9E,UAAQ,IAAI;AAAA,WAAc;AAC1B,UAAQ,IAAI,kDAAkD;AAC9D,UAAQ,IAAI,uDAAuD;AACnE,UAAQ,IAAI,2CAA2C;AACvD,UAAQ,IAAI,kDAAkD;AAC9D,UAAQ,IAAI,mDAAmD;AAC/D,UAAQ,IAAI,0DAA0D;AAGtE,SAAO,OAAO,MAAM,WAAW,MAAM;AACnC,YAAQ,IAAI;AAAA,+CAA2C,IAAI,EAAE;AAC7D,YAAQ,IAAI,mDAA4C,IAAI,KAAK;AAAA,EACnE,CAAC;AAGD,QAAM,WAAW,YAAY;AAC3B,YAAQ,IAAI,oBAAoB;AAChC,UAAM,OAAO,QAAQ;AACrB,mBAAe,MAAM;AACrB,WAAO,MAAM;AACb,YAAQ,IAAI,gBAAgB;AAC5B,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,GAAG,UAAU,QAAQ;AAC7B,UAAQ,GAAG,WAAW,QAAQ;AAChC;","names":["Hono","pino","Hono"]}
1
+ {"version":3,"sources":["../../src/server/index.ts","../../src/server/auth.ts","../../src/server/database/SQLiteUserRepository.ts","../../src/server/logger.ts"],"sourcesContent":["/**\n * Portagent Server\n *\n * Hono-based server that combines:\n * - AgentX API (via WebSocket on /ws)\n * - Authentication (JWT)\n * - Static file serving (Vite build output)\n *\n * Single port architecture:\n * - HTTP requests handled by Hono\n * - WebSocket upgrade on /ws path handled by AgentX\n */\n\nimport { dirname, resolve } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { createServer } from \"http\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nimport { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { serveStatic } from \"@hono/node-server/serve-static\";\nimport { existsSync, readFileSync } from \"fs\";\n\nimport { createAgentX } from \"agentxjs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { mkdirSync } from \"node:fs\";\n\nimport { createAuthMiddleware, authRoutes } from \"./auth\";\nimport { SQLiteUserRepository } from \"./database\";\nimport { PinoLoggerFactory } from \"./logger\";\n\n/**\n * Get data directory paths\n * Uses DATA_DIR env var, or defaults to ~/.agentx\n *\n * Directory structure:\n * data-dir/\n * ├── data/ # Database files\n * │ ├── agentx.db\n * │ └── portagent.db\n * └── logs/ # Log files\n * └── portagent.log\n */\nfunction getDataPaths() {\n const dataDir = process.env.DATA_DIR || join(homedir(), \".agentx\");\n const dataDirPath = join(dataDir, \"data\");\n const logsDirPath = join(dataDir, \"logs\");\n\n // Ensure directories exist\n mkdirSync(dataDirPath, { recursive: true });\n mkdirSync(logsDirPath, { recursive: true });\n\n return {\n dataDir,\n dataDirPath,\n logsDirPath,\n userDbPath: join(dataDirPath, \"portagent.db\"),\n agentxDbPath: join(dataDirPath, \"agentx.db\"),\n logFilePath: join(logsDirPath, \"portagent.log\"),\n };\n}\n\n// Configuration from environment\nconst PORT = parseInt(process.env.PORT || \"5200\", 10);\nconst JWT_SECRET = process.env.JWT_SECRET || crypto.randomUUID();\nconst INVITE_CODE_REQUIRED = process.env.INVITE_CODE_REQUIRED === \"true\"; // default: false\n\n/**\n * Create and configure the Hono app\n */\nasync function createApp() {\n const paths = getDataPaths();\n const app = new Hono();\n\n // CORS\n app.use(\n \"*\",\n cors({\n origin: \"*\",\n allowMethods: [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"HEAD\", \"OPTIONS\"],\n allowHeaders: [\"Content-Type\", \"Authorization\"],\n })\n );\n\n // Check API key\n const apiKey = process.env.LLM_PROVIDER_KEY;\n if (!apiKey) {\n console.error(\"Error: LLM_PROVIDER_KEY is required\");\n console.log(\"\\nSet it via environment variable:\");\n console.log(\" export LLM_PROVIDER_KEY=sk-ant-xxx\");\n process.exit(1);\n }\n\n // Create HTTP server using @hono/node-server's serve function internally\n // We need to create the server ourselves to pass it to AgentX\n const { getRequestListener } = await import(\"@hono/node-server\");\n const listener = getRequestListener(app.fetch);\n const server = createServer(listener);\n\n // Create logger factory\n const logLevel = (process.env.LOG_LEVEL || \"info\") as \"debug\" | \"info\" | \"warn\" | \"error\";\n const loggerFactory = new PinoLoggerFactory({\n level: logLevel,\n logDir: paths.logsDirPath,\n pretty: process.env.NODE_ENV !== \"production\",\n });\n\n // Create AgentX instance attached to HTTP server\n // WebSocket upgrade will be handled on /ws path\n const agentx = await createAgentX({\n llm: {\n apiKey,\n baseUrl: process.env.LLM_PROVIDER_URL,\n model: process.env.LLM_PROVIDER_MODEL,\n },\n storage: {\n driver: \"sqlite\",\n path: paths.agentxDbPath,\n },\n logger: {\n level: logLevel,\n factory: loggerFactory,\n },\n server, // Attach to existing HTTP server\n });\n\n // Initialize user repository (separate database)\n const userRepository = new SQLiteUserRepository(paths.userDbPath);\n\n // Auth middleware\n const authMiddleware = createAuthMiddleware(JWT_SECRET);\n\n // ============================================================\n // Routes\n // ============================================================\n\n // Health check (no auth)\n app.get(\"/health\", (c) => c.json({ status: \"ok\", timestamp: Date.now() }));\n\n // Auth routes (register, login)\n app.route(\n \"/api/auth\",\n authRoutes(userRepository, JWT_SECRET, agentx, { inviteCodeRequired: INVITE_CODE_REQUIRED })\n );\n\n // AgentX info endpoint (protected)\n app.use(\"/agentx/*\", authMiddleware);\n app.get(\"/agentx/info\", (c) => {\n return c.json({\n version: \"0.1.0\",\n wsPath: \"/ws\",\n });\n });\n\n // Static files\n const publicDir = resolve(__dirname, \"../public\");\n const isDev = process.env.NODE_ENV !== \"production\";\n\n if (existsSync(publicDir)) {\n // Serve static files\n app.use(\"/*\", serveStatic({ root: publicDir }));\n\n // SPA fallback - serve index.html for all unmatched routes\n app.get(\"*\", (c) => {\n const indexPath = resolve(publicDir, \"index.html\");\n if (existsSync(indexPath)) {\n const html = readFileSync(indexPath, \"utf-8\");\n return c.html(html);\n }\n return c.text(\"Not Found\", 404);\n });\n } else if (isDev) {\n app.get(\"*\", (c) => {\n return c.text(\n \"Static files not found. Run 'pnpm build:client' first, or use 'pnpm dev' for development.\",\n 404\n );\n });\n }\n\n return { app, server, agentx, userRepository, paths };\n}\n\n/**\n * Start the server\n */\nasync function startServer() {\n const { server, agentx, userRepository, paths } = await createApp();\n\n console.log(`\n ____ _ _\n | _ \\\\ ___ _ __| |_ __ _ __ _ ___ _ __ | |_\n | |_) / _ \\\\| '__| __/ _\\` |/ _\\` |/ _ \\\\ '_ \\\\| __|\n | __/ (_) | | | || (_| | (_| | __/ | | | |_\n |_| \\\\___/|_| \\\\__\\\\__,_|\\\\__, |\\\\___|_| |_|\\\\__|\n |___/\n\n AgentX Portal - Your AI Agent Gateway (Multi-User Mode)\n`);\n\n console.log(\"Configuration:\");\n console.log(` Port: ${PORT}`);\n console.log(` Data Dir: ${paths.dataDir}`);\n console.log(` API Key: ${process.env.LLM_PROVIDER_KEY!.substring(0, 15)}...`);\n console.log(` User DB: ${paths.userDbPath}`);\n console.log(` AgentX DB: ${paths.agentxDbPath}`);\n console.log(` Logs: ${paths.logsDirPath}`);\n console.log(` Invite Code: ${INVITE_CODE_REQUIRED ? \"required\" : \"disabled\"}`);\n\n console.log(`\\nEndpoints:`);\n console.log(` GET /health - Health check`);\n console.log(` POST /api/auth/register - Register new user`);\n console.log(` POST /api/auth/login - Login`);\n console.log(` GET /api/auth/verify - Verify token`);\n console.log(` GET /agentx/info - Platform info`);\n console.log(` WS /ws - WebSocket connection`);\n\n // Start HTTP server (WebSocket is already attached)\n server.listen(PORT, \"0.0.0.0\", () => {\n console.log(`\\n🚀 Server running at http://localhost:${PORT}`);\n console.log(`🔌 WebSocket available at ws://localhost:${PORT}/ws`);\n });\n\n // Graceful shutdown\n const shutdown = async () => {\n console.log(\"\\nShutting down...\");\n await agentx.dispose();\n userRepository.close();\n server.close();\n console.log(\"Server stopped\");\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n\nexport { createApp, startServer };\n","/**\n * Authentication Module\n *\n * Multi-user authentication with JWT tokens.\n * Supports user registration and login.\n */\n\nimport { Hono } from \"hono\";\nimport { createMiddleware } from \"hono/factory\";\nimport * as jose from \"jose\";\nimport type { AgentX } from \"agentxjs\";\nimport type { UserRepository } from \"./user/UserRepository\";\nimport type { UserInfo } from \"./user/types\";\n\nconst TOKEN_EXPIRY = \"7d\"; // 7 days\n\n/**\n * Validate invite code\n * Valid code is the Unix timestamp (in seconds) of today's 00:00:01\n */\nfunction isValidInviteCode(code: string): boolean {\n const timestamp = parseInt(code, 10);\n if (isNaN(timestamp)) return false;\n\n // Get today's 00:00:01 in local timezone\n const now = new Date();\n const todayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 1);\n const expectedTimestamp = Math.floor(todayStart.getTime() / 1000);\n\n return timestamp === expectedTimestamp;\n}\n\n/**\n * Generate a random password\n */\nexport function generatePassword(): string {\n const chars = \"ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789\";\n let password = \"\";\n for (let i = 0; i < 12; i++) {\n password += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return password;\n}\n\n/**\n * Create JWT token\n */\nasync function createToken(secret: string, userId: string): Promise<string> {\n const secretKey = new TextEncoder().encode(secret);\n const token = await new jose.SignJWT({ sub: userId })\n .setProtectedHeader({ alg: \"HS256\" })\n .setIssuedAt()\n .setExpirationTime(TOKEN_EXPIRY)\n .sign(secretKey);\n return token;\n}\n\n/**\n * Verify JWT token\n */\nasync function verifyToken(secret: string, token: string): Promise<{ userId: string } | null> {\n try {\n const secretKey = new TextEncoder().encode(secret);\n const { payload } = await jose.jwtVerify(token, secretKey);\n return { userId: payload.sub as string };\n } catch {\n return null;\n }\n}\n\n/**\n * Convert UserRecord to safe UserInfo (remove password hash)\n */\nfunction toUserInfo(user: {\n userId: string;\n username: string;\n email: string;\n containerId: string;\n displayName?: string;\n avatar?: string;\n createdAt: number;\n}): UserInfo {\n return {\n userId: user.userId,\n username: user.username,\n email: user.email,\n containerId: user.containerId,\n displayName: user.displayName,\n avatar: user.avatar,\n createdAt: user.createdAt,\n };\n}\n\n/**\n * Auth configuration\n */\nexport interface AuthConfig {\n inviteCodeRequired?: boolean;\n}\n\n/**\n * Auth routes\n */\nexport function authRoutes(\n userRepository: UserRepository,\n jwtSecret: string,\n agentx: AgentX,\n config: AuthConfig = {}\n): Hono {\n const app = new Hono();\n const { inviteCodeRequired = true } = config;\n\n // Config endpoint (public, for frontend to know requirements)\n app.get(\"/config\", (c) => {\n return c.json({ inviteCodeRequired });\n });\n\n // Register\n app.post(\"/register\", async (c) => {\n try {\n const body = await c.req.json<{\n username?: string;\n email?: string;\n password?: string;\n displayName?: string;\n avatar?: string;\n inviteCode?: string;\n }>();\n\n // Validation\n if (!body.username || !body.password) {\n return c.json({ error: \"Username and password are required\" }, 400);\n }\n\n // Validate invite code (only if required)\n if (inviteCodeRequired && (!body.inviteCode || !isValidInviteCode(body.inviteCode))) {\n return c.json({ error: \"Invalid invite code\" }, 400);\n }\n\n // Basic validation\n if (body.username.length < 3) {\n return c.json({ error: \"Username must be at least 3 characters\" }, 400);\n }\n\n if (body.password.length < 6) {\n return c.json({ error: \"Password must be at least 6 characters\" }, 400);\n }\n\n // Email format validation (only if provided)\n if (body.email && !body.email.includes(\"@\")) {\n return c.json({ error: \"Invalid email format\" }, 400);\n }\n\n // Create Container for the user first\n // Generate a unique container ID for the user\n const containerId = `user-${crypto.randomUUID()}`;\n const containerRes = await agentx.request(\"container_create_request\", { containerId });\n if (containerRes.data.error) {\n return c.json({ error: \"Failed to create user container\" }, 500);\n }\n\n // Create user with the container ID\n const user = await userRepository.createUser({\n username: body.username,\n email: body.email,\n password: body.password,\n containerId,\n displayName: body.displayName,\n avatar: body.avatar,\n });\n\n // Generate token\n const token = await createToken(jwtSecret, user.userId);\n\n return c.json(\n {\n token,\n user: toUserInfo(user),\n expiresIn: TOKEN_EXPIRY,\n },\n 201\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Registration failed\";\n return c.json({ error: message }, 400);\n }\n });\n\n // Login\n app.post(\"/login\", async (c) => {\n try {\n const body = await c.req.json<{\n usernameOrEmail?: string;\n password?: string;\n }>();\n\n if (!body.usernameOrEmail || !body.password) {\n return c.json({ error: \"Username/email and password are required\" }, 400);\n }\n\n // Verify credentials\n const user = await userRepository.verifyPassword(body.usernameOrEmail, body.password);\n\n if (!user) {\n return c.json({ error: \"Invalid credentials\" }, 401);\n }\n\n // Generate token\n const token = await createToken(jwtSecret, user.userId);\n\n return c.json({\n token,\n user: toUserInfo(user),\n expiresIn: TOKEN_EXPIRY,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Login failed\";\n return c.json({ error: message }, 500);\n }\n });\n\n // Verify token\n app.get(\"/verify\", async (c) => {\n const authHeader = c.req.header(\"Authorization\");\n if (!authHeader || !authHeader.startsWith(\"Bearer \")) {\n return c.json({ valid: false }, 401);\n }\n\n const token = authHeader.slice(7);\n const result = await verifyToken(jwtSecret, token);\n\n if (!result) {\n return c.json({ valid: false }, 401);\n }\n\n // Get user info\n const user = await userRepository.findUserById(result.userId);\n if (!user || !user.isActive) {\n return c.json({ valid: false }, 401);\n }\n\n return c.json({ valid: true, user: toUserInfo(user) });\n });\n\n // Logout (client-side only, just for API consistency)\n app.post(\"/logout\", (c) => {\n return c.json({ success: true });\n });\n\n return app;\n}\n\n/**\n * Create auth middleware\n */\nexport function createAuthMiddleware(jwtSecret: string) {\n return createMiddleware(async (c, next) => {\n // Skip auth for SSE connections with token in query\n const url = new URL(c.req.url);\n const queryToken = url.searchParams.get(\"token\");\n\n // Check Authorization header first\n const authHeader = c.req.header(\"Authorization\");\n let token: string | null = null;\n\n if (authHeader && authHeader.startsWith(\"Bearer \")) {\n token = authHeader.slice(7);\n } else if (queryToken) {\n // Allow token in query param for SSE (EventSource doesn't support headers)\n token = queryToken;\n }\n\n if (!token) {\n return c.json({ error: \"Unauthorized\" }, 401);\n }\n\n const result = await verifyToken(jwtSecret, token);\n if (!result) {\n return c.json({ error: \"Invalid token\" }, 401);\n }\n\n // Set user info in context\n c.set(\"userId\", result.userId);\n\n // Also set as custom header for downstream handlers\n c.header(\"X-User-Id\", result.userId);\n\n await next();\n });\n}\n","/**\n * SQLiteUserRepository - SQLite implementation of UserRepository\n *\n * Manages user data in separate portagent.db database.\n * This is independent from AgentX's agentx.db.\n *\n * Relationship to AgentX:\n * - User (portagent.db) ←→ Container.config.ownerId (agentx.db)\n * - User.userId is stored in Container.config.ownerId field\n */\n\nimport Database from \"better-sqlite3\";\nimport { randomUUID } from \"crypto\";\nimport { hash, compare } from \"bcrypt\";\nimport type { UserRepository } from \"../user/UserRepository\";\nimport type { UserRecord, RegisterUserInput } from \"../user/types\";\n\nconst SALT_ROUNDS = 10;\n\n/**\n * SQLite implementation of UserRepository\n */\nexport class SQLiteUserRepository implements UserRepository {\n private db: Database.Database;\n\n constructor(dbPath: string) {\n this.db = new Database(dbPath);\n this.initDatabase();\n }\n\n /**\n * Initialize database schema\n */\n private initDatabase(): void {\n // Enable foreign keys\n this.db.pragma(\"foreign_keys = ON\");\n\n // Create users table\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS users (\n userId TEXT PRIMARY KEY,\n username TEXT UNIQUE NOT NULL,\n email TEXT UNIQUE NOT NULL,\n passwordHash TEXT NOT NULL,\n containerId TEXT NOT NULL,\n displayName TEXT,\n avatar TEXT,\n isActive INTEGER NOT NULL DEFAULT 1,\n createdAt INTEGER NOT NULL,\n updatedAt INTEGER NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_users_username ON users(username);\n CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);\n CREATE INDEX IF NOT EXISTS idx_users_containerId ON users(containerId);\n `);\n }\n\n /**\n * Create a new user\n */\n async createUser(input: RegisterUserInput): Promise<UserRecord> {\n // Check if username exists\n if (await this.usernameExists(input.username)) {\n throw new Error(`Username '${input.username}' already exists`);\n }\n\n // Check if email exists (only if provided)\n if (input.email && (await this.emailExists(input.email))) {\n throw new Error(`Email '${input.email}' already exists`);\n }\n\n // Hash password\n const passwordHash = await hash(input.password, SALT_ROUNDS);\n\n // Create user record\n const userId = randomUUID();\n const now = Date.now();\n\n // Use placeholder email if not provided (to satisfy DB constraint)\n const email = input.email || `${userId}@noemail.portagent`;\n\n const user: UserRecord = {\n userId,\n username: input.username,\n email,\n passwordHash,\n containerId: input.containerId,\n displayName: input.displayName,\n avatar: input.avatar,\n isActive: true,\n createdAt: now,\n updatedAt: now,\n };\n\n // Insert into database\n const stmt = this.db.prepare(`\n INSERT INTO users (\n userId, username, email, passwordHash, containerId, displayName, avatar, isActive, createdAt, updatedAt\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n user.userId,\n user.username,\n user.email,\n user.passwordHash,\n user.containerId,\n user.displayName,\n user.avatar,\n user.isActive ? 1 : 0,\n user.createdAt,\n user.updatedAt\n );\n\n return user;\n }\n\n /**\n * Find user by ID\n */\n async findUserById(userId: string): Promise<UserRecord | null> {\n const stmt = this.db.prepare(`\n SELECT * FROM users WHERE userId = ?\n `);\n\n const row = stmt.get(userId) as any;\n return row ? this.rowToUser(row) : null;\n }\n\n /**\n * Find user by username\n */\n async findUserByUsername(username: string): Promise<UserRecord | null> {\n const stmt = this.db.prepare(`\n SELECT * FROM users WHERE username = ?\n `);\n\n const row = stmt.get(username) as any;\n return row ? this.rowToUser(row) : null;\n }\n\n /**\n * Find user by email\n */\n async findUserByEmail(email: string): Promise<UserRecord | null> {\n const stmt = this.db.prepare(`\n SELECT * FROM users WHERE email = ?\n `);\n\n const row = stmt.get(email) as any;\n return row ? this.rowToUser(row) : null;\n }\n\n /**\n * Find user by username or email\n */\n async findUserByUsernameOrEmail(usernameOrEmail: string): Promise<UserRecord | null> {\n const stmt = this.db.prepare(`\n SELECT * FROM users WHERE username = ? OR email = ?\n `);\n\n const row = stmt.get(usernameOrEmail, usernameOrEmail) as any;\n return row ? this.rowToUser(row) : null;\n }\n\n /**\n * Update user\n */\n async updateUser(\n userId: string,\n updates: Partial<Omit<UserRecord, \"userId\">>\n ): Promise<UserRecord> {\n const user = await this.findUserById(userId);\n if (!user) {\n throw new Error(`User ${userId} not found`);\n }\n\n // Build SET clause dynamically\n const fields: string[] = [];\n const values: any[] = [];\n\n if (updates.username !== undefined) {\n fields.push(\"username = ?\");\n values.push(updates.username);\n }\n if (updates.email !== undefined) {\n fields.push(\"email = ?\");\n values.push(updates.email);\n }\n if (updates.passwordHash !== undefined) {\n fields.push(\"passwordHash = ?\");\n values.push(updates.passwordHash);\n }\n if (updates.displayName !== undefined) {\n fields.push(\"displayName = ?\");\n values.push(updates.displayName);\n }\n if (updates.avatar !== undefined) {\n fields.push(\"avatar = ?\");\n values.push(updates.avatar);\n }\n if (updates.isActive !== undefined) {\n fields.push(\"isActive = ?\");\n values.push(updates.isActive ? 1 : 0);\n }\n\n // Always update updatedAt\n fields.push(\"updatedAt = ?\");\n values.push(Date.now());\n\n if (fields.length === 0) {\n return user; // No updates\n }\n\n // Execute update\n values.push(userId);\n const stmt = this.db.prepare(`\n UPDATE users SET ${fields.join(\", \")} WHERE userId = ?\n `);\n\n stmt.run(...values);\n\n // Return updated user\n return (await this.findUserById(userId))!;\n }\n\n /**\n * Delete user\n */\n async deleteUser(userId: string): Promise<boolean> {\n const stmt = this.db.prepare(`\n DELETE FROM users WHERE userId = ?\n `);\n\n const result = stmt.run(userId);\n return result.changes > 0;\n }\n\n /**\n * List all users\n */\n async listUsers(): Promise<UserRecord[]> {\n const stmt = this.db.prepare(`\n SELECT * FROM users ORDER BY createdAt DESC\n `);\n\n const rows = stmt.all() as any[];\n return rows.map((row) => this.rowToUser(row));\n }\n\n /**\n * Check if username exists\n */\n async usernameExists(username: string): Promise<boolean> {\n const stmt = this.db.prepare(`\n SELECT 1 FROM users WHERE username = ?\n `);\n\n return stmt.get(username) !== undefined;\n }\n\n /**\n * Check if email exists\n */\n async emailExists(email: string): Promise<boolean> {\n const stmt = this.db.prepare(`\n SELECT 1 FROM users WHERE email = ?\n `);\n\n return stmt.get(email) !== undefined;\n }\n\n /**\n * Verify password for login\n *\n * @param usernameOrEmail - Username or email\n * @param password - Plain text password\n * @returns User record if valid, null if invalid\n */\n async verifyPassword(usernameOrEmail: string, password: string): Promise<UserRecord | null> {\n const user = await this.findUserByUsernameOrEmail(usernameOrEmail);\n if (!user) {\n return null;\n }\n\n if (!user.isActive) {\n return null; // Inactive user\n }\n\n const isValid = await compare(password, user.passwordHash);\n return isValid ? user : null;\n }\n\n /**\n * Close database connection\n */\n close(): void {\n this.db.close();\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n private rowToUser(row: any): UserRecord {\n return {\n userId: row.userId,\n username: row.username,\n email: row.email,\n passwordHash: row.passwordHash,\n containerId: row.containerId,\n displayName: row.displayName,\n avatar: row.avatar,\n isActive: row.isActive === 1,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n }\n}\n","/**\n * PinoLogger - Production-grade logger using pino\n *\n * Features:\n * - Fast JSON logging (pino is one of the fastest Node.js loggers)\n * - File logging with daily rotation\n * - Console output with pino-pretty in development\n * - Implements AgentX LoggerFactory interface\n */\n\nimport pino, { type Logger as PinoLogger } from \"pino\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { Logger, LoggerFactory, LogContext, LogLevel } from \"agentxjs\";\n\n/**\n * Map AgentX log levels to pino log levels\n */\nconst LEVEL_MAP: Record<LogLevel, string> = {\n debug: \"debug\",\n info: \"info\",\n warn: \"warn\",\n error: \"error\",\n silent: \"silent\",\n};\n\n/**\n * PinoLoggerAdapter - Adapts pino logger to AgentX Logger interface\n */\nclass PinoLoggerAdapter implements Logger {\n constructor(\n public readonly name: string,\n public readonly level: LogLevel,\n private readonly pino: PinoLogger\n ) {}\n\n debug(message: string, context?: LogContext): void {\n this.pino.debug(context || {}, message);\n }\n\n info(message: string, context?: LogContext): void {\n this.pino.info(context || {}, message);\n }\n\n warn(message: string, context?: LogContext): void {\n this.pino.warn(context || {}, message);\n }\n\n error(message: string | Error, context?: LogContext): void {\n if (message instanceof Error) {\n this.pino.error({ ...context, err: message }, message.message);\n } else {\n this.pino.error(context || {}, message);\n }\n }\n\n isDebugEnabled(): boolean {\n return this.pino.isLevelEnabled(\"debug\");\n }\n\n isInfoEnabled(): boolean {\n return this.pino.isLevelEnabled(\"info\");\n }\n\n isWarnEnabled(): boolean {\n return this.pino.isLevelEnabled(\"warn\");\n }\n\n isErrorEnabled(): boolean {\n return this.pino.isLevelEnabled(\"error\");\n }\n}\n\n/**\n * PinoLoggerFactory - Creates pino-based loggers\n *\n * Supports multiple output targets:\n * - Console (with pretty printing in dev)\n * - File (JSON format, daily rotation)\n */\nexport class PinoLoggerFactory implements LoggerFactory {\n private readonly rootLogger: PinoLogger;\n\n constructor(options: {\n level: LogLevel;\n logDir: string;\n pretty?: boolean; // Use pino-pretty for console output\n }) {\n const { level, logDir, pretty = process.env.NODE_ENV !== \"production\" } = options;\n\n // Ensure log directory exists\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true });\n }\n\n // Create log file path with date\n const getLogFilePath = () => {\n const now = new Date();\n const dateStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, \"0\")}-${String(now.getDate()).padStart(2, \"0\")}`;\n return path.join(logDir, `portagent-${dateStr}.log`);\n };\n\n // Create pino transports\n const targets: pino.TransportTargetOptions[] = [];\n\n // File transport (always JSON)\n targets.push({\n target: \"pino/file\",\n level: LEVEL_MAP[level],\n options: {\n destination: getLogFilePath(),\n mkdir: true,\n },\n });\n\n // Console transport\n if (pretty) {\n targets.push({\n target: \"pino-pretty\",\n level: LEVEL_MAP[level],\n options: {\n colorize: true,\n translateTime: \"SYS:standard\",\n ignore: \"pid,hostname\",\n },\n });\n } else {\n targets.push({\n target: \"pino/file\",\n level: LEVEL_MAP[level],\n options: { destination: 1 }, // stdout\n });\n }\n\n // Create root logger with multi-stream transport\n this.rootLogger = pino({\n level: LEVEL_MAP[level],\n transport: {\n targets,\n },\n });\n }\n\n getLogger(name: string): Logger {\n const childLogger = this.rootLogger.child({ name });\n return new PinoLoggerAdapter(name, this.rootLogger.level as LogLevel, childLogger);\n }\n}\n"],"mappings":"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","names":["Hono","pino","Hono"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentxjs/portagent",
3
- "version": "0.1.9",
3
+ "version": "1.0.0",
4
4
  "description": "Portagent - AgentX Portal Application",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -32,9 +32,9 @@
32
32
  "react": "^18.3.1",
33
33
  "react-dom": "^18.3.1",
34
34
  "react-router-dom": "^7.1.1",
35
- "@agentxjs/runtime": "0.1.9",
36
- "agentxjs": "0.1.9",
37
- "@agentxjs/ui": "0.1.9"
35
+ "@agentxjs/runtime": "1.0.0",
36
+ "agentxjs": "1.0.0",
37
+ "@agentxjs/ui": "1.0.0"
38
38
  },
39
39
  "publishConfig": {
40
40
  "access": "public"