Skip to content

Commit 048e2b6

Browse files
authored
fix(agents): grant Worker manage permission to users (#4512)
## Motivation The Horton default permission fix in #4511 left the built-in Worker type with the same gap: all user principals can spawn Worker by default, but they do not receive manage permission on the Worker entity type. That makes Worker inconsistent with the intended default built-in type permissions and leaves existing servers without the grant after upgrade. ## Changes - Add a `principal_kind=user` `manage` grant to the built-in Worker registration payload alongside the existing `spawn` grant. - Add an agents-server migration that backfills a permanent user manage grant for every existing tenant-scoped `worker` entity type when the matching non-expiring grant is missing. - Update built-in registration coverage to assert Worker includes both default user grants. - Add a patch changeset for `@electric-ax/agents` and `@electric-ax/agents-server`.
1 parent 5f96a15 commit 048e2b6

5 files changed

Lines changed: 48 additions & 0 deletions

File tree

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@electric-ax/agents": patch
3+
"@electric-ax/agents-server": patch
4+
---
5+
6+
Grant all users manage permission on the built-in Worker entity type by default, and backfill existing agents-server installations that already registered Worker without that grant.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
INSERT INTO "entity_type_permission_grants" (
2+
"tenant_id",
3+
"entity_type",
4+
"permission",
5+
"subject_kind",
6+
"subject_value"
7+
)
8+
SELECT
9+
"entity_types"."tenant_id",
10+
"entity_types"."name",
11+
'manage',
12+
'principal_kind',
13+
'user'
14+
FROM "entity_types"
15+
WHERE "entity_types"."name" = 'worker'
16+
AND NOT EXISTS (
17+
SELECT 1
18+
FROM "entity_type_permission_grants"
19+
WHERE "entity_type_permission_grants"."tenant_id" = "entity_types"."tenant_id"
20+
AND "entity_type_permission_grants"."entity_type" = "entity_types"."name"
21+
AND "entity_type_permission_grants"."permission" = 'manage'
22+
AND "entity_type_permission_grants"."subject_kind" = 'principal_kind'
23+
AND "entity_type_permission_grants"."subject_value" = 'user'
24+
AND "entity_type_permission_grants"."expires_at" IS NULL
25+
);

packages/agents-server/drizzle/meta/_journal.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,13 @@
9292
"when": 1780584581000,
9393
"tag": "0012_horton_user_manage_permission",
9494
"breakpoints": true
95+
},
96+
{
97+
"idx": 13,
98+
"version": "7",
99+
"when": 1780588695000,
100+
"tag": "0013_worker_user_manage_permission",
101+
"breakpoints": true
95102
}
96103
]
97104
}

packages/agents/src/agents/worker.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,11 @@ export function registerWorker(
308308
subject_value: `user`,
309309
permission: `spawn`,
310310
},
311+
{
312+
subject_kind: `principal_kind`,
313+
subject_value: `user`,
314+
permission: `manage`,
315+
},
311316
],
312317
async handler(ctx) {
313318
const args = parseWorkerArgs(ctx.args)

packages/agents/test/builtin-pull-wake-registration.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,11 @@ describe(`BuiltinAgentsServer pull-wake registration`, () => {
135135
subject_value: `user`,
136136
permission: `spawn`,
137137
})
138+
expect(worker?.permission_grants).toContainEqual({
139+
subject_kind: `principal_kind`,
140+
subject_value: `user`,
141+
permission: `manage`,
142+
})
138143
})
139144

140145
it(`registers through tenant path-prefixed server URLs`, async () => {

0 commit comments

Comments
 (0)