agent-comms 8.15.5 → 8.15.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/dist/core/mcp-registry-retry.d.ts +1 -1
- package/dist/core/mcp-registry-retry.d.ts.map +1 -1
- package/dist/core/mcp-registry-retry.js +8 -2
- package/dist/core/mcp-registry-retry.js.map +1 -1
- package/dist/core/mcp-registry-version.d.ts +5 -0
- package/dist/core/mcp-registry-version.d.ts.map +1 -0
- package/dist/core/mcp-registry-version.js +17 -0
- package/dist/core/mcp-registry-version.js.map +1 -0
- package/dist/test/mcp-registry-retry.unit.test.js +8 -0
- package/dist/test/mcp-registry-retry.unit.test.js.map +1 -1
- package/dist/test/mcp-registry-version.unit.test.d.ts +2 -0
- package/dist/test/mcp-registry-version.unit.test.d.ts.map +1 -0
- package/dist/test/mcp-registry-version.unit.test.js +22 -0
- package/dist/test/mcp-registry-version.unit.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -4,6 +4,6 @@ export declare const RETRY_BACKOFF_MULTIPLIER = 2;
|
|
|
4
4
|
export declare const MAX_TOTAL_RETRY_MS: number;
|
|
5
5
|
/** The next delay in the doubling-with-cap backoff schedule, given the delay just used. */
|
|
6
6
|
export declare function nextRetryDelayMs(previousDelayMs: number): number;
|
|
7
|
-
/** Recognises a publish failure worth retrying (npm propagation lag, a transient 5xx from the registry's own infrastructure, a connection-level failure that never reached the registry,
|
|
7
|
+
/** Recognises a publish failure worth retrying (npm propagation lag, a transient 5xx from the registry's own infrastructure, a connection-level failure that never reached the registry, a login JWT that expired mid-retry-window, or the registry's database running short of resources) as opposed to any other failure -- a genuinely invalid publish request or authorisation failure, for instance, which retrying can never fix. */
|
|
8
8
|
export declare function isRetryablePublishFailure(output: string): boolean;
|
|
9
9
|
//# sourceMappingURL=mcp-registry-retry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-registry-retry.d.ts","sourceRoot":"","sources":["../../src/core/mcp-registry-retry.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAC7C,eAAO,MAAM,kBAAkB,SAAU,CAAC;AAC1C,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAI1C,eAAO,MAAM,kBAAkB,QAC+B,CAAC;AAE/D,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAKhE;
|
|
1
|
+
{"version":3,"file":"mcp-registry-retry.d.ts","sourceRoot":"","sources":["../../src/core/mcp-registry-retry.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAC7C,eAAO,MAAM,kBAAkB,SAAU,CAAC;AAC1C,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAI1C,eAAO,MAAM,kBAAkB,QAC+B,CAAC;AAE/D,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAKhE;AAuCD,2aAA2a;AAC3a,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAQjE"}
|
|
@@ -33,11 +33,17 @@ const EXPIRED_JWT_STATUS_PATTERN = /server returned status 401\b/;
|
|
|
33
33
|
function isExpiredJwt(output) {
|
|
34
34
|
return EXPIRED_JWT_STATUS_PATTERN.test(output) && output.includes("expired");
|
|
35
35
|
}
|
|
36
|
-
|
|
36
|
+
// Confirmed as a fifth retryable failure mode (ExaDev/agent-comms, 2026-10-21, release run 39670379457, v8.15.4): the registry's own Postgres had no free connection slots (SQLSTATE 53300), and the registry reported that as an HTTP 400 "Failed to publish server" and not a 5xx, so the status pattern above never matched and the release job failed on its first attempt, before the GitHub release was created. PostgreSQL's SQLSTATE class 53 is "insufficient resources" (no connection slots, disk full, out of memory, configuration limit): a shortage on the registry's side that clears by itself and has nothing to do with the request, so it is retryable whatever HTTP status carries it. Any other SQLSTATE class (a constraint violation, say) describes the request or its data and would fail again.
|
|
37
|
+
const DATABASE_RESOURCE_SHORTAGE_PATTERN = /\bSQLSTATE 53\d{3}\b/;
|
|
38
|
+
function isDatabaseResourceShortage(output) {
|
|
39
|
+
return DATABASE_RESOURCE_SHORTAGE_PATTERN.test(output);
|
|
40
|
+
}
|
|
41
|
+
/** Recognises a publish failure worth retrying (npm propagation lag, a transient 5xx from the registry's own infrastructure, a connection-level failure that never reached the registry, a login JWT that expired mid-retry-window, or the registry's database running short of resources) as opposed to any other failure -- a genuinely invalid publish request or authorisation failure, for instance, which retrying can never fix. */
|
|
37
42
|
export function isRetryablePublishFailure(output) {
|
|
38
43
|
return (isNpmPropagationLag(output) ||
|
|
39
44
|
isRetryableServerError(output) ||
|
|
40
45
|
isConnectionError(output) ||
|
|
41
|
-
isExpiredJwt(output)
|
|
46
|
+
isExpiredJwt(output) ||
|
|
47
|
+
isDatabaseResourceShortage(output));
|
|
42
48
|
}
|
|
43
49
|
//# sourceMappingURL=mcp-registry-retry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-registry-retry.js","sourceRoot":"","sources":["../../src/core/mcp-registry-retry.ts"],"names":[],"mappings":"AAAA,mgBAAmgB;AAEngB,sSAAsS;AACtS,EAAE;AACF,6bAA6b;AAC7b,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAC7C,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAC1C,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAC1C,MAAM,uBAAuB,GAAG,EAAE,CAAC;AACnC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,MAAM,CAAC,MAAM,kBAAkB,GAC7B,uBAAuB,GAAG,kBAAkB,GAAG,aAAa,CAAC;AAE/D,2FAA2F;AAC3F,MAAM,UAAU,gBAAgB,CAAC,eAAuB;IACtD,OAAO,IAAI,CAAC,GAAG,CACb,eAAe,GAAG,wBAAwB,EAC1C,kBAAkB,CACnB,CAAC;AACJ,CAAC;AAED,kLAAkL;AAClL,SAAS,mBAAmB,CAAC,MAAc;IACzC,OAAO,CACL,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC;QAChC,MAAM,CAAC,QAAQ,CAAC,6CAA6C,CAAC,CAC/D,CAAC;AACJ,CAAC;AAED,yxBAAyxB;AACzxB,MAAM,2BAA2B,GAAG,iCAAiC,CAAC;AAEtE,SAAS,sBAAsB,CAAC,MAAc;IAC5C,OAAO,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,mjBAAmjB;AACnjB,MAAM,wBAAwB,GAC5B,gFAAgF,CAAC;AAEnF,SAAS,iBAAiB,CAAC,MAAc;IACvC,OAAO,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,+vBAA+vB;AAC/vB,MAAM,0BAA0B,GAAG,8BAA8B,CAAC;AAElE,SAAS,YAAY,CAAC,MAAc;IAClC,OAAO,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC/E,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"mcp-registry-retry.js","sourceRoot":"","sources":["../../src/core/mcp-registry-retry.ts"],"names":[],"mappings":"AAAA,mgBAAmgB;AAEngB,sSAAsS;AACtS,EAAE;AACF,6bAA6b;AAC7b,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAC7C,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAC1C,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAC1C,MAAM,uBAAuB,GAAG,EAAE,CAAC;AACnC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,MAAM,CAAC,MAAM,kBAAkB,GAC7B,uBAAuB,GAAG,kBAAkB,GAAG,aAAa,CAAC;AAE/D,2FAA2F;AAC3F,MAAM,UAAU,gBAAgB,CAAC,eAAuB;IACtD,OAAO,IAAI,CAAC,GAAG,CACb,eAAe,GAAG,wBAAwB,EAC1C,kBAAkB,CACnB,CAAC;AACJ,CAAC;AAED,kLAAkL;AAClL,SAAS,mBAAmB,CAAC,MAAc;IACzC,OAAO,CACL,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC;QAChC,MAAM,CAAC,QAAQ,CAAC,6CAA6C,CAAC,CAC/D,CAAC;AACJ,CAAC;AAED,yxBAAyxB;AACzxB,MAAM,2BAA2B,GAAG,iCAAiC,CAAC;AAEtE,SAAS,sBAAsB,CAAC,MAAc;IAC5C,OAAO,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,mjBAAmjB;AACnjB,MAAM,wBAAwB,GAC5B,gFAAgF,CAAC;AAEnF,SAAS,iBAAiB,CAAC,MAAc;IACvC,OAAO,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,+vBAA+vB;AAC/vB,MAAM,0BAA0B,GAAG,8BAA8B,CAAC;AAElE,SAAS,YAAY,CAAC,MAAc;IAClC,OAAO,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC/E,CAAC;AAED,2xBAA2xB;AAC3xB,MAAM,kCAAkC,GAAG,sBAAsB,CAAC;AAElE,SAAS,0BAA0B,CAAC,MAAc;IAChD,OAAO,kCAAkC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACzD,CAAC;AAED,2aAA2a;AAC3a,MAAM,UAAU,yBAAyB,CAAC,MAAc;IACtD,OAAO,CACL,mBAAmB,CAAC,MAAM,CAAC;QAC3B,sBAAsB,CAAC,MAAM,CAAC;QAC9B,iBAAiB,CAAC,MAAM,CAAC;QACzB,YAAY,CAAC,MAAM,CAAC;QACpB,0BAA0B,CAAC,MAAM,CAAC,CACnC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** The registry's endpoint for one version of one server. The name carries a `/` (`io.github.<owner>/<repo>`) that must stay inside a single path segment. */
|
|
2
|
+
export declare function registryVersionUrl(name: string, version: string): string;
|
|
3
|
+
/** Reads the status of a {@link registryVersionUrl} response: 200 means listed, 404 means not listed. Any other status says nothing about whether the version is listed, so it throws and fails the job to be re-run, never guessing either way. */
|
|
4
|
+
export declare function isPublishedOnRegistry(status: number): boolean;
|
|
5
|
+
//# sourceMappingURL=mcp-registry-version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-registry-version.d.ts","sourceRoot":"","sources":["../../src/core/mcp-registry-version.ts"],"names":[],"mappings":"AAKA,8JAA8J;AAC9J,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,oPAAoP;AACpP,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAM7D"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Decides whether a version is already listed on the MCP registry, kept here rather than in scripts/publish-mcp-registry.ts for the same reason as mcp-registry-retry.ts: a test under src/test/ cannot import from scripts/. The registry publish runs as its own CI job after the release and is re-run by hand after an outage, so it must skip a version the registry already lists, because publishing one again fails the job.
|
|
2
|
+
const REGISTRY_BASE_URL = "https://registry.modelcontextprotocol.io";
|
|
3
|
+
const HTTP_OK = 200;
|
|
4
|
+
const HTTP_NOT_FOUND = 404;
|
|
5
|
+
/** The registry's endpoint for one version of one server. The name carries a `/` (`io.github.<owner>/<repo>`) that must stay inside a single path segment. */
|
|
6
|
+
export function registryVersionUrl(name, version) {
|
|
7
|
+
return `${REGISTRY_BASE_URL}/v0/servers/${encodeURIComponent(name)}/versions/${encodeURIComponent(version)}`;
|
|
8
|
+
}
|
|
9
|
+
/** Reads the status of a {@link registryVersionUrl} response: 200 means listed, 404 means not listed. Any other status says nothing about whether the version is listed, so it throws and fails the job to be re-run, never guessing either way. */
|
|
10
|
+
export function isPublishedOnRegistry(status) {
|
|
11
|
+
if (status === HTTP_OK)
|
|
12
|
+
return true;
|
|
13
|
+
if (status === HTTP_NOT_FOUND)
|
|
14
|
+
return false;
|
|
15
|
+
throw new Error(`MCP registry answered ${String(status)} when asked whether the version is listed`);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=mcp-registry-version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-registry-version.js","sourceRoot":"","sources":["../../src/core/mcp-registry-version.ts"],"names":[],"mappings":"AAAA,qaAAqa;AACra,MAAM,iBAAiB,GAAG,0CAA0C,CAAC;AACrE,MAAM,OAAO,GAAG,GAAG,CAAC;AACpB,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,8JAA8J;AAC9J,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,OAAe;IAC9D,OAAO,GAAG,iBAAiB,eAAe,kBAAkB,CAAC,IAAI,CAAC,aAAa,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;AAC/G,CAAC;AAED,oPAAoP;AACpP,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,MAAM,KAAK,cAAc;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,IAAI,KAAK,CACb,yBAAyB,MAAM,CAAC,MAAM,CAAC,2CAA2C,CACnF,CAAC;AACJ,CAAC"}
|
|
@@ -40,6 +40,14 @@ describe("isRetryablePublishFailure", () => {
|
|
|
40
40
|
const output = "Error: publish failed: server returned status 504: <html>";
|
|
41
41
|
expect(isRetryablePublishFailure(output)).toBe(true);
|
|
42
42
|
});
|
|
43
|
+
it("recognises the registry's own database running out of connection slots, which it reports as an HTTP 400 and not a 5xx: the request was valid and the registry could not begin a transaction for it (ExaDev/agent-comms release run 39670379457, v8.15.4), so the 5xx pattern never matched and the release job failed without a single retry", () => {
|
|
44
|
+
const output = 'Error: publish failed: server returned status 400: {"title":"Bad Request","status":400,"detail":"Failed to publish server","errors":[{"message":"failed to begin transaction: failed to connect to `user=app database=app`:\\n\\t34.118.233.51:5432 (registry-pg-rw.default): server error: FATAL: remaining connection slots are reserved for roles with the SUPERUSER attribute (SQLSTATE 53300)"}]}';
|
|
45
|
+
expect(isRetryablePublishFailure(output)).toBe(true);
|
|
46
|
+
});
|
|
47
|
+
it("does not retry a database error that is not a resource shortage, such as a constraint violation, which a retry would hit again", () => {
|
|
48
|
+
const output = 'Error: publish failed: server returned status 400: {"title":"Bad Request","status":400,"detail":"Failed to publish server","errors":[{"message":"duplicate key value violates unique constraint (SQLSTATE 23505)"}]}';
|
|
49
|
+
expect(isRetryablePublishFailure(output)).toBe(false);
|
|
50
|
+
});
|
|
43
51
|
it("does not retry a 4xx other than the specific propagation-lag 404 -- a genuinely invalid publish request, which retrying can never fix", () => {
|
|
44
52
|
const output = "Error: publish failed: server returned status 400: Bad Request";
|
|
45
53
|
expect(isRetryablePublishFailure(output)).toBe(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-registry-retry.unit.test.js","sourceRoot":"","sources":["../../src/test/mcp-registry-retry.unit.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mcp-registry-retry.unit.test.js","sourceRoot":"","sources":["../../src/test/mcp-registry-retry.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-registry-version.unit.test.d.ts","sourceRoot":"","sources":["../../src/test/mcp-registry-version.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { isPublishedOnRegistry, registryVersionUrl, } from "../core/mcp-registry-version.js";
|
|
3
|
+
const HTTP_OK = 200;
|
|
4
|
+
const HTTP_NOT_FOUND = 404;
|
|
5
|
+
const HTTP_BAD_GATEWAY = 502;
|
|
6
|
+
describe("registryVersionUrl", () => {
|
|
7
|
+
it("encodes the namespace separator so the server name stays one path segment", () => {
|
|
8
|
+
expect(registryVersionUrl("io.github.ExaDev/agent-comms", "8.15.4")).toBe("https://registry.modelcontextprotocol.io/v0/servers/io.github.ExaDev%2Fagent-comms/versions/8.15.4");
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
describe("isPublishedOnRegistry", () => {
|
|
12
|
+
it("treats a 200 as published", () => {
|
|
13
|
+
expect(isPublishedOnRegistry(HTTP_OK)).toBe(true);
|
|
14
|
+
});
|
|
15
|
+
it("treats a 404 as not published, which is what makes a missed publish detectable", () => {
|
|
16
|
+
expect(isPublishedOnRegistry(HTTP_NOT_FOUND)).toBe(false);
|
|
17
|
+
});
|
|
18
|
+
it("refuses to guess from any other status, since publishing a version the registry already lists fails the job", () => {
|
|
19
|
+
expect(() => isPublishedOnRegistry(HTTP_BAD_GATEWAY)).toThrow(String(HTTP_BAD_GATEWAY));
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=mcp-registry-version.unit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-registry-version.unit.test.js","sourceRoot":"","sources":["../../src/test/mcp-registry-version.unit.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,iCAAiC,CAAC;AAEzC,MAAM,OAAO,GAAG,GAAG,CAAC;AACpB,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,CAAC,kBAAkB,CAAC,8BAA8B,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CACvE,oGAAoG,CACrG,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;QACxF,MAAM,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6GAA6G,EAAE,GAAG,EAAE;QACrH,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAC3D,MAAM,CAAC,gBAAgB,CAAC,CACzB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED