Skip to content

Commit 45a2ed9

Browse files
authored
feat(core): per-session permission rules (#48351)
1 parent f633354 commit 45a2ed9

32 files changed

Lines changed: 362 additions & 54 deletions

File tree

‎packages/client/src/effect/api/api.ts‎

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import type { RelativePath } from "@opencode/schema/schema"
1111
import type { Brand } from "effect"
1212
import type { Model } from "@opencode/schema/model"
1313
import type { DateTime } from "effect"
14+
import type { Permission } from "@opencode/schema/permission"
1415
import type { SessionMessage } from "@opencode/schema/session-message"
1516
import type { SessionInbox } from "@opencode/schema/session-inbox"
1617
import type { PromptInput } from "@opencode/schema/prompt-input"
@@ -26,7 +27,6 @@ import type { Integration } from "@opencode/schema/integration"
2627
import type { Form } from "@opencode/schema/form"
2728
import type { Mcp } from "@opencode/schema/mcp"
2829
import type { Credential } from "@opencode/schema/credential"
29-
import type { Permission } from "@opencode/schema/permission"
3030
import type { PermissionSaved } from "@opencode/schema/permission-saved"
3131
import type { FileSystem } from "@opencode/schema/filesystem"
3232
import type { Command } from "@opencode/schema/command"
@@ -209,6 +209,7 @@ export type SessionCreateInput = {
209209
readonly model?: Model.Ref | undefined
210210
readonly location?: Location.Ref | undefined
211211
readonly metadata?: Session.Metadata | undefined
212+
readonly permissions?: Permission.Ruleset | undefined
212213
}
213214
export type SessionCreateOutput = Session.Info
214215
export type SessionCreateOperation<E = never> = (input?: SessionCreateInput) => Effect.Effect<SessionCreateOutput, E>
@@ -437,6 +438,7 @@ export type SessionLogOutput =
437438
readonly agent?: Agent.ID | undefined
438439
readonly model?: Model.Ref | undefined
439440
readonly metadata?: Session.Metadata | undefined
441+
readonly permissions?: Permission.Ruleset | undefined
440442
readonly version: string
441443
}
442444
}
@@ -489,6 +491,15 @@ export type SessionLogOutput =
489491
readonly location?: Location.Ref | undefined
490492
readonly data: { readonly sessionID: Session.ID; readonly title: string }
491493
}
494+
| {
495+
readonly id: Event.ID
496+
readonly created: number
497+
readonly metadata?: { readonly [x: string]: unknown } | undefined
498+
readonly type: "session.permissions.updated"
499+
readonly durable: { readonly aggregateID: string; readonly seq: Event.Seq; readonly version: Event.Version }
500+
readonly location?: Location.Ref | undefined
501+
readonly data: { readonly sessionID: Session.ID; readonly permissions: Permission.Ruleset }
502+
}
492503
| {
493504
readonly id: Event.ID
494505
readonly created: number
@@ -1585,13 +1596,20 @@ export type PermissionReplyOperation<E = never> = (
15851596
input: PermissionReplyInput,
15861597
) => Effect.Effect<PermissionReplyOutput, E>
15871598

1599+
export type PermissionRulesInput = { readonly sessionID: Session.ID; readonly permissions: Permission.Ruleset }
1600+
export type PermissionRulesOutput = void
1601+
export type PermissionRulesOperation<E = never> = (
1602+
input: PermissionRulesInput,
1603+
) => Effect.Effect<PermissionRulesOutput, E>
1604+
15881605
export interface PermissionApi<E = never> {
15891606
readonly request: { readonly list: PermissionRequestListOperation<E> }
15901607
readonly saved: { readonly list: PermissionSavedListOperation<E>; readonly remove: PermissionSavedRemoveOperation<E> }
15911608
readonly create: PermissionCreateOperation<E>
15921609
readonly list: PermissionListOperation<E>
15931610
readonly get: PermissionGetOperation<E>
15941611
readonly reply: PermissionReplyOperation<E>
1612+
readonly rules: PermissionRulesOperation<E>
15951613
}
15961614

15971615
export type FileListInput = {

‎packages/client/src/effect/generated/client.ts‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,8 @@ import type {
181181
PermissionGetOutput,
182182
PermissionReplyInput,
183183
PermissionReplyOutput,
184+
PermissionRulesInput,
185+
PermissionRulesOutput,
184186
FileListInput,
185187
FileListOutput,
186188
FileFindInput,
@@ -395,6 +397,7 @@ const EndpointSessionCreate = (raw: RawClient["server.session"]) => (input?: Ses
395397
model: input?.["model"],
396398
location: input?.["location"],
397399
metadata: input?.["metadata"],
400+
permissions: input?.["permissions"],
398401
},
399402
}).pipe(
400403
Effect.mapError(mapClientError),
@@ -1145,13 +1148,22 @@ const EndpointPermissionReply = (raw: RawClient["server.permission"]) => (input:
11451148
}).pipe(Effect.mapError(mapClientError)),
11461149
)
11471150

1151+
const EndpointPermissionRules = (raw: RawClient["server.permission"]) => (input: PermissionRulesInput) =>
1152+
preserveEffect<PermissionRulesOutput>()(
1153+
raw["session.permission.rules"]({
1154+
params: { sessionID: input["sessionID"] },
1155+
payload: { permissions: input["permissions"] },
1156+
}).pipe(Effect.mapError(mapClientError)),
1157+
)
1158+
11481159
const adaptGroupPermission = (raw: RawClient["server.permission"]) => ({
11491160
request: { list: EndpointPermissionRequestList(raw) },
11501161
saved: { list: EndpointPermissionSavedList(raw), remove: EndpointPermissionSavedRemove(raw) },
11511162
create: EndpointPermissionCreate(raw),
11521163
list: EndpointPermissionList(raw),
11531164
get: EndpointPermissionGet(raw),
11541165
reply: EndpointPermissionReply(raw),
1166+
rules: EndpointPermissionRules(raw),
11551167
})
11561168

11571169
const EndpointFileList = (raw: RawClient["server.fs"]) => (input?: FileListInput) =>

‎packages/client/src/promise/generated/client.ts‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@ import type {
175175
PermissionGetOutput,
176176
PermissionReplyInput,
177177
PermissionReplyOutput,
178+
PermissionRulesInput,
179+
PermissionRulesOutput,
178180
FileReadInput,
179181
FileReadOutput,
180182
FileListInput,
@@ -565,6 +567,7 @@ export function make(options: ClientOptions) {
565567
model: input?.["model"],
566568
location: input?.["location"],
567569
metadata: input?.["metadata"],
570+
permissions: input?.["permissions"],
568571
},
569572
successStatus: 200,
570573
declaredStatuses: [400, 401],
@@ -1566,6 +1569,18 @@ export function make(options: ClientOptions) {
15661569
},
15671570
requestOptions,
15681571
),
1572+
rules: (input: PermissionRulesInput, requestOptions?: RequestOptions) =>
1573+
request<PermissionRulesOutput>(
1574+
{
1575+
method: "PUT",
1576+
path: `/api/session/${encodeURIComponent(input.sessionID)}/permission/rules`,
1577+
body: { permissions: input["permissions"] },
1578+
successStatus: 204,
1579+
declaredStatuses: [400, 401, 404],
1580+
empty: true,
1581+
},
1582+
requestOptions,
1583+
),
15691584
},
15701585
file: {
15711586
read: (input: FileReadInput, requestOptions?: RequestOptions) =>

0 commit comments

Comments
 (0)