From 8110fea12b6afeb20e4a4ffba0b44de5a44a73d9 Mon Sep 17 00:00:00 2001 From: rissrice2105-agent Date: Sun, 21 Jun 2026 18:28:55 -0600 Subject: [PATCH] fix(agentstack): reject malformed CoinPay DIDs --- packages/agentstack/src/index.test.ts | 11 ++++++----- packages/agentstack/src/index.ts | 16 +++++++++------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/packages/agentstack/src/index.test.ts b/packages/agentstack/src/index.test.ts index 2e88676..3c76a6f 100644 --- a/packages/agentstack/src/index.test.ts +++ b/packages/agentstack/src/index.test.ts @@ -26,11 +26,12 @@ describe("DID helpers", () => { expect(parseDid(agentDid("abc"))).toEqual({ kind: "agent", id: "abc" }); }); - it("rejects non-CoinPay DIDs", () => { - expect(parseDid("did:web:example.com")).toBeNull(); - expect(parseDid("did:coinpay:bot:abc")).toBeNull(); - }); -}); + it("rejects non-CoinPay DIDs", () => { + expect(parseDid("did:web:example.com")).toBeNull(); + expect(parseDid("did:coinpay:bot:abc")).toBeNull(); + expect(parseDid("did:coinpay:user:abc:extra")).toBeNull(); + }); +}); describe("AgentStack manifest", () => { it("is a valid LogicSRC plugin manifest", () => { diff --git a/packages/agentstack/src/index.ts b/packages/agentstack/src/index.ts index 496f795..e968f0f 100644 --- a/packages/agentstack/src/index.ts +++ b/packages/agentstack/src/index.ts @@ -22,13 +22,15 @@ export const userDid = (id: string) => makeDid("user", id); export const agentDid = (id: string) => makeDid("agent", id); /** Parse a CoinPay DID into its kind and id, or return null if it is not one. */ -export function parseDid(did: string): { kind: DidKind; id: string } | null { - const prefix = `${DID_METHOD}:`; - if (!did.startsWith(prefix)) return null; - const [kind, id] = did.slice(prefix.length).split(":"); - if ((kind !== "user" && kind !== "agent") || !id) return null; - return { kind, id }; -} +export function parseDid(did: string): { kind: DidKind; id: string } | null { + const prefix = `${DID_METHOD}:`; + if (!did.startsWith(prefix)) return null; + const parts = did.slice(prefix.length).split(":"); + if (parts.length !== 2) return null; + const [kind, id] = parts; + if ((kind !== "user" && kind !== "agent") || !id) return null; + return { kind, id }; +} export function isDidTask(value: unknown): value is DidTask { return (