mirror of
https://github.com/saltbo/agent-kanban.git
synced 2026-09-19 09:01:47 +08:00
96fdd70d2c
* feat(api)!: redesign task resource operations
Publish the complete resource-oriented OpenAPI contract, enforce scope-based authorization at the HTTP boundary, and replace lifecycle command routes with Task PATCH and nested Claim/Event resources.
Add server-side Task CAS, migration coverage, updated Agent Skills, and browser/API regression tests.
BREAKING CHANGE: remove the legacy task lifecycle endpoints and move bounded waits to /tasks/{taskId}/events.
* refactor(tasks)!: make claims create-only
Remove Task Claim retrieval and deletion routes, the release scope, live deletion logic, and release workflow guidance.
Keep historical release records readable for migration and audit compatibility.
BREAKING CHANGE: remove GET and DELETE /tasks/{taskId}/claims/{claimId} and the task:release scope.
* test(ci): align actor and projection contracts
Cover machine and service Task Action writes and update Agent detail fixtures to the canonical assignedTo query and paged lowerCamelCase response.
* fix(api): preserve merge patch fields and consume browser pagination
* test(ui): include terminal pagination in agent task fixture
---------
Co-authored-by: jarvis <jarvis@agents.realmroot.dev>
24 lines
1007 B
TypeScript
24 lines
1007 B
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { resolveActor } from "../../../server/http/resource-server/request";
|
|
|
|
describe("resolveActor", () => {
|
|
it.each([
|
|
["human", undefined, "human-subject", "user", "human-subject"],
|
|
["agent", "agent-actor", "controller-subject", "realmroot:agent", "agent-actor"],
|
|
["machine", "machine-actor", "machine-subject", "machine", "machine-actor"],
|
|
["service", undefined, "service-subject", "service", "service-subject"],
|
|
] as const)("preserves a %s principal as the canonical Task actor", (type, actorId, subjectId, actorType, expectedActorId) => {
|
|
const context = contextWith({ principal: { type, actorId, subjectId } });
|
|
|
|
expect(resolveActor(context)).toEqual({ actorType, actorId: expectedActorId, sessionId: null });
|
|
});
|
|
});
|
|
|
|
function contextWith(values: Record<string, unknown>): Parameters<typeof resolveActor>[0] {
|
|
return {
|
|
get(key: string) {
|
|
return values[key];
|
|
},
|
|
} as Parameters<typeof resolveActor>[0];
|
|
}
|