From 662b805ffb35c1d94a00cc7542a545a6950c678b Mon Sep 17 00:00:00 2001 From: phucnguyen1707 Date: Tue, 16 Jun 2026 11:31:31 +0700 Subject: [PATCH] Reject unknown task assignees --- packages/agentstack/src/index.test.ts | 33 +++++++++++++++++++-------- packages/agentstack/src/index.ts | 17 ++++++++------ 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/packages/agentstack/src/index.test.ts b/packages/agentstack/src/index.test.ts index 1e7cd45..8ad492c 100644 --- a/packages/agentstack/src/index.test.ts +++ b/packages/agentstack/src/index.test.ts @@ -109,16 +109,29 @@ describe("AgentStack coordinator", () => { expect(listener).toHaveBeenCalledWith(expect.objectContaining({ type: "delegation.granted" })); }); - it("rejects unknown agents and invalid DIDs", () => { - const stack = new AgentStack(); - expect(() => stack.createTask({ ownerDid: "nope", sourceApp: "x", title: "t" })).toThrow(); - const task = stack.createTask({ ownerDid: owner, sourceApp: "x", title: "t" }); - expect(() => stack.assignTask(task.id, agentDid("ghost"))).toThrow(/Unknown agent/); - }); - - it("filters tasks in snapshots", () => { - const stack = new AgentStack(); - stack.createTask({ ownerDid: owner, sourceApp: "x", title: "a" }); + it("rejects unknown agents and invalid DIDs", () => { + const stack = new AgentStack(); + expect(() => stack.createTask({ ownerDid: "nope", sourceApp: "x", title: "t" })).toThrow(); + const task = stack.createTask({ ownerDid: owner, sourceApp: "x", title: "t" }); + expect(() => stack.assignTask(task.id, agentDid("ghost"))).toThrow(/Unknown agent/); + }); + + it("rejects tasks preassigned to unknown agents", () => { + const stack = new AgentStack(); + expect(() => + stack.createTask({ + ownerDid: owner, + sourceApp: "ugig.net", + title: "Ghost assignment", + assigneeDid: agentDid("ghost") + }) + ).toThrow(/Unknown agent/); + expect(stack.listTasks({ assigneeDid: agentDid("ghost") })).toHaveLength(0); + }); + + it("filters tasks in snapshots", () => { + const stack = new AgentStack(); + stack.createTask({ ownerDid: owner, sourceApp: "x", title: "a" }); stack.createTask({ ownerDid: userDid("999"), sourceApp: "x", title: "b" }); expect(stack.listTasks({ ownerDid: owner })).toHaveLength(1); expect(stack.snapshot().tasks).toHaveLength(2); diff --git a/packages/agentstack/src/index.ts b/packages/agentstack/src/index.ts index 92f84ef..52e0ce4 100644 --- a/packages/agentstack/src/index.ts +++ b/packages/agentstack/src/index.ts @@ -83,13 +83,16 @@ export class AgentStack { return this.agents.get(did); } - createTask(input: CreateTaskInput): DidTask { - if (!parseDid(input.ownerDid)) { - throw new Error(`Invalid owner DID: ${input.ownerDid}`); - } - const ts = this.now(); - const task: DidTask = { - id: this.nextId("task"), + createTask(input: CreateTaskInput): DidTask { + if (!parseDid(input.ownerDid)) { + throw new Error(`Invalid owner DID: ${input.ownerDid}`); + } + if (input.assigneeDid && !this.agents.has(input.assigneeDid)) { + throw new Error(`Unknown agent: ${input.assigneeDid}`); + } + const ts = this.now(); + const task: DidTask = { + id: this.nextId("task"), ownerDid: input.ownerDid, assigneeDid: input.assigneeDid, sourceApp: input.sourceApp,