diff --git a/bun.lock b/bun.lock index 79b3852..423deff 100644 --- a/bun.lock +++ b/bun.lock @@ -7,24 +7,15 @@ "prettier": "^3.5.1", }, }, - "packages/commons": { - "name": "commons", - "dependencies": { - "@noble/hashes": "^1.7.1", - "nostr-tools": "^2.10.4", - }, - "devDependencies": { - "@types/bun": "latest", - }, - "peerDependencies": { - "typescript": "^5.0.0", - }, - }, "packages/dvmcp-bridge": { - "name": "mcp-dvm-bridge", + "name": "@dvmcp/bridge", + "version": "0.1.0", + "bin": { + "dvmcp-bridge": "./cli.ts", + }, "dependencies": { + "@dvmcp/commons": "^0.1.0", "@modelcontextprotocol/sdk": "^1.4.1", - "commons": "workspace:*", "dotenv": "^16.4.7", "nostr-tools": "^2.10.4", "yaml": "^2.7.0", @@ -36,11 +27,22 @@ "typescript": "^5.0.0", }, }, + "packages/dvmcp-commons": { + "name": "@dvmcp/commons", + "version": "0.1.0", + "peerDependencies": { + "typescript": "^5.0.0", + }, + }, "packages/dvmcp-discovery": { - "name": "dvmcp-discovery", + "name": "@dvmcp/discovery", + "version": "0.1.0", + "bin": { + "dvmcp-discovery": "./cli.ts", + }, "dependencies": { + "@dvmcp/commons": "^0.1.0", "@modelcontextprotocol/sdk": "^1.5.0", - "commons": "workspace:*", "nostr-tools": "^2.10.4", }, "devDependencies": { @@ -52,13 +54,19 @@ }, }, "packages": { - "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.5.0", "", { "dependencies": { "content-type": "^1.0.5", "eventsource": "^3.0.2", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-IJ+5iVVs8FCumIHxWqpwgkwOzyhtHVKy45s6Ug7Dv0MfRpaYisH8QQ87rIWeWdOzlk8sfhitZ7HCyQZk7d6b8w=="], + "@dvmcp/bridge": ["@dvmcp/bridge@workspace:packages/dvmcp-bridge"], + + "@dvmcp/commons": ["@dvmcp/commons@workspace:packages/dvmcp-commons"], + + "@dvmcp/discovery": ["@dvmcp/discovery@workspace:packages/dvmcp-discovery"], + + "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.6.1", "", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^4.1.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-oxzMzYCkZHMntzuyerehK3fV6A2Kwh5BD6CGEJSVDU2QNEhfLOptf2X7esQgaHZXHZY0oHmMsOtIDLP71UJXgA=="], "@noble/ciphers": ["@noble/ciphers@0.5.3", "", {}, "sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w=="], "@noble/curves": ["@noble/curves@1.2.0", "", { "dependencies": { "@noble/hashes": "1.3.2" } }, "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw=="], - "@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], + "@noble/hashes": ["@noble/hashes@1.3.1", "", {}, "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA=="], "@scure/base": ["@scure/base@1.1.1", "", {}, "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA=="], @@ -66,65 +74,181 @@ "@scure/bip39": ["@scure/bip39@1.2.1", "", { "dependencies": { "@noble/hashes": "~1.3.0", "@scure/base": "~1.1.0" } }, "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg=="], - "@types/bun": ["@types/bun@1.2.2", "", { "dependencies": { "bun-types": "1.2.2" } }, "sha512-tr74gdku+AEDN5ergNiBnplr7hpDp3V1h7fqI2GcR/rsUaM39jpSeKH0TFibRvU0KwniRx5POgaYnaXbk0hU+w=="], + "@types/bun": ["@types/bun@1.2.4", "", { "dependencies": { "bun-types": "1.2.4" } }, "sha512-QtuV5OMR8/rdKJs213iwXDpfVvnskPXY/S0ZiFbsTjQZycuqPbMW8Gf/XhLfwE5njW8sxI2WjISURXPlHypMFA=="], - "@types/node": ["@types/node@22.13.4", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg=="], + "@types/node": ["@types/node@22.13.5", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg=="], "@types/ws": ["@types/ws@8.5.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw=="], - "bun-types": ["bun-types@1.2.2", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-RCbMH5elr9gjgDGDhkTTugA21XtJAy/9jkKe/G3WR2q17VPGhcquf9Sir6uay9iW+7P/BV0CAHA1XlHXMAVKHg=="], + "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], + + "body-parser": ["body-parser@2.1.0", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.0", "http-errors": "^2.0.0", "iconv-lite": "^0.5.2", "on-finished": "^2.4.1", "qs": "^6.14.0", "raw-body": "^3.0.0", "type-is": "^2.0.0" } }, "sha512-/hPxh61E+ll0Ujp24Ilm64cykicul1ypfwjVttduAiEdtnJFvLePSrIPk+HMImtNv5270wOGCb1Tns2rybMkoQ=="], + + "bun-types": ["bun-types@1.2.4", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-nDPymR207ZZEoWD4AavvEaa/KZe/qlrbMSchqpQwovPZCKc7pwMoENjEtHgMKaAjJhy+x6vfqSBA1QU3bJgs0Q=="], "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], - "commons": ["commons@workspace:packages/commons"], + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.3", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "get-intrinsic": "^1.2.6" } }, "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA=="], + + "content-disposition": ["content-disposition@1.0.0", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg=="], "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], + "cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="], + + "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], + + "cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="], + + "debug": ["debug@4.3.6", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg=="], + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], + "dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="], - "dvmcp-discovery": ["dvmcp-discovery@workspace:packages/dvmcp-discovery"], + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], "eventsource": ["eventsource@3.0.5", "", { "dependencies": { "eventsource-parser": "^3.0.0" } }, "sha512-LT/5J605bx5SNyE+ITBDiM3FxffBiq9un7Vx0EwMDM3vg8sWKx/tO2zC+LMqZ+smAM0F2hblaDZUVZF0te2pSw=="], "eventsource-parser": ["eventsource-parser@3.0.0", "", {}, "sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA=="], + "express": ["express@5.0.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.0.1", "content-disposition": "^1.0.0", "content-type": "~1.0.4", "cookie": "0.7.1", "cookie-signature": "^1.2.1", "debug": "4.3.6", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "^2.0.0", "fresh": "2.0.0", "http-errors": "2.0.0", "merge-descriptors": "^2.0.0", "methods": "~1.1.2", "mime-types": "^3.0.0", "on-finished": "2.4.1", "once": "1.4.0", "parseurl": "~1.3.3", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", "router": "^2.0.0", "safe-buffer": "5.2.1", "send": "^1.1.0", "serve-static": "^2.1.0", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "^2.0.0", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-ORF7g6qGnD+YtUG9yx4DFoqCShNMmUKiXuT5oWMHiOvt/4WFbHC6yCwQMTSBMno7AqntNCAzzcnnjowRkTL9eQ=="], + + "express-rate-limit": ["express-rate-limit@7.5.0", "", { "peerDependencies": { "express": "^4.11 || 5 || ^5.0.0-beta.1" } }, "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg=="], + + "finalhandler": ["finalhandler@2.0.0", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" } }, "sha512-MX6Zo2adDViYh+GcxxB1dpO43eypOGUOL12rLCOTMQv/DfIbpSJUy4oQIIZhVZkH9e+bZWKMon0XHFEju16tkQ=="], + + "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + + "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], - "mcp-dvm-bridge": ["mcp-dvm-bridge@workspace:packages/dvmcp-bridge"], + "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], + + "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], + + "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], + + "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], + + "mime-db": ["mime-db@1.53.0", "", {}, "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg=="], + + "mime-types": ["mime-types@3.0.0", "", { "dependencies": { "mime-db": "^1.53.0" } }, "sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w=="], + + "ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], + + "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], "nostr-tools": ["nostr-tools@2.10.4", "", { "dependencies": { "@noble/ciphers": "^0.5.1", "@noble/curves": "1.2.0", "@noble/hashes": "1.3.1", "@scure/base": "1.1.1", "@scure/bip32": "1.3.1", "@scure/bip39": "1.2.1" }, "optionalDependencies": { "nostr-wasm": "0.1.0" }, "peerDependencies": { "typescript": ">=5.0.0" }, "optionalPeers": ["typescript"] }, "sha512-biU7sk+jxHgVASfobg2T5ttxOGGSt69wEVBC51sHHOEaKAAdzHBLV/I2l9Rf61UzClhliZwNouYhqIso4a3HYg=="], "nostr-wasm": ["nostr-wasm@0.1.0", "", {}, "sha512-78BTryCLcLYv96ONU8Ws3Q1JzjlAt+43pWQhIl86xZmWeegYCNLPml7yQ+gG3vR6V5h4XGj+TxO+SS5dsThQIA=="], - "prettier": ["prettier@3.5.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw=="], + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "path-to-regexp": ["path-to-regexp@8.2.0", "", {}, "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ=="], + + "pkce-challenge": ["pkce-challenge@4.1.0", "", {}, "sha512-ZBmhE1C9LcPoH9XZSdwiPtbPHZROwAnMy+kIFQVrnMCxY4Cudlz3gBOpzilgc0jOgRaiT3sIWfpMomW2ar2orQ=="], + + "prettier": ["prettier@3.5.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg=="], + + "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + + "qs": ["qs@6.13.0", "", { "dependencies": { "side-channel": "^1.0.6" } }, "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg=="], + + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], "raw-body": ["raw-body@3.0.0", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.6.3", "unpipe": "1.0.0" } }, "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g=="], + "router": ["router@2.1.0", "", { "dependencies": { "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-/m/NSLxeYEgWNtyC+WtNHCF7jbGxOibVWKnn+1Psff4dJGOfoXP+MuC/f2CwSmyiHdOIzYnYFp4W6GxWfekaLA=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + "send": ["send@1.1.0", "", { "dependencies": { "debug": "^4.3.5", "destroy": "^1.2.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^0.5.2", "http-errors": "^2.0.0", "mime-types": "^2.1.35", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.1" } }, "sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA=="], + + "serve-static": ["serve-static@2.1.0", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.0.0" } }, "sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA=="], + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + "type-is": ["type-is@2.0.0", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw=="], + "typescript": ["typescript@5.7.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw=="], "undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], + + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + "yaml": ["yaml@2.7.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA=="], "zod": ["zod@3.24.2", "", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="], - "zod-to-json-schema": ["zod-to-json-schema@3.24.1", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w=="], + "zod-to-json-schema": ["zod-to-json-schema@3.24.3", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A=="], "@noble/curves/@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="], @@ -132,10 +256,28 @@ "@scure/bip32/@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="], - "@scure/bip39/@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="], + "body-parser/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], - "nostr-tools/@noble/hashes": ["@noble/hashes@1.3.1", "", {}, "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA=="], + "body-parser/iconv-lite": ["iconv-lite@0.5.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag=="], + + "body-parser/qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="], + + "finalhandler/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "finalhandler/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + + "send/fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], + + "send/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "send/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], "@scure/bip32/@noble/curves/@noble/hashes": ["@noble/hashes@1.3.1", "", {}, "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA=="], + + "body-parser/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "send/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], } } diff --git a/package.json b/package.json index d235898..bfdcb96 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,11 @@ "name": "dvmcp", "scripts": { "start:mcp-dvm": "cd packages/mcp-dvm-bridge && bun start", - "format": "prettier --write \"packages/**/*.{ts,tsx,js,jsx,json,md}\"" + "format": "prettier --write \"packages/**/*.{ts,tsx,js,jsx,json,md}\"", + "publish:commons": "cd packages/commons && npm publish --access public", + "publish:bridge": "cd packages/dvmcp-bridge && npm publish --access public", + "publish:discovery": "cd packages/dvmcp-discovery && npm publish --access public", + "publish:all": "npm run publish:commons && npm run publish:bridge && npm run publish:discovery" }, "workspaces": [ "packages/*" diff --git a/packages/commons/package.json b/packages/commons/package.json deleted file mode 100644 index 1533d91..0000000 --- a/packages/commons/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "commons", - "type": "module", - "devDependencies": { - "@types/bun": "latest" - }, - "peerDependencies": { - "typescript": "^5.0.0" - }, - "dependencies": { - "@noble/hashes": "^1.7.1", - "nostr-tools": "^2.10.4" - } -} diff --git a/packages/dvmcp-bridge/.npmignore b/packages/dvmcp-bridge/.npmignore new file mode 100644 index 0000000..5cdffbc --- /dev/null +++ b/packages/dvmcp-bridge/.npmignore @@ -0,0 +1,7 @@ +node_modules +*.log +*.lock +.DS_Store +*.test.ts +*.test.js +config.yml \ No newline at end of file diff --git a/packages/dvmcp-bridge/cli.ts b/packages/dvmcp-bridge/cli.ts new file mode 100755 index 0000000..0691c21 --- /dev/null +++ b/packages/dvmcp-bridge/cli.ts @@ -0,0 +1,31 @@ +#!/usr/bin/env bun +import { join, dirname } from 'node:path'; +import { existsSync, copyFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; + +// Ensure we can run from any directory +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +process.chdir(__dirname); + +// Check for config file +const configPath = join(process.cwd(), 'config.yml'); +const configExamplePath = join(process.cwd(), 'config.example.yml'); + +if (!existsSync(configPath)) { + console.log('Configuration file not found at config.yml'); + console.log('You can create one by copying the example:'); + console.log('cp config.example.yml config.yml'); + + // Automatically copy example config if it exists + if (existsSync(configExamplePath)) { + console.log('Creating config.yml from example...'); + copyFileSync(configExamplePath, configPath); + console.log( + '✅ Created config.yml - please edit this file with your settings!' + ); + } +} + +// Run the application +import './index.js'; diff --git a/packages/dvmcp-bridge/package.json b/packages/dvmcp-bridge/package.json index 46c83c9..66bc646 100644 --- a/packages/dvmcp-bridge/package.json +++ b/packages/dvmcp-bridge/package.json @@ -1,15 +1,28 @@ { - "name": "dvmcp-bridge", + "name": "@dvmcp/bridge", + "version": "0.1.0", + "description": "Bridge connecting MCP servers to Nostr's DVM ecosystem", "module": "index.ts", "type": "module", "license": "MIT", + "bin": { + "dvmcp-bridge": "./cli.ts" + }, + "files": [ + "**/*.ts", + "**/*.js", + "!**/*.test.ts", + "!**/*.test.js", + "config.example.yml" + ], "scripts": { "format": "prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\"", "dev": "bun --watch index.ts", "start": "bun run index.ts", "typecheck": "tsc --noEmit", "lint": "bun run typecheck && bun run format", - "test": "bun test" + "test": "bun test", + "prepublishOnly": "bun run lint && bun run test" }, "devDependencies": { "@types/bun": "latest" @@ -22,6 +35,9 @@ "dotenv": "^16.4.7", "nostr-tools": "^2.10.4", "yaml": "^2.7.0", - "commons": "workspace:*" + "@dvmcp/commons": "^0.1.0" + }, + "publishConfig": { + "access": "public" } } diff --git a/packages/dvmcp-bridge/src/announcer.ts b/packages/dvmcp-bridge/src/announcer.ts index 48db906..5044428 100644 --- a/packages/dvmcp-bridge/src/announcer.ts +++ b/packages/dvmcp-bridge/src/announcer.ts @@ -1,9 +1,12 @@ -import type { RelayHandler } from 'commons/nostr/relay-handler'; +import type { RelayHandler } from '@dvmcp/commons/nostr/relay-handler'; import { CONFIG } from './config'; -import { createKeyManager } from 'commons/nostr/key-manager'; +import { createKeyManager } from '@dvmcp/commons/nostr/key-manager'; import type { MCPPool } from './mcp-pool'; import { relayHandler } from './relay'; -import { DVM_ANNOUNCEMENT_KIND, TOOL_REQUEST_KIND } from 'commons/constants'; +import { + DVM_ANNOUNCEMENT_KIND, + TOOL_REQUEST_KIND, +} from '@dvmcp/commons/constants'; export const keyManager = createKeyManager(CONFIG.nostr.privateKey); diff --git a/packages/dvmcp-bridge/src/config.ts b/packages/dvmcp-bridge/src/config.ts index 8f8974f..7989a89 100644 --- a/packages/dvmcp-bridge/src/config.ts +++ b/packages/dvmcp-bridge/src/config.ts @@ -1,7 +1,7 @@ import { parse } from 'yaml'; import { join } from 'path'; import { existsSync, readFileSync } from 'fs'; -import { HEX_KEYS_REGEX } from 'commons/constants'; +import { HEX_KEYS_REGEX } from '@dvmcp/commons/constants'; import type { AppConfig, MCPServerConfig } from './types'; const CONFIG_PATH = join(process.cwd(), 'config.yml'); diff --git a/packages/dvmcp-bridge/src/dvm-bridge.ts b/packages/dvmcp-bridge/src/dvm-bridge.ts index a618520..576ae81 100644 --- a/packages/dvmcp-bridge/src/dvm-bridge.ts +++ b/packages/dvmcp-bridge/src/dvm-bridge.ts @@ -2,13 +2,13 @@ import { keyManager, NostrAnnouncer } from './announcer'; import type { Event } from 'nostr-tools/pure'; import { CONFIG } from './config'; import { MCPPool } from './mcp-pool'; -import { RelayHandler } from 'commons/nostr/relay-handler'; +import { RelayHandler } from '@dvmcp/commons/nostr/relay-handler'; import { relayHandler } from './relay'; import { DVM_NOTICE_KIND, TOOL_REQUEST_KIND, TOOL_RESPONSE_KIND, -} from 'commons/constants'; +} from '@dvmcp/commons/constants'; export class DVMBridge { private mcpPool: MCPPool; diff --git a/packages/dvmcp-bridge/src/keys.test.ts b/packages/dvmcp-bridge/src/keys.test.ts index ba43861..3d5d1d6 100644 --- a/packages/dvmcp-bridge/src/keys.test.ts +++ b/packages/dvmcp-bridge/src/keys.test.ts @@ -1,5 +1,5 @@ import { expect, test, describe } from 'bun:test'; -import { createKeyManager } from 'commons/nostr/key-manager'; +import { createKeyManager } from '@dvmcp/commons/nostr/key-manager'; describe('KeyManager', () => { const testPrivateKey = diff --git a/packages/dvmcp-bridge/src/mcp-pool.test.ts b/packages/dvmcp-bridge/src/mcp-pool.test.ts index a67305f..55ab2e1 100644 --- a/packages/dvmcp-bridge/src/mcp-pool.test.ts +++ b/packages/dvmcp-bridge/src/mcp-pool.test.ts @@ -2,7 +2,7 @@ import { expect, test, describe, beforeAll, afterAll } from 'bun:test'; import { join } from 'path'; import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js'; import { MCPPool } from './mcp-pool'; -import { createMockServer } from 'commons/mock-server'; +import { createMockServer } from '@dvmcp/commons/mock-server'; describe('MCPPool', () => { let mcpPool: MCPPool; diff --git a/packages/dvmcp-bridge/src/relay.ts b/packages/dvmcp-bridge/src/relay.ts index 8182485..eb2b3aa 100644 --- a/packages/dvmcp-bridge/src/relay.ts +++ b/packages/dvmcp-bridge/src/relay.ts @@ -1,4 +1,4 @@ -import { RelayHandler } from 'commons/nostr/relay-handler'; +import { RelayHandler } from '@dvmcp/commons/nostr/relay-handler'; import { CONFIG } from './config'; export const relayHandler = new RelayHandler(CONFIG.nostr.relayUrls); diff --git a/packages/commons/.gitignore b/packages/dvmcp-commons/.gitignore similarity index 100% rename from packages/commons/.gitignore rename to packages/dvmcp-commons/.gitignore diff --git a/packages/dvmcp-commons/.npmignore b/packages/dvmcp-commons/.npmignore new file mode 100644 index 0000000..5fd3ffc --- /dev/null +++ b/packages/dvmcp-commons/.npmignore @@ -0,0 +1,6 @@ +node_modules +*.log +*.lock +.DS_Store +*.test.ts +*.test.js \ No newline at end of file diff --git a/packages/commons/README.md b/packages/dvmcp-commons/README.md similarity index 100% rename from packages/commons/README.md rename to packages/dvmcp-commons/README.md diff --git a/packages/commons/constants.ts b/packages/dvmcp-commons/constants.ts similarity index 100% rename from packages/commons/constants.ts rename to packages/dvmcp-commons/constants.ts diff --git a/packages/commons/mock-server.ts b/packages/dvmcp-commons/mock-server.ts similarity index 100% rename from packages/commons/mock-server.ts rename to packages/dvmcp-commons/mock-server.ts diff --git a/packages/commons/nostr/key-manager.ts b/packages/dvmcp-commons/nostr/key-manager.ts similarity index 100% rename from packages/commons/nostr/key-manager.ts rename to packages/dvmcp-commons/nostr/key-manager.ts diff --git a/packages/commons/nostr/mock-relay.ts b/packages/dvmcp-commons/nostr/mock-relay.ts similarity index 100% rename from packages/commons/nostr/mock-relay.ts rename to packages/dvmcp-commons/nostr/mock-relay.ts diff --git a/packages/commons/nostr/relay-handler.ts b/packages/dvmcp-commons/nostr/relay-handler.ts similarity index 100% rename from packages/commons/nostr/relay-handler.ts rename to packages/dvmcp-commons/nostr/relay-handler.ts diff --git a/packages/dvmcp-commons/package.json b/packages/dvmcp-commons/package.json new file mode 100644 index 0000000..f120b23 --- /dev/null +++ b/packages/dvmcp-commons/package.json @@ -0,0 +1,26 @@ +{ + "name": "@dvmcp/commons", + "version": "0.1.0", + "description": "Shared utilities for DVMCP packages", + "type": "module", + "exports": { + "./*": "./*.ts", + "./*/*": "./*/*.ts" + }, + "files": [ + "**/*.ts", + "**/*.js", + "!**/*.test.ts", + "!**/*.test.js" + ], + "scripts": { + "format": "prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\"", + "typecheck": "tsc --noEmit" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/commons/tsconfig.json b/packages/dvmcp-commons/tsconfig.json similarity index 100% rename from packages/commons/tsconfig.json rename to packages/dvmcp-commons/tsconfig.json diff --git a/packages/dvmcp-discovery/.npmignore b/packages/dvmcp-discovery/.npmignore new file mode 100644 index 0000000..5cdffbc --- /dev/null +++ b/packages/dvmcp-discovery/.npmignore @@ -0,0 +1,7 @@ +node_modules +*.log +*.lock +.DS_Store +*.test.ts +*.test.js +config.yml \ No newline at end of file diff --git a/packages/dvmcp-discovery/cli.ts b/packages/dvmcp-discovery/cli.ts new file mode 100755 index 0000000..0691c21 --- /dev/null +++ b/packages/dvmcp-discovery/cli.ts @@ -0,0 +1,31 @@ +#!/usr/bin/env bun +import { join, dirname } from 'node:path'; +import { existsSync, copyFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; + +// Ensure we can run from any directory +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +process.chdir(__dirname); + +// Check for config file +const configPath = join(process.cwd(), 'config.yml'); +const configExamplePath = join(process.cwd(), 'config.example.yml'); + +if (!existsSync(configPath)) { + console.log('Configuration file not found at config.yml'); + console.log('You can create one by copying the example:'); + console.log('cp config.example.yml config.yml'); + + // Automatically copy example config if it exists + if (existsSync(configExamplePath)) { + console.log('Creating config.yml from example...'); + copyFileSync(configExamplePath, configPath); + console.log( + '✅ Created config.yml - please edit this file with your settings!' + ); + } +} + +// Run the application +import './index.js'; diff --git a/packages/dvmcp-discovery/package.json b/packages/dvmcp-discovery/package.json index 0e363aa..ffdb45b 100644 --- a/packages/dvmcp-discovery/package.json +++ b/packages/dvmcp-discovery/package.json @@ -1,14 +1,27 @@ { - "name": "dvmcp-discovery", + "name": "@dvmcp/discovery", + "version": "0.1.0", + "description": "Discovery service for MCP tools in the Nostr DVM ecosystem", "module": "index.ts", "type": "module", + "bin": { + "dvmcp-discovery": "./cli.ts" + }, + "files": [ + "**/*.ts", + "**/*.js", + "!**/*.test.ts", + "!**/*.test.js", + "config.example.yml" + ], "scripts": { "format": "prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\"", "dev": "bun --watch index.ts", "start": "bun run index.ts", "typecheck": "tsc --noEmit", "lint": "bun run typecheck && bun run format", - "test": "bun test" + "test": "bun test", + "prepublishOnly": "bun run lint && bun run test" }, "devDependencies": { "@types/bun": "latest" @@ -19,6 +32,9 @@ "dependencies": { "@modelcontextprotocol/sdk": "^1.5.0", "nostr-tools": "^2.10.4", - "commons": "workspace:*" + "@dvmcp/commons": "^0.1.0" + }, + "publishConfig": { + "access": "public" } } diff --git a/packages/dvmcp-discovery/src/config.ts b/packages/dvmcp-discovery/src/config.ts index 5c073ca..ea28794 100644 --- a/packages/dvmcp-discovery/src/config.ts +++ b/packages/dvmcp-discovery/src/config.ts @@ -1,7 +1,7 @@ import { parse } from 'yaml'; import { join } from 'path'; import { existsSync, readFileSync } from 'fs'; -import { HEX_KEYS_REGEX } from 'commons/constants'; +import { HEX_KEYS_REGEX } from '@dvmcp/commons/constants'; export interface Config { nostr: { diff --git a/packages/dvmcp-discovery/src/discovery-server.ts b/packages/dvmcp-discovery/src/discovery-server.ts index 20da06f..38a0715 100644 --- a/packages/dvmcp-discovery/src/discovery-server.ts +++ b/packages/dvmcp-discovery/src/discovery-server.ts @@ -1,10 +1,10 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { type Event, type Filter } from 'nostr-tools'; -import { RelayHandler } from 'commons/nostr/relay-handler'; -import { createKeyManager } from 'commons/nostr/key-manager'; +import { RelayHandler } from '@dvmcp/commons/nostr/relay-handler'; +import { createKeyManager } from '@dvmcp/commons/nostr/key-manager'; import { CONFIG, type Config } from './config'; -import { DVM_ANNOUNCEMENT_KIND } from 'commons/constants'; +import { DVM_ANNOUNCEMENT_KIND } from '@dvmcp/commons/constants'; import type { Tool } from '@modelcontextprotocol/sdk/types.js'; import { ToolRegistry } from './tool-registry'; import { ToolExecutor } from './tool-executor'; diff --git a/packages/dvmcp-discovery/src/discovery.test.ts b/packages/dvmcp-discovery/src/discovery.test.ts index 5f78ca1..715c727 100644 --- a/packages/dvmcp-discovery/src/discovery.test.ts +++ b/packages/dvmcp-discovery/src/discovery.test.ts @@ -4,7 +4,7 @@ import { CONFIG } from './config'; import { server as mockRelay, stop as stopRelay, -} from 'commons/nostr/mock-relay'; +} from '@dvmcp/commons/nostr/mock-relay'; import type { Tool } from '@modelcontextprotocol/sdk/types.js'; describe('DiscoveryServer E2E', () => { diff --git a/packages/dvmcp-discovery/src/tool-executor.ts b/packages/dvmcp-discovery/src/tool-executor.ts index 2a8971d..16f0997 100644 --- a/packages/dvmcp-discovery/src/tool-executor.ts +++ b/packages/dvmcp-discovery/src/tool-executor.ts @@ -1,12 +1,12 @@ import { type Event } from 'nostr-tools'; -import { RelayHandler } from 'commons/nostr/relay-handler'; -import { createKeyManager } from 'commons/nostr/key-manager'; +import { RelayHandler } from '@dvmcp/commons/nostr/relay-handler'; +import { createKeyManager } from '@dvmcp/commons/nostr/key-manager'; import { type Tool } from '@modelcontextprotocol/sdk/types.js'; import { TOOL_REQUEST_KIND, TOOL_RESPONSE_KIND, DVM_NOTICE_KIND, -} from 'commons/constants'; +} from '@dvmcp/commons/constants'; interface ExecutionContext { timeoutId: ReturnType; diff --git a/packages/dvmcp-discovery/src/validation.test.ts b/packages/dvmcp-discovery/src/validation.test.ts index 03c37b9..ff81921 100644 --- a/packages/dvmcp-discovery/src/validation.test.ts +++ b/packages/dvmcp-discovery/src/validation.test.ts @@ -2,11 +2,14 @@ import { expect, test, describe } from 'bun:test'; import { ToolRegistry } from './tool-registry'; import { ToolExecutor } from './tool-executor'; import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -import { RelayHandler } from 'commons/nostr/relay-handler'; -import { createKeyManager } from 'commons/nostr/key-manager'; +import { RelayHandler } from '@dvmcp/commons/nostr/relay-handler'; +import { createKeyManager } from '@dvmcp/commons/nostr/key-manager'; import { type Tool, ToolSchema } from '@modelcontextprotocol/sdk/types.js'; import { z, ZodError } from 'zod'; -import { DVM_ANNOUNCEMENT_KIND, TOOL_REQUEST_KIND } from 'commons/constants'; +import { + DVM_ANNOUNCEMENT_KIND, + TOOL_REQUEST_KIND, +} from '@dvmcp/commons/constants'; describe('Tool Schema Validation', () => { describe('ToolRegistry Validation', () => {