From 24308f2ab1cf783a7fdd6d041d486af2359a41eb Mon Sep 17 00:00:00 2001 From: Harald Schilly Date: Thu, 10 Jul 2025 11:02:58 +0200 Subject: [PATCH 1/2] hub/conat: discover via k8s api --- src/packages/hub/package.json | 1 + src/packages/pnpm-lock.yaml | 280 ++++++++++++++++-- .../server/conat/socketio/dns-scan-k8s-api.ts | 35 +++ .../server/conat/socketio/dns-scan.ts | 58 +++- src/packages/server/package.json | 1 + 5 files changed, 346 insertions(+), 29 deletions(-) create mode 100644 src/packages/server/conat/socketio/dns-scan-k8s-api.ts diff --git a/src/packages/hub/package.json b/src/packages/hub/package.json index e529306118..9ca3b1f7da 100644 --- a/src/packages/hub/package.json +++ b/src/packages/hub/package.json @@ -18,6 +18,7 @@ "@cocalc/static": "workspace:*", "@cocalc/util": "workspace:*", "@isaacs/ttlcache": "^1.4.1", + "@kubernetes/client-node": "^1.3.0", "@types/formidable": "^3.4.5", "async": "^1.5.2", "awaiting": "^3.0.0", diff --git a/src/packages/pnpm-lock.yaml b/src/packages/pnpm-lock.yaml index 53a67ec56f..65104c0ea3 100644 --- a/src/packages/pnpm-lock.yaml +++ b/src/packages/pnpm-lock.yaml @@ -747,6 +747,9 @@ importers: '@isaacs/ttlcache': specifier: ^1.4.1 version: 1.4.1 + '@kubernetes/client-node': + specifier: ^1.3.0 + version: 1.3.0(encoding@0.1.13) '@types/formidable': specifier: ^3.4.5 version: 3.4.5 @@ -1213,6 +1216,9 @@ importers: '@isaacs/ttlcache': specifier: ^1.4.1 version: 1.4.1 + '@kubernetes/client-node': + specifier: ^1.3.0 + version: 1.3.0(encoding@0.1.13) '@langchain/anthropic': specifier: ^0.3.18 version: 0.3.24(@langchain/core@0.3.62(openai@4.104.0(encoding@0.1.13)(ws@8.18.3)(zod@3.25.67))) @@ -2988,6 +2994,18 @@ packages: '@js-sdsl/ordered-map@4.4.2': resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@jsep-plugin/assignment@1.3.0': + resolution: {integrity: sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + + '@jsep-plugin/regex@1.0.4': + resolution: {integrity: sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + '@jsonjoy.com/base64@1.1.2': resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} engines: {node: '>=10.0'} @@ -3041,6 +3059,9 @@ packages: '@jupyterlab/statedb@4.4.0': resolution: {integrity: sha512-fjYfcJ08iq9DYRWg2qEuoq4gtIm+F9oU8x8tflKJ0UZZ+HpTQDRqChrWUCQ/nijymD8zs05BG3J63TUXlpTYnw==} + '@kubernetes/client-node@1.3.0': + resolution: {integrity: sha512-IE0yrIpOT97YS5fg2QpzmPzm8Wmcdf4ueWMn+FiJSI3jgTTQT1u+LUhoYpdfhdHAVxdrNsaBg2C0UXSnOgMoCQ==} + '@langchain/anthropic@0.3.24': resolution: {integrity: sha512-Gi1TwXu5vkCxUMToiXaiwTTWq9v3WMyU3ldB/VEWjzbkr3nKF5kcp+HLqhvV7WWOFVTTNgG+pzfq8JALecq5MA==} engines: {node: '>=18'} @@ -4377,6 +4398,9 @@ packages: '@types/node@18.19.115': resolution: {integrity: sha512-kNrFiTgG4a9JAn1LMQeLOv3MvXIPokzXziohMrMsvpYgLpdEt/mMiVYc4sGKtDfyxM5gIDF4VgrPRyCw4fHOYg==} + '@types/node@22.16.2': + resolution: {integrity: sha512-Cdqa/eJTvt4fC4wmq1Mcc0CPUjp/Qy2FGqLza3z3pKymsI969TcZ54diNJv8UYUgeWxyb8FSbCkhdR6WqmUFhA==} + '@types/node@24.0.10': resolution: {integrity: sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==} @@ -4478,6 +4502,9 @@ packages: '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + '@types/stream-buffers@3.0.7': + resolution: {integrity: sha512-azOCy05sXVXrO+qklf0c/B07H/oHaIuDDAiHPVwlk3A9Ek+ksHyTeMajLZl3r76FxpPpxem//4Te61G1iW3Giw==} + '@types/supercluster@7.1.3': resolution: {integrity: sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==} @@ -5004,6 +5031,9 @@ packages: axios@1.10.0: resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5048,6 +5078,36 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bare-events@2.6.0: + resolution: {integrity: sha512-EKZ5BTXYExaNqi3I3f9RtEsaI/xBSGjE0XZCZilPzFAV/goswFHuPd9jEZlPIZ/iNZJwDSao9qRiScySz7MbQg==} + + bare-fs@4.1.6: + resolution: {integrity: sha512-25RsLF33BqooOEFNdMcEhMpJy8EoR88zSMrnOQOaM3USnOK2VmaJ1uaQEwPA6AQjrv1lXChScosN6CzbwbO9OQ==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-os@3.6.1: + resolution: {integrity: sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==} + engines: {bare: '>=1.14.0'} + + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + + bare-stream@2.6.5: + resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} + peerDependencies: + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true + base-64@1.0.0: resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} @@ -6731,6 +6791,9 @@ packages: resolution: {integrity: sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==} engines: {node: '>=6.0.0'} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -7304,6 +7367,10 @@ packages: hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + hpagent@1.2.0: + resolution: {integrity: sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==} + engines: {node: '>=14'} + hsluv@0.0.3: resolution: {integrity: sha512-08iL2VyCRbkQKBySkSh6m8zMUa3sADAxGVWs3Z1aPcUkTJeK0ETG4Fc27tEmQBGUAXZjIsXOZqBvacuVNSC/fQ==} @@ -7856,6 +7923,11 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} + isomorphic-ws@5.0.0: + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + peerDependencies: + ws: '*' + isomorphic.js@0.2.5: resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} @@ -8084,6 +8156,9 @@ packages: node-notifier: optional: true + jose@6.0.11: + resolution: {integrity: sha512-QxG7EaliDARm1O1S8BGakqncGT9s25bKL1WSf6/oa17Tkqwi8D2ZNglqCF+DsYF88/rV66Q/Q2mFAy697E1DUg==} + jquery-focus-exit@1.0.1: resolution: {integrity: sha512-p79pTJKVsrYX4bZML+bc1MnRe9IrxcpIIeUqyfuVMpLFR4L05r7zxBe3YywPjn74hNavuOA2KNBhy36UXroMiA==} peerDependencies: @@ -8164,6 +8239,10 @@ packages: canvas: optional: true + jsep@1.4.0: + resolution: {integrity: sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==} + engines: {node: '>= 10.16.0'} + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -8229,6 +8308,11 @@ packages: jsonify@0.0.1: resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} + jsonpath-plus@10.3.0: + resolution: {integrity: sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==} + engines: {node: '>=18.0.0'} + hasBin: true + jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} @@ -8979,6 +9063,9 @@ packages: nwsapi@2.2.20: resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} + oauth4webapi@3.5.5: + resolution: {integrity: sha512-1K88D2GiAydGblHo39NBro5TebGXa+7tYoyIbxvqv3+haDDry7CBE1eSYuNbOSsYCCU6y0gdynVZAkm4YPw4hg==} + oauth@0.10.2: resolution: {integrity: sha512-JtFnB+8nxDEXgNyniwz573xxbKSOu3R8D40xQKqcjwJ2CDkYqUDI53o6IuzDJBx60Z8VKCm271+t8iFjakrl8Q==} @@ -9081,6 +9168,9 @@ packages: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} hasBin: true + openid-client@6.6.2: + resolution: {integrity: sha512-Xya5TNMnnZuTM6DbHdB4q0S3ig2NTAELnii/ASie1xDEr8iiB8zZbO871OWBdrw++sd3hW6bqWjgcmSy1RTWHA==} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -10302,6 +10392,9 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rfc4648@1.5.4: + resolution: {integrity: sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg==} + right-now@1.0.0: resolution: {integrity: sha512-DA8+YS+sMIVpbsuKgy+Z67L9Lxb1p05mNxRpDPNksPDEFir4vmBlUtuN9jkTGn9YMMdlBuK7XQgFiz6ws+yhSg==} @@ -10723,6 +10816,10 @@ packages: stream-browserify@3.0.0: resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + stream-buffers@3.0.3: + resolution: {integrity: sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw==} + engines: {node: '>= 0.10.0'} + stream-events@1.0.5: resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} @@ -10736,6 +10833,9 @@ packages: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} + streamx@2.22.1: + resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==} + string-convert@0.2.1: resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} @@ -10928,10 +11028,16 @@ packages: tar-fs@2.1.3: resolution: {integrity: sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==} + tar-fs@3.0.9: + resolution: {integrity: sha512-XF4w9Xp+ZQgifKakjZYmFdkLoSWd34VGKcsTCwlNWM7QG3ZbaxnTsaBwnjFZqHRf/rROxaR8rXnbtwdvaDI+lA==} + tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + tdigest@0.1.2: resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} @@ -10978,6 +11084,9 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + text-hex@1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} @@ -11296,6 +11405,9 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.8.0: resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} @@ -12911,7 +13023,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 24.0.10 + '@types/node': 18.19.115 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -12958,7 +13070,7 @@ snapshots: '@jest/fake-timers': 30.0.4 '@jest/types': 30.0.1 '@types/jsdom': 21.1.7 - '@types/node': 24.0.10 + '@types/node': 18.19.115 jest-mock: 30.0.2 jest-util: 30.0.2 jsdom: 26.1.0 @@ -12967,14 +13079,14 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.0.10 + '@types/node': 18.19.115 jest-mock: 29.7.0 '@jest/environment@30.0.4': dependencies: '@jest/fake-timers': 30.0.4 '@jest/types': 30.0.1 - '@types/node': 24.0.10 + '@types/node': 18.19.115 jest-mock: 30.0.2 '@jest/expect-utils@29.7.0': @@ -12992,7 +13104,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 24.0.10 + '@types/node': 18.19.115 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -13001,7 +13113,7 @@ snapshots: dependencies: '@jest/types': 30.0.1 '@sinonjs/fake-timers': 13.0.5 - '@types/node': 24.0.10 + '@types/node': 18.19.115 jest-message-util: 30.0.2 jest-mock: 30.0.2 jest-util: 30.0.2 @@ -13017,7 +13129,7 @@ snapshots: '@jest/pattern@30.0.1': dependencies: - '@types/node': 24.0.10 + '@types/node': 18.19.115 jest-regex-util: 30.0.1 '@jest/reporters@29.7.0': @@ -13028,7 +13140,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 24.0.10 + '@types/node': 18.19.115 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -13120,7 +13232,7 @@ snapshots: '@jest/schemas': 30.0.1 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.0.10 + '@types/node': 18.19.115 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -13165,6 +13277,14 @@ snapshots: '@js-sdsl/ordered-map@4.4.2': {} + '@jsep-plugin/assignment@1.3.0(jsep@1.4.0)': + dependencies: + jsep: 1.4.0 + + '@jsep-plugin/regex@1.0.4(jsep@1.4.0)': + dependencies: + jsep: 1.4.0 + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': dependencies: tslib: 2.8.1 @@ -13306,6 +13426,31 @@ snapshots: '@lumino/properties': 2.0.3 '@lumino/signaling': 2.1.4 + '@kubernetes/client-node@1.3.0(encoding@0.1.13)': + dependencies: + '@types/js-yaml': 4.0.9 + '@types/node': 22.16.2 + '@types/node-fetch': 2.6.12 + '@types/stream-buffers': 3.0.7 + form-data: 4.0.2 + hpagent: 1.2.0 + isomorphic-ws: 5.0.0(ws@8.18.3) + js-yaml: 4.1.0 + jsonpath-plus: 10.3.0 + node-fetch: 2.7.0(encoding@0.1.13) + openid-client: 6.6.2 + rfc4648: 1.5.4 + socks-proxy-agent: 8.0.5 + stream-buffers: 3.0.3 + tar-fs: 3.0.9 + ws: 8.18.3 + transitivePeerDependencies: + - bare-buffer + - bufferutil + - encoding + - supports-color + - utf-8-validate + '@langchain/anthropic@0.3.24(@langchain/core@0.3.62(openai@4.104.0(encoding@0.1.13)(ws@8.18.3)(zod@3.25.67)))': dependencies: '@anthropic-ai/sdk': 0.56.0 @@ -14705,7 +14850,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 24.0.10 + '@types/node': 18.19.115 '@types/hast@2.3.10': dependencies: @@ -14757,7 +14902,7 @@ snapshots: '@types/jsdom@21.1.7': dependencies: - '@types/node': 24.0.10 + '@types/node': 18.19.115 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 @@ -14829,6 +14974,10 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/node@22.16.2': + dependencies: + undici-types: 6.21.0 + '@types/node@24.0.10': dependencies: undici-types: 7.8.0 @@ -14956,6 +15105,10 @@ snapshots: '@types/stack-utils@2.0.3': {} + '@types/stream-buffers@3.0.7': + dependencies: + '@types/node': 18.19.115 + '@types/supercluster@7.1.3': dependencies: '@types/geojson': 7946.0.16 @@ -15569,6 +15722,8 @@ snapshots: transitivePeerDependencies: - debug + b4a@1.6.7: {} + babel-jest@29.7.0(@babel/core@7.26.9): dependencies: '@babel/core': 7.26.9 @@ -15642,6 +15797,31 @@ snapshots: balanced-match@1.0.2: {} + bare-events@2.6.0: + optional: true + + bare-fs@4.1.6: + dependencies: + bare-events: 2.6.0 + bare-path: 3.0.0 + bare-stream: 2.6.5(bare-events@2.6.0) + optional: true + + bare-os@3.6.1: + optional: true + + bare-path@3.0.0: + dependencies: + bare-os: 3.6.1 + optional: true + + bare-stream@2.6.5(bare-events@2.6.0): + dependencies: + streamx: 2.22.1 + optionalDependencies: + bare-events: 2.6.0 + optional: true + base-64@1.0.0: {} base16@1.0.0: {} @@ -17674,6 +17854,8 @@ snapshots: fast-equals@5.2.2: {} + fast-fifo@1.3.2: {} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -18445,6 +18627,8 @@ snapshots: readable-stream: 2.3.8 wbuf: 1.7.3 + hpagent@1.2.0: {} + hsluv@0.0.3: {} html-dom-parser@5.1.1: @@ -18969,6 +19153,10 @@ snapshots: isobject@3.0.1: {} + isomorphic-ws@5.0.0(ws@8.18.3): + dependencies: + ws: 8.18.3 + isomorphic.js@0.2.5: {} istanbul-lib-coverage@3.2.2: {} @@ -19054,7 +19242,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.0.10 + '@types/node': 18.19.115 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.3 @@ -19215,7 +19403,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.0.10 + '@types/node': 18.19.115 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -19227,7 +19415,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 24.0.10 + '@types/node': 18.19.115 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -19297,13 +19485,13 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.0.10 + '@types/node': 18.19.115 jest-util: 29.7.0 jest-mock@30.0.2: dependencies: '@jest/types': 30.0.1 - '@types/node': 24.0.10 + '@types/node': 18.19.115 jest-util: 30.0.2 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -19342,7 +19530,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.0.10 + '@types/node': 18.19.115 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -19370,7 +19558,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.0.10 + '@types/node': 18.19.115 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.2 @@ -19425,7 +19613,7 @@ snapshots: jest-util@30.0.2: dependencies: '@jest/types': 30.0.1 - '@types/node': 24.0.10 + '@types/node': 18.19.115 chalk: 4.1.2 ci-info: 4.2.0 graceful-fs: 4.2.11 @@ -19444,7 +19632,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.0.10 + '@types/node': 18.19.115 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -19459,7 +19647,7 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 24.0.10 + '@types/node': 18.19.115 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -19488,6 +19676,8 @@ snapshots: - supports-color - ts-node + jose@6.0.11: {} + jquery-focus-exit@1.0.1(jquery@3.7.1): dependencies: jquery: 3.7.1 @@ -19578,6 +19768,8 @@ snapshots: - supports-color - utf-8-validate + jsep@1.4.0: {} + jsesc@3.1.0: {} json-bigint@1.0.0: @@ -19638,6 +19830,12 @@ snapshots: jsonify@0.0.1: {} + jsonpath-plus@10.3.0: + dependencies: + '@jsep-plugin/assignment': 1.3.0(jsep@1.4.0) + '@jsep-plugin/regex': 1.0.4(jsep@1.4.0) + jsep: 1.4.0 + jsonpointer@5.0.1: {} jsonwebtoken@9.0.2: @@ -20490,6 +20688,8 @@ snapshots: nwsapi@2.2.20: {} + oauth4webapi@3.5.5: {} + oauth@0.10.2: {} oauth@0.9.15: {} @@ -20592,6 +20792,11 @@ snapshots: opener@1.5.2: {} + openid-client@6.6.2: + dependencies: + jose: 6.0.11 + oauth4webapi: 3.5.5 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -22128,6 +22333,8 @@ snapshots: reusify@1.0.4: {} + rfc4648@1.5.4: {} + right-now@1.0.0: {} rimraf@2.4.5: @@ -22651,6 +22858,8 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + stream-buffers@3.0.3: {} + stream-events@1.0.5: dependencies: stubs: 3.0.0 @@ -22665,6 +22874,13 @@ snapshots: streamsearch@1.1.0: {} + streamx@2.22.1: + dependencies: + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + optionalDependencies: + bare-events: 2.6.0 + string-convert@0.2.1: {} string-length@4.0.2: @@ -22884,6 +23100,16 @@ snapshots: pump: 3.0.2 tar-stream: 2.2.0 + tar-fs@3.0.9: + dependencies: + pump: 3.0.2 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 4.1.6 + bare-path: 3.0.0 + transitivePeerDependencies: + - bare-buffer + tar-stream@2.2.0: dependencies: bl: 4.1.0 @@ -22892,6 +23118,12 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + tar-stream@3.1.7: + dependencies: + b4a: 1.6.7 + fast-fifo: 1.3.2 + streamx: 2.22.1 + tdigest@0.1.2: dependencies: bintrees: 1.0.2 @@ -22959,6 +23191,10 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 + text-decoder@1.2.3: + dependencies: + b4a: 1.6.7 + text-hex@1.0.0: {} text-table@0.2.0: {} @@ -23247,6 +23483,8 @@ snapshots: undici-types@5.26.5: {} + undici-types@6.21.0: {} + undici-types@7.8.0: {} unicorn-magic@0.1.0: {} diff --git a/src/packages/server/conat/socketio/dns-scan-k8s-api.ts b/src/packages/server/conat/socketio/dns-scan-k8s-api.ts new file mode 100644 index 0000000000..e7bf2eabde --- /dev/null +++ b/src/packages/server/conat/socketio/dns-scan-k8s-api.ts @@ -0,0 +1,35 @@ +import * as k8s from "@kubernetes/client-node"; +import { readFileSync } from "fs"; + +const kc = new k8s.KubeConfig(); +kc.loadFromCluster(); + +const k8sApi = kc.makeApiClient(k8s.CoreV1Api); + +// Read the namespace the pod is running in +const namespace = readFileSync( + "/var/run/secrets/kubernetes.io/serviceaccount/namespace", + "utf8", +).trim(); + +export async function getAddressesFromK8sApi(): Promise< + { name: string; podIP: string }[] +> { + try { + const labelSelector = "run=hub-conat-router"; + const res = await k8sApi.listNamespacedPod({ namespace, labelSelector }); + + const ret: { name: string; podIP: string }[] = []; + for (const pod of res.items) { + const name = pod.metadata?.name; + const podIP = pod.status?.podIP; + if (name && podIP) { + ret.push({ name, podIP }); + } + } + return ret; + } catch (err) { + console.error("Error fetching addresses from Kubernetes API:", err); + return []; + } +} diff --git a/src/packages/server/conat/socketio/dns-scan.ts b/src/packages/server/conat/socketio/dns-scan.ts index 701b095ae6..9a89f25e5e 100644 --- a/src/packages/server/conat/socketio/dns-scan.ts +++ b/src/packages/server/conat/socketio/dns-scan.ts @@ -5,16 +5,32 @@ COCALC_SERVICE */ import { delay } from "awaiting"; -import type { ConatServer } from "@cocalc/conat/core/server"; import { lookup } from "dns/promises"; -import port from "@cocalc/backend/port"; import { hostname } from "node:os"; -import { getLogger } from "@cocalc/backend/logger"; + import { executeCode } from "@cocalc/backend/execute-code"; -import { split } from "@cocalc/util/misc"; +import { getLogger } from "@cocalc/backend/logger"; +import port from "@cocalc/backend/port"; +import type { ConatServer } from "@cocalc/conat/core/server"; +import { split, unreachable } from "@cocalc/util/misc"; +import { getAddressesFromK8sApi } from "./dns-scan-k8s-api"; export const SCAN_INTERVAL = 15_000; +type PeerDiscovery = "KUBECTL" | "API"; + +function isPeerDiscovery(x: string): x is PeerDiscovery { + return x === "KUBECTL" || x === "API"; +} + +const PEER_DISCOVERY: PeerDiscovery = (function () { + const val = process.env.COCALC_CONAT_PEER_DISCOVERY ?? "KUBECTL"; + if (!isPeerDiscovery(val)) { + throw Error(`Invalid COCALC_CONAT_PEER_DISCOVERY: ${val}`); + } + return val; +})(); + const logger = getLogger("conat:socketio:dns-scan"); export async function dnsScan(server: ConatServer) { @@ -83,6 +99,32 @@ export async function getAddresses(): Promise { const h = hostname(); const i = h.lastIndexOf("-"); const prefix = h.slice(0, i); + + const podInfos = await getPodInfos(); + for (const { name, podIP } of podInfos) { + if (name != h && name.startsWith(prefix)) { + v.push(`http://${podIP}:${port}`); + } + } + return v; +} + +async function getPodInfos(): Promise<{ name: string; podIP: string }[]> { + switch (PEER_DISCOVERY) { + case "KUBECTL": + return await getAddressesFromKubectl(); + case "API": + return await getAddressesFromK8sApi(); + default: + unreachable(PEER_DISCOVERY); + throw Error(`Unknown PEER_DISCOVERY: ${PEER_DISCOVERY}`); + } +} + +async function getAddressesFromKubectl(): Promise< + { name: string; podIP: string }[] +> { + const ret: { name: string; podIP: string }[] = []; const { stdout } = await executeCode({ command: "kubectl", args: [ @@ -97,10 +139,10 @@ export async function getAddresses(): Promise { for (const x of stdout.split("\n")) { const row = split(x); if (row.length == 2) { - if (row[0] != h && row[0].startsWith(prefix)) { - v.push(`http://${row[1]}:${port}`); - } + ret.push({ name: row[0], podIP: row[1] }); + } else { + logger.warn(`Unexpected row from kubectl: ${x}`); } } - return v; + return ret; } diff --git a/src/packages/server/package.json b/src/packages/server/package.json index 10173819ce..25300505eb 100644 --- a/src/packages/server/package.json +++ b/src/packages/server/package.json @@ -56,6 +56,7 @@ "@google-cloud/storage-transfer": "^3.3.0", "@google/generative-ai": "^0.14.0", "@isaacs/ttlcache": "^1.4.1", + "@kubernetes/client-node": "^1.3.0", "@langchain/anthropic": "^0.3.18", "@langchain/core": "^0.3.46", "@langchain/google-genai": "^0.2.4", From 962d24c45484a0792bf0de30d866bb8731cf2384 Mon Sep 17 00:00:00 2001 From: Harald Schilly Date: Sun, 13 Jul 2025 20:11:07 +0200 Subject: [PATCH 2/2] hub/conat: discover router directly via k8s api --- src/packages/hub/package.json | 1 - src/packages/pnpm-lock.yaml | 297 ++---------------- .../server/conat/socketio/dns-scan-k8s-api.ts | 115 +++++-- src/packages/server/package.json | 1 - 4 files changed, 123 insertions(+), 291 deletions(-) diff --git a/src/packages/hub/package.json b/src/packages/hub/package.json index 9ca3b1f7da..e529306118 100644 --- a/src/packages/hub/package.json +++ b/src/packages/hub/package.json @@ -18,7 +18,6 @@ "@cocalc/static": "workspace:*", "@cocalc/util": "workspace:*", "@isaacs/ttlcache": "^1.4.1", - "@kubernetes/client-node": "^1.3.0", "@types/formidable": "^3.4.5", "async": "^1.5.2", "awaiting": "^3.0.0", diff --git a/src/packages/pnpm-lock.yaml b/src/packages/pnpm-lock.yaml index 65104c0ea3..1f2a83402f 100644 --- a/src/packages/pnpm-lock.yaml +++ b/src/packages/pnpm-lock.yaml @@ -747,9 +747,6 @@ importers: '@isaacs/ttlcache': specifier: ^1.4.1 version: 1.4.1 - '@kubernetes/client-node': - specifier: ^1.3.0 - version: 1.3.0(encoding@0.1.13) '@types/formidable': specifier: ^3.4.5 version: 3.4.5 @@ -787,8 +784,8 @@ importers: specifier: ^3.5.4 version: 3.5.4 http-proxy-3: - specifier: ^1.20.7 - version: 1.20.7 + specifier: ^1.20.8 + version: 1.20.8 lodash: specifier: ^4.17.21 version: 4.17.21 @@ -1216,9 +1213,6 @@ importers: '@isaacs/ttlcache': specifier: ^1.4.1 version: 1.4.1 - '@kubernetes/client-node': - specifier: ^1.3.0 - version: 1.3.0(encoding@0.1.13) '@langchain/anthropic': specifier: ^0.3.18 version: 0.3.24(@langchain/core@0.3.62(openai@4.104.0(encoding@0.1.13)(ws@8.18.3)(zod@3.25.67))) @@ -2994,18 +2988,6 @@ packages: '@js-sdsl/ordered-map@4.4.2': resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} - '@jsep-plugin/assignment@1.3.0': - resolution: {integrity: sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==} - engines: {node: '>= 10.16.0'} - peerDependencies: - jsep: ^0.4.0||^1.0.0 - - '@jsep-plugin/regex@1.0.4': - resolution: {integrity: sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==} - engines: {node: '>= 10.16.0'} - peerDependencies: - jsep: ^0.4.0||^1.0.0 - '@jsonjoy.com/base64@1.1.2': resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} engines: {node: '>=10.0'} @@ -3059,9 +3041,6 @@ packages: '@jupyterlab/statedb@4.4.0': resolution: {integrity: sha512-fjYfcJ08iq9DYRWg2qEuoq4gtIm+F9oU8x8tflKJ0UZZ+HpTQDRqChrWUCQ/nijymD8zs05BG3J63TUXlpTYnw==} - '@kubernetes/client-node@1.3.0': - resolution: {integrity: sha512-IE0yrIpOT97YS5fg2QpzmPzm8Wmcdf4ueWMn+FiJSI3jgTTQT1u+LUhoYpdfhdHAVxdrNsaBg2C0UXSnOgMoCQ==} - '@langchain/anthropic@0.3.24': resolution: {integrity: sha512-Gi1TwXu5vkCxUMToiXaiwTTWq9v3WMyU3ldB/VEWjzbkr3nKF5kcp+HLqhvV7WWOFVTTNgG+pzfq8JALecq5MA==} engines: {node: '>=18'} @@ -4398,12 +4377,12 @@ packages: '@types/node@18.19.115': resolution: {integrity: sha512-kNrFiTgG4a9JAn1LMQeLOv3MvXIPokzXziohMrMsvpYgLpdEt/mMiVYc4sGKtDfyxM5gIDF4VgrPRyCw4fHOYg==} - '@types/node@22.16.2': - resolution: {integrity: sha512-Cdqa/eJTvt4fC4wmq1Mcc0CPUjp/Qy2FGqLza3z3pKymsI969TcZ54diNJv8UYUgeWxyb8FSbCkhdR6WqmUFhA==} - '@types/node@24.0.10': resolution: {integrity: sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==} + '@types/node@24.0.13': + resolution: {integrity: sha512-Qm9OYVOFHFYg3wJoTSrz80hoec5Lia/dPp84do3X7dZvLikQvM1YpmvTBEdIr/e+U8HTkFjLHLnl78K/qjf+jQ==} + '@types/nodemailer@6.4.17': resolution: {integrity: sha512-I9CCaIp6DTldEg7vyUTZi8+9Vo0hi1/T8gv3C89yk1rSAAzoKQ8H8ki/jBYJSFoH/BisgLP8tkZMlQ91CIquww==} @@ -4502,9 +4481,6 @@ packages: '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - '@types/stream-buffers@3.0.7': - resolution: {integrity: sha512-azOCy05sXVXrO+qklf0c/B07H/oHaIuDDAiHPVwlk3A9Ek+ksHyTeMajLZl3r76FxpPpxem//4Te61G1iW3Giw==} - '@types/supercluster@7.1.3': resolution: {integrity: sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==} @@ -5031,9 +5007,6 @@ packages: axios@1.10.0: resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} - b4a@1.6.7: - resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} - babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5078,36 +5051,6 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bare-events@2.6.0: - resolution: {integrity: sha512-EKZ5BTXYExaNqi3I3f9RtEsaI/xBSGjE0XZCZilPzFAV/goswFHuPd9jEZlPIZ/iNZJwDSao9qRiScySz7MbQg==} - - bare-fs@4.1.6: - resolution: {integrity: sha512-25RsLF33BqooOEFNdMcEhMpJy8EoR88zSMrnOQOaM3USnOK2VmaJ1uaQEwPA6AQjrv1lXChScosN6CzbwbO9OQ==} - engines: {bare: '>=1.16.0'} - peerDependencies: - bare-buffer: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - - bare-os@3.6.1: - resolution: {integrity: sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==} - engines: {bare: '>=1.14.0'} - - bare-path@3.0.0: - resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - - bare-stream@2.6.5: - resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} - peerDependencies: - bare-buffer: '*' - bare-events: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - bare-events: - optional: true - base-64@1.0.0: resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} @@ -6791,9 +6734,6 @@ packages: resolution: {integrity: sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==} engines: {node: '>=6.0.0'} - fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -7367,10 +7307,6 @@ packages: hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} - hpagent@1.2.0: - resolution: {integrity: sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==} - engines: {node: '>=14'} - hsluv@0.0.3: resolution: {integrity: sha512-08iL2VyCRbkQKBySkSh6m8zMUa3sADAxGVWs3Z1aPcUkTJeK0ETG4Fc27tEmQBGUAXZjIsXOZqBvacuVNSC/fQ==} @@ -7450,8 +7386,8 @@ packages: http-parser-js@0.5.10: resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==} - http-proxy-3@1.20.7: - resolution: {integrity: sha512-WgtPGRfs3+QVf4chyW4Swh8F4Mhs/uvVBn91QDOKap59XCF8tvte3KRrMJdYi8BDWm3eoRIQJMBIi8RRHdxLIQ==} + http-proxy-3@1.20.8: + resolution: {integrity: sha512-RNAa6Q8QswRZPzApka8e/4K5LOawFsGNLrWe1RbDol7nubErRgzyJJ9tpb5MEE/TvdC3VdPdmln/Rid8qkJxCA==} engines: {node: '>=18'} http-proxy-agent@5.0.0: @@ -7923,11 +7859,6 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} - isomorphic-ws@5.0.0: - resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} - peerDependencies: - ws: '*' - isomorphic.js@0.2.5: resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} @@ -8156,9 +8087,6 @@ packages: node-notifier: optional: true - jose@6.0.11: - resolution: {integrity: sha512-QxG7EaliDARm1O1S8BGakqncGT9s25bKL1WSf6/oa17Tkqwi8D2ZNglqCF+DsYF88/rV66Q/Q2mFAy697E1DUg==} - jquery-focus-exit@1.0.1: resolution: {integrity: sha512-p79pTJKVsrYX4bZML+bc1MnRe9IrxcpIIeUqyfuVMpLFR4L05r7zxBe3YywPjn74hNavuOA2KNBhy36UXroMiA==} peerDependencies: @@ -8239,10 +8167,6 @@ packages: canvas: optional: true - jsep@1.4.0: - resolution: {integrity: sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==} - engines: {node: '>= 10.16.0'} - jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -8308,11 +8232,6 @@ packages: jsonify@0.0.1: resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} - jsonpath-plus@10.3.0: - resolution: {integrity: sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==} - engines: {node: '>=18.0.0'} - hasBin: true - jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} @@ -9063,9 +8982,6 @@ packages: nwsapi@2.2.20: resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} - oauth4webapi@3.5.5: - resolution: {integrity: sha512-1K88D2GiAydGblHo39NBro5TebGXa+7tYoyIbxvqv3+haDDry7CBE1eSYuNbOSsYCCU6y0gdynVZAkm4YPw4hg==} - oauth@0.10.2: resolution: {integrity: sha512-JtFnB+8nxDEXgNyniwz573xxbKSOu3R8D40xQKqcjwJ2CDkYqUDI53o6IuzDJBx60Z8VKCm271+t8iFjakrl8Q==} @@ -9168,9 +9084,6 @@ packages: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} hasBin: true - openid-client@6.6.2: - resolution: {integrity: sha512-Xya5TNMnnZuTM6DbHdB4q0S3ig2NTAELnii/ASie1xDEr8iiB8zZbO871OWBdrw++sd3hW6bqWjgcmSy1RTWHA==} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -10392,9 +10305,6 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfc4648@1.5.4: - resolution: {integrity: sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg==} - right-now@1.0.0: resolution: {integrity: sha512-DA8+YS+sMIVpbsuKgy+Z67L9Lxb1p05mNxRpDPNksPDEFir4vmBlUtuN9jkTGn9YMMdlBuK7XQgFiz6ws+yhSg==} @@ -10816,10 +10726,6 @@ packages: stream-browserify@3.0.0: resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} - stream-buffers@3.0.3: - resolution: {integrity: sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw==} - engines: {node: '>= 0.10.0'} - stream-events@1.0.5: resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} @@ -10833,9 +10739,6 @@ packages: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - streamx@2.22.1: - resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==} - string-convert@0.2.1: resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} @@ -11028,16 +10931,10 @@ packages: tar-fs@2.1.3: resolution: {integrity: sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==} - tar-fs@3.0.9: - resolution: {integrity: sha512-XF4w9Xp+ZQgifKakjZYmFdkLoSWd34VGKcsTCwlNWM7QG3ZbaxnTsaBwnjFZqHRf/rROxaR8rXnbtwdvaDI+lA==} - tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} - tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - tdigest@0.1.2: resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} @@ -11084,9 +10981,6 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} - text-decoder@1.2.3: - resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} - text-hex@1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} @@ -11405,9 +11299,6 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.8.0: resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} @@ -13023,7 +12914,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 18.19.115 + '@types/node': 24.0.10 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -13070,7 +12961,7 @@ snapshots: '@jest/fake-timers': 30.0.4 '@jest/types': 30.0.1 '@types/jsdom': 21.1.7 - '@types/node': 18.19.115 + '@types/node': 24.0.10 jest-mock: 30.0.2 jest-util: 30.0.2 jsdom: 26.1.0 @@ -13079,14 +12970,14 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.115 + '@types/node': 24.0.10 jest-mock: 29.7.0 '@jest/environment@30.0.4': dependencies: '@jest/fake-timers': 30.0.4 '@jest/types': 30.0.1 - '@types/node': 18.19.115 + '@types/node': 24.0.10 jest-mock: 30.0.2 '@jest/expect-utils@29.7.0': @@ -13104,7 +12995,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 18.19.115 + '@types/node': 24.0.10 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -13113,7 +13004,7 @@ snapshots: dependencies: '@jest/types': 30.0.1 '@sinonjs/fake-timers': 13.0.5 - '@types/node': 18.19.115 + '@types/node': 24.0.10 jest-message-util: 30.0.2 jest-mock: 30.0.2 jest-util: 30.0.2 @@ -13129,7 +13020,7 @@ snapshots: '@jest/pattern@30.0.1': dependencies: - '@types/node': 18.19.115 + '@types/node': 24.0.10 jest-regex-util: 30.0.1 '@jest/reporters@29.7.0': @@ -13140,7 +13031,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 18.19.115 + '@types/node': 24.0.10 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -13232,7 +13123,7 @@ snapshots: '@jest/schemas': 30.0.1 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 18.19.115 + '@types/node': 24.0.10 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -13277,14 +13168,6 @@ snapshots: '@js-sdsl/ordered-map@4.4.2': {} - '@jsep-plugin/assignment@1.3.0(jsep@1.4.0)': - dependencies: - jsep: 1.4.0 - - '@jsep-plugin/regex@1.0.4(jsep@1.4.0)': - dependencies: - jsep: 1.4.0 - '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': dependencies: tslib: 2.8.1 @@ -13426,31 +13309,6 @@ snapshots: '@lumino/properties': 2.0.3 '@lumino/signaling': 2.1.4 - '@kubernetes/client-node@1.3.0(encoding@0.1.13)': - dependencies: - '@types/js-yaml': 4.0.9 - '@types/node': 22.16.2 - '@types/node-fetch': 2.6.12 - '@types/stream-buffers': 3.0.7 - form-data: 4.0.2 - hpagent: 1.2.0 - isomorphic-ws: 5.0.0(ws@8.18.3) - js-yaml: 4.1.0 - jsonpath-plus: 10.3.0 - node-fetch: 2.7.0(encoding@0.1.13) - openid-client: 6.6.2 - rfc4648: 1.5.4 - socks-proxy-agent: 8.0.5 - stream-buffers: 3.0.3 - tar-fs: 3.0.9 - ws: 8.18.3 - transitivePeerDependencies: - - bare-buffer - - bufferutil - - encoding - - supports-color - - utf-8-validate - '@langchain/anthropic@0.3.24(@langchain/core@0.3.62(openai@4.104.0(encoding@0.1.13)(ws@8.18.3)(zod@3.25.67)))': dependencies: '@anthropic-ai/sdk': 0.56.0 @@ -14850,7 +14708,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 18.19.115 + '@types/node': 24.0.10 '@types/hast@2.3.10': dependencies: @@ -14902,7 +14760,7 @@ snapshots: '@types/jsdom@21.1.7': dependencies: - '@types/node': 18.19.115 + '@types/node': 24.0.10 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 @@ -14974,11 +14832,11 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@22.16.2': + '@types/node@24.0.10': dependencies: - undici-types: 6.21.0 + undici-types: 7.8.0 - '@types/node@24.0.10': + '@types/node@24.0.13': dependencies: undici-types: 7.8.0 @@ -15105,10 +14963,6 @@ snapshots: '@types/stack-utils@2.0.3': {} - '@types/stream-buffers@3.0.7': - dependencies: - '@types/node': 18.19.115 - '@types/supercluster@7.1.3': dependencies: '@types/geojson': 7946.0.16 @@ -15722,8 +15576,6 @@ snapshots: transitivePeerDependencies: - debug - b4a@1.6.7: {} - babel-jest@29.7.0(@babel/core@7.26.9): dependencies: '@babel/core': 7.26.9 @@ -15797,31 +15649,6 @@ snapshots: balanced-match@1.0.2: {} - bare-events@2.6.0: - optional: true - - bare-fs@4.1.6: - dependencies: - bare-events: 2.6.0 - bare-path: 3.0.0 - bare-stream: 2.6.5(bare-events@2.6.0) - optional: true - - bare-os@3.6.1: - optional: true - - bare-path@3.0.0: - dependencies: - bare-os: 3.6.1 - optional: true - - bare-stream@2.6.5(bare-events@2.6.0): - dependencies: - streamx: 2.22.1 - optionalDependencies: - bare-events: 2.6.0 - optional: true - base-64@1.0.0: {} base16@1.0.0: {} @@ -17854,8 +17681,6 @@ snapshots: fast-equals@5.2.2: {} - fast-fifo@1.3.2: {} - fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -18627,8 +18452,6 @@ snapshots: readable-stream: 2.3.8 wbuf: 1.7.3 - hpagent@1.2.0: {} - hsluv@0.0.3: {} html-dom-parser@5.1.1: @@ -18733,7 +18556,7 @@ snapshots: http-parser-js@0.5.10: {} - http-proxy-3@1.20.7: + http-proxy-3@1.20.8: dependencies: debug: 4.4.1 follow-redirects: 1.15.9(debug@4.4.1) @@ -19153,10 +18976,6 @@ snapshots: isobject@3.0.1: {} - isomorphic-ws@5.0.0(ws@8.18.3): - dependencies: - ws: 8.18.3 - isomorphic.js@0.2.5: {} istanbul-lib-coverage@3.2.2: {} @@ -19242,7 +19061,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.115 + '@types/node': 24.0.10 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.3 @@ -19403,7 +19222,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.115 + '@types/node': 24.0.10 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -19415,7 +19234,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 18.19.115 + '@types/node': 24.0.10 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -19485,13 +19304,13 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 18.19.115 + '@types/node': 24.0.10 jest-util: 29.7.0 jest-mock@30.0.2: dependencies: '@jest/types': 30.0.1 - '@types/node': 18.19.115 + '@types/node': 24.0.10 jest-util: 30.0.2 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -19530,7 +19349,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.115 + '@types/node': 24.0.10 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -19558,7 +19377,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.115 + '@types/node': 24.0.10 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.2 @@ -19613,7 +19432,7 @@ snapshots: jest-util@30.0.2: dependencies: '@jest/types': 30.0.1 - '@types/node': 18.19.115 + '@types/node': 24.0.10 chalk: 4.1.2 ci-info: 4.2.0 graceful-fs: 4.2.11 @@ -19632,7 +19451,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.115 + '@types/node': 24.0.10 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -19641,13 +19460,13 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 18.19.115 + '@types/node': 24.0.13 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 18.19.115 + '@types/node': 24.0.10 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -19676,8 +19495,6 @@ snapshots: - supports-color - ts-node - jose@6.0.11: {} - jquery-focus-exit@1.0.1(jquery@3.7.1): dependencies: jquery: 3.7.1 @@ -19768,8 +19585,6 @@ snapshots: - supports-color - utf-8-validate - jsep@1.4.0: {} - jsesc@3.1.0: {} json-bigint@1.0.0: @@ -19830,12 +19645,6 @@ snapshots: jsonify@0.0.1: {} - jsonpath-plus@10.3.0: - dependencies: - '@jsep-plugin/assignment': 1.3.0(jsep@1.4.0) - '@jsep-plugin/regex': 1.0.4(jsep@1.4.0) - jsep: 1.4.0 - jsonpointer@5.0.1: {} jsonwebtoken@9.0.2: @@ -20688,8 +20497,6 @@ snapshots: nwsapi@2.2.20: {} - oauth4webapi@3.5.5: {} - oauth@0.10.2: {} oauth@0.9.15: {} @@ -20792,11 +20599,6 @@ snapshots: opener@1.5.2: {} - openid-client@6.6.2: - dependencies: - jose: 6.0.11 - oauth4webapi: 3.5.5 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -22333,8 +22135,6 @@ snapshots: reusify@1.0.4: {} - rfc4648@1.5.4: {} - right-now@1.0.0: {} rimraf@2.4.5: @@ -22858,8 +22658,6 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - stream-buffers@3.0.3: {} - stream-events@1.0.5: dependencies: stubs: 3.0.0 @@ -22874,13 +22672,6 @@ snapshots: streamsearch@1.1.0: {} - streamx@2.22.1: - dependencies: - fast-fifo: 1.3.2 - text-decoder: 1.2.3 - optionalDependencies: - bare-events: 2.6.0 - string-convert@0.2.1: {} string-length@4.0.2: @@ -23100,16 +22891,6 @@ snapshots: pump: 3.0.2 tar-stream: 2.2.0 - tar-fs@3.0.9: - dependencies: - pump: 3.0.2 - tar-stream: 3.1.7 - optionalDependencies: - bare-fs: 4.1.6 - bare-path: 3.0.0 - transitivePeerDependencies: - - bare-buffer - tar-stream@2.2.0: dependencies: bl: 4.1.0 @@ -23118,12 +22899,6 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - tar-stream@3.1.7: - dependencies: - b4a: 1.6.7 - fast-fifo: 1.3.2 - streamx: 2.22.1 - tdigest@0.1.2: dependencies: bintrees: 1.0.2 @@ -23191,10 +22966,6 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 - text-decoder@1.2.3: - dependencies: - b4a: 1.6.7 - text-hex@1.0.0: {} text-table@0.2.0: {} @@ -23483,8 +23254,6 @@ snapshots: undici-types@5.26.5: {} - undici-types@6.21.0: {} - undici-types@7.8.0: {} unicorn-magic@0.1.0: {} diff --git a/src/packages/server/conat/socketio/dns-scan-k8s-api.ts b/src/packages/server/conat/socketio/dns-scan-k8s-api.ts index e7bf2eabde..a8ffeafa3a 100644 --- a/src/packages/server/conat/socketio/dns-scan-k8s-api.ts +++ b/src/packages/server/conat/socketio/dns-scan-k8s-api.ts @@ -1,35 +1,100 @@ -import * as k8s from "@kubernetes/client-node"; -import { readFileSync } from "fs"; +import * as fs from "fs"; +import * as https from "https"; -const kc = new k8s.KubeConfig(); -kc.loadFromCluster(); +// Define the options interface for type safety +interface ListPodsOptions { + labelSelector?: string; // e.g. "app=foo,env=prod" +} + +const NAMESPACE: string = fs + .readFileSync( + "/var/run/secrets/kubernetes.io/serviceaccount/namespace", + "utf8", + ) + .trim(); +const CA: Buffer = fs.readFileSync( + "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt", +); + +async function listPods(options: ListPodsOptions = {}): Promise { + try { + // Read service account details, token could be rotated + const token = fs + .readFileSync( + "/var/run/secrets/kubernetes.io/serviceaccount/token", + "utf8", + ) + .trim(); -const k8sApi = kc.makeApiClient(k8s.CoreV1Api); + // Base API path + let path = `/api/v1/namespaces/${NAMESPACE}/pods`; -// Read the namespace the pod is running in -const namespace = readFileSync( - "/var/run/secrets/kubernetes.io/serviceaccount/namespace", - "utf8", -).trim(); + const queryParams: string[] = []; + if (options.labelSelector) { + queryParams.push( + `labelSelector=${encodeURIComponent(options.labelSelector)}`, + ); + } + + if (queryParams.length > 0) { + path += `?${queryParams.join("&")}`; + } + + const query: https.RequestOptions = { + hostname: "kubernetes.default.svc", + path, + method: "GET", + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + ca: [CA], + }; + + return new Promise((resolve, reject) => { + const req = https.request(query, (res) => { + let data = ""; + res.on("data", (chunk) => { + data += chunk; + }); + res.on("end", () => { + if (res.statusCode !== 200) { + reject( + new Error( + `K8S API request failed. status=${res.statusCode}: ${data}`, + ), + ); + } else { + try { + resolve(JSON.parse(data)); + } catch (parseError) { + reject(parseError); + } + } + }); + }); + + req.on("error", (error) => reject(error)); + req.end(); + }); + } catch (error) { + throw new Error( + `Failed to read service account files: ${(error as Error).message}`, + ); + } +} export async function getAddressesFromK8sApi(): Promise< { name: string; podIP: string }[] > { - try { - const labelSelector = "run=hub-conat-router"; - const res = await k8sApi.listNamespacedPod({ namespace, labelSelector }); - - const ret: { name: string; podIP: string }[] = []; - for (const pod of res.items) { - const name = pod.metadata?.name; - const podIP = pod.status?.podIP; - if (name && podIP) { - ret.push({ name, podIP }); - } + const res = await listPods({ labelSelector: "run=hub-conat-router" }); + const ret: { name: string; podIP: string }[] = []; + for (const pod of res.items) { + const name = pod.metadata?.name; + const podIP = pod.status?.podIP; + if (name && podIP) { + ret.push({ name, podIP }); } - return ret; - } catch (err) { - console.error("Error fetching addresses from Kubernetes API:", err); - return []; } + return ret; } diff --git a/src/packages/server/package.json b/src/packages/server/package.json index 25300505eb..10173819ce 100644 --- a/src/packages/server/package.json +++ b/src/packages/server/package.json @@ -56,7 +56,6 @@ "@google-cloud/storage-transfer": "^3.3.0", "@google/generative-ai": "^0.14.0", "@isaacs/ttlcache": "^1.4.1", - "@kubernetes/client-node": "^1.3.0", "@langchain/anthropic": "^0.3.18", "@langchain/core": "^0.3.46", "@langchain/google-genai": "^0.2.4",