diff --git a/README.md b/README.md index 629e459..db3b06f 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ npx i-am-bee/agentstack-a2a-proxy start http://localhost:8080 --auto-register fa npx i-am-bee/agentstack-a2a-proxyy start http://localhost:8080 --custom-data ./my-agent-details.json ``` + ### All Options | Option | Alias | Description | Default | @@ -60,6 +61,8 @@ npx i-am-bee/agentstack-a2a-proxyy start http://localhost:8080 --custom-data ./m | `--auto-register` | `-a` | Auto-register with Agent Stack | `true` | | `--platform-url` | `-P` | Agent Stack URL | `http://127.0.0.1:8333` | | `--custom-data` | `-c` | Custom AgentDetail JSON file | (uses defaults) | +| `--self-registration-id` | `-s` | Self registration ID to use for registration | `a2a-proxy-agent` | + ## Limitations diff --git a/dist/cli.js b/dist/cli.js index 2a08aab..c3abb19 100644 --- a/dist/cli.js +++ b/dist/cli.js @@ -21,6 +21,7 @@ program program .command("start ") .description("Start the proxy server") + .option("-s, --self-registration-id ", "Self registration ID to use for registration (default: a2a-proxy-agent)") .option("-a --auto-register ", "Register with the provider API", "true") .option("-p, --port ", "Port to run the proxy server on (default: 8000)") .option("-P, --platform-url ", "Platform URL to register with (default: http://127.0.0.1:8333)") @@ -39,6 +40,7 @@ program targetUrl: parsedTarget, platformUrl: parsedInput.platformUrl, customData, + selfRegistrationId: parsedInput.selfRegistrationId, }); } catch (error) { diff --git a/dist/cli.js.map b/dist/cli.js.map index d7ad736..6658c87 100644 --- a/dist/cli.js.map +++ b/dist/cli.js.map @@ -1 +1 @@ -{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AACA;;;GAGG;;;;;AAGH,yCAAoC;AACpC,qCAAsC;AACtC,8CAAoB;AACpB,+EAAyE;AACzE,yDAA0D;AAE1D,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,sBAAsB,CAAC;KAC5B,WAAW,CAAC,uBAAuB,CAAC;KACpC,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,wBAAwB,CAAC;KACrC,MAAM,CACL,mCAAmC,EACnC,gCAAgC,EAChC,MAAM,CACP;KACA,MAAM,CACL,mBAAmB,EACnB,iDAAiD,CAClD;KACA,MAAM,CACL,kCAAkC,EAClC,gEAAgE,CACjE;KACA,MAAM,CAAC,0BAA0B,EAAE,uCAAuC,CAAC;KAC3E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;IAChC,MAAM,YAAY,GAAG,aAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,2BAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAElD,IAAI,CAAC;QACH,IAAI,UAAU,CAAC;QACf,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;YAC3B,UAAU,GAAG,IAAA,gDAAqB,EAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,IAAA,mBAAU,EAAC;YACf,YAAY,EAAE,WAAW,CAAC,YAAY;YACtC,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,SAAS,EAAE,YAAY;YACvB,WAAW,EAAE,WAAW,CAAC,WAAW;YACpC,UAAU;SACX,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"} \ No newline at end of file +{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AACA;;;GAGG;;;;;AAEH,yCAAoC;AACpC,qCAAsC;AACtC,8CAAoB;AACpB,+EAAyE;AACzE,yDAA0D;AAE1D,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,sBAAsB,CAAC;KAC5B,WAAW,CAAC,uBAAuB,CAAC;KACpC,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,wBAAwB,CAAC;KACrC,MAAM,CACL,iDAAiD,EACjD,yEAAyE,CAC1E;KACA,MAAM,CACL,mCAAmC,EACnC,gCAAgC,EAChC,MAAM,CACP;KACA,MAAM,CACL,mBAAmB,EACnB,iDAAiD,CAClD;KACA,MAAM,CACL,kCAAkC,EAClC,gEAAgE,CACjE;KACA,MAAM,CAAC,0BAA0B,EAAE,uCAAuC,CAAC;KAC3E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;IAChC,MAAM,YAAY,GAAG,aAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,2BAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAElD,IAAI,CAAC;QACH,IAAI,UAAU,CAAC;QACf,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;YAC3B,UAAU,GAAG,IAAA,gDAAqB,EAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,IAAA,mBAAU,EAAC;YACf,YAAY,EAAE,WAAW,CAAC,YAAY;YACtC,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,SAAS,EAAE,YAAY;YACvB,WAAW,EAAE,WAAW,CAAC,WAAW;YACpC,UAAU;YACV,kBAAkB,EAAE,WAAW,CAAC,kBAAkB;SACnD,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"} \ No newline at end of file diff --git a/dist/core/intercept-agent-card.d.ts b/dist/core/intercept-agent-card.d.ts index 09f9b1b..cdeceb5 100644 --- a/dist/core/intercept-agent-card.d.ts +++ b/dist/core/intercept-agent-card.d.ts @@ -3,5 +3,5 @@ * SPDX-License-Identifier: Apache-2.0 */ import { CustomAgentDetail } from "../validations/custom-agent-detail-schema"; -export declare const interceptAgentCard: (originalData: any, port: number, customData?: CustomAgentDetail) => any; +export declare const interceptAgentCard: (originalData: any, port: number, selfRegistrationId: string, customData?: CustomAgentDetail) => any; //# sourceMappingURL=intercept-agent-card.d.ts.map \ No newline at end of file diff --git a/dist/core/intercept-agent-card.d.ts.map b/dist/core/intercept-agent-card.d.ts.map index 6657a0c..41f3ff8 100644 --- a/dist/core/intercept-agent-card.d.ts.map +++ b/dist/core/intercept-agent-card.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"intercept-agent-card.d.ts","sourceRoot":"","sources":["../../src/core/intercept-agent-card.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAE9E,eAAO,MAAM,kBAAkB,GAC7B,cAAc,GAAG,EACjB,MAAM,MAAM,EACZ,aAAa,iBAAiB,QAgC/B,CAAC"} \ No newline at end of file +{"version":3,"file":"intercept-agent-card.d.ts","sourceRoot":"","sources":["../../src/core/intercept-agent-card.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAE9E,eAAO,MAAM,kBAAkB,GAC7B,cAAc,GAAG,EACjB,MAAM,MAAM,EACZ,oBAAoB,MAAM,EAC1B,aAAa,iBAAiB,QAuC/B,CAAC"} \ No newline at end of file diff --git a/dist/core/intercept-agent-card.js b/dist/core/intercept-agent-card.js index 6233b12..d2781b8 100644 --- a/dist/core/intercept-agent-card.js +++ b/dist/core/intercept-agent-card.js @@ -5,7 +5,7 @@ */ Object.defineProperty(exports, "__esModule", { value: true }); exports.interceptAgentCard = void 0; -const interceptAgentCard = (originalData, port, customData) => { +const interceptAgentCard = (originalData, port, selfRegistrationId, customData) => { const defaultParams = { author: null, container_image_url: null, @@ -30,6 +30,13 @@ const interceptAgentCard = (originalData, port, customData) => { required: false, params: mergedParams, }, + { + uri: "https://a2a-extensions.agentstack.beeai.dev/services/platform-self-registration/v1", + required: false, + params: { + self_registration_id: selfRegistrationId, + }, + }, ], }, url: `http://localhost:${port}/`, diff --git a/dist/core/intercept-agent-card.js.map b/dist/core/intercept-agent-card.js.map index c859cff..67b77dc 100644 --- a/dist/core/intercept-agent-card.js.map +++ b/dist/core/intercept-agent-card.js.map @@ -1 +1 @@ -{"version":3,"file":"intercept-agent-card.js","sourceRoot":"","sources":["../../src/core/intercept-agent-card.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAII,MAAM,kBAAkB,GAAG,CAChC,YAAiB,EACjB,IAAY,EACZ,UAA8B,EAC9B,EAAE;IACF,MAAM,aAAa,GAAG;QACpB,MAAM,EAAE,IAAI;QACZ,mBAAmB,EAAE,IAAI;QACzB,YAAY,EAAE,EAAE;QAChB,SAAS,EAAE,IAAI;QACf,gBAAgB,EAAE,YAAqB;QACvC,SAAS,EAAE,EAAE;KACd,CAAC;IAEF,MAAM,YAAY,GAAG,UAAU;QAC7B,CAAC,CAAC;YACE,GAAG,aAAa;YAChB,GAAG,UAAU;SACd;QACH,CAAC,CAAC,aAAa,CAAC;IAElB,OAAO;QACL,GAAG,YAAY;QACf,YAAY,EAAE;YACZ,GAAG,YAAY,CAAC,YAAY;YAC5B,UAAU,EAAE;gBACV;oBACE,GAAG,EAAE,gEAAgE;oBACrE,QAAQ,EAAE,KAAK;oBACf,MAAM,EAAE,YAAY;iBACrB;aACF;SACF;QACD,GAAG,EAAE,oBAAoB,IAAI,GAAG;KACjC,CAAC;AACJ,CAAC,CAAC;AAnCW,QAAA,kBAAkB,sBAmC7B"} \ No newline at end of file +{"version":3,"file":"intercept-agent-card.js","sourceRoot":"","sources":["../../src/core/intercept-agent-card.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAII,MAAM,kBAAkB,GAAG,CAChC,YAAiB,EACjB,IAAY,EACZ,kBAA0B,EAC1B,UAA8B,EAC9B,EAAE;IACF,MAAM,aAAa,GAAG;QACpB,MAAM,EAAE,IAAI;QACZ,mBAAmB,EAAE,IAAI;QACzB,YAAY,EAAE,EAAE;QAChB,SAAS,EAAE,IAAI;QACf,gBAAgB,EAAE,YAAqB;QACvC,SAAS,EAAE,EAAE;KACd,CAAC;IAEF,MAAM,YAAY,GAAG,UAAU;QAC7B,CAAC,CAAC;YACE,GAAG,aAAa;YAChB,GAAG,UAAU;SACd;QACH,CAAC,CAAC,aAAa,CAAC;IAElB,OAAO;QACL,GAAG,YAAY;QACf,YAAY,EAAE;YACZ,GAAG,YAAY,CAAC,YAAY;YAC5B,UAAU,EAAE;gBACV;oBACE,GAAG,EAAE,gEAAgE;oBACrE,QAAQ,EAAE,KAAK;oBACf,MAAM,EAAE,YAAY;iBACrB;gBACD;oBACE,GAAG,EAAE,oFAAoF;oBACzF,QAAQ,EAAE,KAAK;oBACf,MAAM,EAAE;wBACN,oBAAoB,EAAE,kBAAkB;qBACzC;iBACF;aACF;SACF;QACD,GAAG,EAAE,oBAAoB,IAAI,GAAG;KACjC,CAAC;AACJ,CAAC,CAAC;AA3CW,QAAA,kBAAkB,sBA2C7B"} \ No newline at end of file diff --git a/dist/core/register-to-platform.d.ts b/dist/core/register-to-platform.d.ts index 7228e45..b7de1fc 100644 --- a/dist/core/register-to-platform.d.ts +++ b/dist/core/register-to-platform.d.ts @@ -2,5 +2,5 @@ * Copyright 2025 © BeeAI a Series of LF Projects, LLC * SPDX-License-Identifier: Apache-2.0 */ -export declare function registerToPlatform(platformUrl: string, targetUrl: string): Promise; +export declare function registerToPlatform(platformUrl: string, targetUrl: string, selfRegistrationId: string): Promise; //# sourceMappingURL=register-to-platform.d.ts.map \ No newline at end of file diff --git a/dist/core/register-to-platform.d.ts.map b/dist/core/register-to-platform.d.ts.map index c40bcc9..7297b4a 100644 --- a/dist/core/register-to-platform.d.ts.map +++ b/dist/core/register-to-platform.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"register-to-platform.d.ts","sourceRoot":"","sources":["../../src/core/register-to-platform.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAsBf"} \ No newline at end of file +{"version":3,"file":"register-to-platform.d.ts","sourceRoot":"","sources":["../../src/core/register-to-platform.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,IAAI,CAAC,CAmCf"} \ No newline at end of file diff --git a/dist/core/register-to-platform.js b/dist/core/register-to-platform.js index f49ef34..0ad9478 100644 --- a/dist/core/register-to-platform.js +++ b/dist/core/register-to-platform.js @@ -5,15 +5,26 @@ */ Object.defineProperty(exports, "__esModule", { value: true }); exports.registerToPlatform = registerToPlatform; -async function registerToPlatform(platformUrl, targetUrl) { +async function registerToPlatform(platformUrl, targetUrl, selfRegistrationId) { console.log(`Attempt to register ${targetUrl} to ${platformUrl}`); - const response = await fetch(`${platformUrl}/api/v1/providers?auto_remove=true`, { + const allProviders = await fetch(`${platformUrl}/api/v1/providers`); + if (!allProviders.ok) { + console.error(await allProviders.text()); + throw new Error(`Failed to get all providers: ${allProviders.statusText}`); + } + const allProvidersData = (await allProviders.json()); + if (allProvidersData.items.length > 0 && + allProvidersData.items.some((item) => item.source.endsWith(`#${selfRegistrationId}`))) { + console.log("Agent already registered to the platform."); + return; + } + const response = await fetch(`${platformUrl}/api/v1/providers`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ - location: targetUrl, + location: `${targetUrl}#${selfRegistrationId}`, }), }); if (!response.ok) { diff --git a/dist/core/register-to-platform.js.map b/dist/core/register-to-platform.js.map index b6d7e42..33e26bf 100644 --- a/dist/core/register-to-platform.js.map +++ b/dist/core/register-to-platform.js.map @@ -1 +1 @@ -{"version":3,"file":"register-to-platform.js","sourceRoot":"","sources":["../../src/core/register-to-platform.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,gDAyBC;AAzBM,KAAK,UAAU,kBAAkB,CACtC,WAAmB,EACnB,SAAiB;IAEjB,OAAO,CAAC,GAAG,CAAC,uBAAuB,SAAS,OAAO,WAAW,EAAE,CAAC,CAAC;IAElE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,WAAW,oCAAoC,EAClD;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,QAAQ,EAAE,SAAS;SACpB,CAAC;KACH,CACF,CAAC;IAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,mCAAmC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;AAC5D,CAAC"} \ No newline at end of file +{"version":3,"file":"register-to-platform.js","sourceRoot":"","sources":["../../src/core/register-to-platform.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,gDAuCC;AAvCM,KAAK,UAAU,kBAAkB,CACtC,WAAmB,EACnB,SAAiB,EACjB,kBAA0B;IAE1B,OAAO,CAAC,GAAG,CAAC,uBAAuB,SAAS,OAAO,WAAW,EAAE,CAAC,CAAC;IAElE,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,mBAAmB,CAAC,CAAC;IACpE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,gCAAgC,YAAY,CAAC,UAAU,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,MAAM,gBAAgB,GAAG,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,CAAqB,CAAC;IACzE,IACE,gBAAgB,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QACjC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAC/C,EACD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,mBAAmB,EAAE;QAC9D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,QAAQ,EAAE,GAAG,SAAS,IAAI,kBAAkB,EAAE;SAC/C,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,mCAAmC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;AAC5D,CAAC"} \ No newline at end of file diff --git a/dist/server.d.ts b/dist/server.d.ts index b59edd1..46f6e77 100644 --- a/dist/server.d.ts +++ b/dist/server.d.ts @@ -7,6 +7,7 @@ import { CliInput } from "./validations/cli-config"; export declare function startProxy(input: Pick & { platformUrl: string; targetUrl: string; + selfRegistrationId: string; } & Partial<{ customData: CustomAgentDetail; }>): Promise; diff --git a/dist/server.d.ts.map b/dist/server.d.ts.map index 8213600..550ae1d 100644 --- a/dist/server.d.ts.map +++ b/dist/server.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAIpD,wBAAsB,UAAU,CAC9B,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAAC,GAAG;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC;IAAE,UAAU,EAAE,iBAAiB,CAAA;CAAE,CAAC,GAC7C,OAAO,CAAC,IAAI,CAAC,CAyEf"} \ No newline at end of file +{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAIpD,wBAAsB,UAAU,CAC9B,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAAC,GAAG;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;CAC5B,GAAG,OAAO,CAAC;IAAE,UAAU,EAAE,iBAAiB,CAAA;CAAE,CAAC,GAC7C,OAAO,CAAC,IAAI,CAAC,CA2Ef"} \ No newline at end of file diff --git a/dist/server.js b/dist/server.js index a783e2f..1171419 100644 --- a/dist/server.js +++ b/dist/server.js @@ -34,7 +34,7 @@ async function startProxy(input) { .json({ error: "Failed to fetch from target" }); } const originalData = await response.json(); - const modifiedData = (0, intercept_agent_card_1.interceptAgentCard)(originalData, input.port, input.customData); + const modifiedData = (0, intercept_agent_card_1.interceptAgentCard)(originalData, input.port, input.selfRegistrationId, input.customData); res.json(modifiedData); } catch (error) { @@ -57,7 +57,7 @@ async function startProxy(input) { console.log(`Proxying requests to: ${input.targetUrl}`); console.log(`Intercepting: /.well-known/agent-card.json`); if (input.autoRegister) { - await (0, register_to_platform_1.registerToPlatform)(input.platformUrl, `http://localhost:${input.port}`); + await (0, register_to_platform_1.registerToPlatform)(input.platformUrl, `http://localhost:${input.port}`, input.selfRegistrationId); } resolve(); }); diff --git a/dist/server.js.map b/dist/server.js.map index 8900016..b045a2e 100644 --- a/dist/server.js.map +++ b/dist/server.js.map @@ -1 +1 @@ -{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/validations/cli-config.d.ts b/dist/validations/cli-config.d.ts index 3a864fb..69c5fde 100644 --- a/dist/validations/cli-config.d.ts +++ b/dist/validations/cli-config.d.ts @@ -5,6 +5,7 @@ import z from "zod"; export declare const cliInputSchema: z.ZodObject<{ platformUrl: z.ZodDefault>; + selfRegistrationId: z.ZodDefault>; autoRegister: z.ZodDefault>>>; port: z.ZodDefault>>>; customData: z.ZodOptional; diff --git a/dist/validations/cli-config.d.ts.map b/dist/validations/cli-config.d.ts.map index 0f02eb9..abdde31 100644 --- a/dist/validations/cli-config.d.ts.map +++ b/dist/validations/cli-config.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"cli-config.d.ts","sourceRoot":"","sources":["../../src/validations/cli-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,eAAO,MAAM,cAAc;;;;;iBAuBzB,CAAC;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC"} \ No newline at end of file +{"version":3,"file":"cli-config.d.ts","sourceRoot":"","sources":["../../src/validations/cli-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,eAAO,MAAM,cAAc;;;;;;iBAwBzB,CAAC;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC"} \ No newline at end of file diff --git a/dist/validations/cli-config.js b/dist/validations/cli-config.js index 8e6e7f2..2c4d91b 100644 --- a/dist/validations/cli-config.js +++ b/dist/validations/cli-config.js @@ -11,6 +11,7 @@ exports.cliInputSchema = void 0; const zod_1 = __importDefault(require("zod")); exports.cliInputSchema = zod_1.default.object({ platformUrl: zod_1.default.string().optional().default("http://127.0.0.1:8333"), + selfRegistrationId: zod_1.default.string().optional().default("a2a-proxy-agent"), autoRegister: zod_1.default .string() .transform((val) => { diff --git a/dist/validations/cli-config.js.map b/dist/validations/cli-config.js.map index 93b288b..467848a 100644 --- a/dist/validations/cli-config.js.map +++ b/dist/validations/cli-config.js.map @@ -1 +1 @@ -{"version":3,"file":"cli-config.js","sourceRoot":"","sources":["../../src/validations/cli-config.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;AAEH,8CAAoB;AAEP,QAAA,cAAc,GAAG,aAAC,CAAC,MAAM,CAAC;IACrC,WAAW,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC;IACnE,YAAY,EAAE,aAAC;SACZ,MAAM,EAAE;SACR,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;QACjB,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAC/C,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC,CAAC;SACD,QAAQ,EAAE;SACV,OAAO,CAAC,IAAI,CAAC;IAChB,IAAI,EAAE,aAAC;SACJ,MAAM,EAAE;SACR,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;QACjB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC9B,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;SACD,QAAQ,EAAE;SACV,OAAO,CAAC,IAAI,CAAC;IAChB,UAAU,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC"} \ No newline at end of file +{"version":3,"file":"cli-config.js","sourceRoot":"","sources":["../../src/validations/cli-config.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;AAEH,8CAAoB;AAEP,QAAA,cAAc,GAAG,aAAC,CAAC,MAAM,CAAC;IACrC,WAAW,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC;IACnE,kBAAkB,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC;IACpE,YAAY,EAAE,aAAC;SACZ,MAAM,EAAE;SACR,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;QACjB,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAC/C,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC,CAAC;SACD,QAAQ,EAAE;SACV,OAAO,CAAC,IAAI,CAAC;IAChB,IAAI,EAAE,aAAC;SACJ,MAAM,EAAE;SACR,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;QACjB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC9B,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;SACD,QAAQ,EAAE;SACV,OAAO,CAAC,IAAI,CAAC;IAChB,UAAU,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC"} \ No newline at end of file diff --git a/src/cli.ts b/src/cli.ts index c097fed..99f8943 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -4,7 +4,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - import { Command } from "commander"; import { startProxy } from "./server"; import z from "zod"; @@ -21,6 +20,10 @@ program program .command("start ") .description("Start the proxy server") + .option( + "-s, --self-registration-id ", + "Self registration ID to use for registration (default: a2a-proxy-agent)" + ) .option( "-a --auto-register ", "Register with the provider API", @@ -51,6 +54,7 @@ program targetUrl: parsedTarget, platformUrl: parsedInput.platformUrl, customData, + selfRegistrationId: parsedInput.selfRegistrationId, }); } catch (error) { console.error("Failed to start proxy server:", error); diff --git a/src/core/intercept-agent-card.ts b/src/core/intercept-agent-card.ts index 713f484..12551bf 100644 --- a/src/core/intercept-agent-card.ts +++ b/src/core/intercept-agent-card.ts @@ -8,6 +8,7 @@ import { CustomAgentDetail } from "../validations/custom-agent-detail-schema"; export const interceptAgentCard = ( originalData: any, port: number, + selfRegistrationId: string, customData?: CustomAgentDetail ) => { const defaultParams = { @@ -36,6 +37,13 @@ export const interceptAgentCard = ( required: false, params: mergedParams, }, + { + uri: "https://a2a-extensions.agentstack.beeai.dev/services/platform-self-registration/v1", + required: false, + params: { + self_registration_id: selfRegistrationId, + }, + }, ], }, url: `http://localhost:${port}/`, diff --git a/src/core/register-to-platform.ts b/src/core/register-to-platform.ts index 8188fbc..c3a8aea 100644 --- a/src/core/register-to-platform.ts +++ b/src/core/register-to-platform.ts @@ -5,22 +5,36 @@ export async function registerToPlatform( platformUrl: string, - targetUrl: string + targetUrl: string, + selfRegistrationId: string ): Promise { console.log(`Attempt to register ${targetUrl} to ${platformUrl}`); - const response = await fetch( - `${platformUrl}/api/v1/providers?auto_remove=true`, - { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - location: targetUrl, - }), - } - ); + const allProviders = await fetch(`${platformUrl}/api/v1/providers`); + if (!allProviders.ok) { + console.error(await allProviders.text()); + throw new Error(`Failed to get all providers: ${allProviders.statusText}`); + } + const allProvidersData = (await allProviders.json()) as { items: any[] }; + if ( + allProvidersData.items.length > 0 && + allProvidersData.items.some((item) => + item.source.endsWith(`#${selfRegistrationId}`) + ) + ) { + console.log("Agent already registered to the platform."); + return; + } + + const response = await fetch(`${platformUrl}/api/v1/providers`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + location: `${targetUrl}#${selfRegistrationId}`, + }), + }); if (!response.ok) { console.error(await response.text()); diff --git a/src/server.ts b/src/server.ts index b4395df..0b9e109 100644 --- a/src/server.ts +++ b/src/server.ts @@ -15,6 +15,7 @@ export async function startProxy( input: Pick & { platformUrl: string; targetUrl: string; + selfRegistrationId: string; } & Partial<{ customData: CustomAgentDetail }> ): Promise { const app = express(); @@ -46,6 +47,7 @@ export async function startProxy( const modifiedData = interceptAgentCard( originalData, input.port, + input.selfRegistrationId, input.customData ); @@ -78,7 +80,8 @@ export async function startProxy( if (input.autoRegister) { await registerToPlatform( input.platformUrl, - `http://localhost:${input.port}` + `http://localhost:${input.port}`, + input.selfRegistrationId ); } diff --git a/src/validations/cli-config.ts b/src/validations/cli-config.ts index f909005..e0dde08 100644 --- a/src/validations/cli-config.ts +++ b/src/validations/cli-config.ts @@ -7,6 +7,7 @@ import z from "zod"; export const cliInputSchema = z.object({ platformUrl: z.string().optional().default("http://127.0.0.1:8333"), + selfRegistrationId: z.string().optional().default("a2a-proxy-agent"), autoRegister: z .string() .transform((val) => {