mirror of
https://github.com/anomalyco/opencode.git
synced 2026-07-23 18:55:37 -04:00
66 lines
2.1 KiB
TypeScript
66 lines
2.1 KiB
TypeScript
export * as Permission from "./permission"
|
|
|
|
import { Schema } from "effect"
|
|
import { optional } from "./schema"
|
|
import { define, inventory } from "./event"
|
|
import { ascending } from "./identifier"
|
|
import { SessionID } from "./session-id"
|
|
import { statics } from "./schema"
|
|
|
|
export const ID = Schema.String.check(Schema.isStartsWith("per")).pipe(
|
|
Schema.brand("PermissionV2.ID"),
|
|
statics((schema) => ({ create: (id?: string) => schema.make(id ?? "per_" + ascending()) })),
|
|
)
|
|
export type ID = typeof ID.Type
|
|
|
|
export const Source = Schema.Union([
|
|
Schema.Struct({
|
|
type: Schema.Literal("tool"),
|
|
messageID: Schema.String,
|
|
callID: Schema.String,
|
|
}),
|
|
]).annotate({ identifier: "PermissionV2.Source" })
|
|
export type Source = typeof Source.Type
|
|
|
|
const RequestFields = {
|
|
sessionID: SessionID,
|
|
action: Schema.String,
|
|
resources: Schema.Array(Schema.String),
|
|
save: Schema.Array(Schema.String).pipe(optional),
|
|
metadata: Schema.Record(Schema.String, Schema.Unknown).pipe(optional),
|
|
source: Source.pipe(optional),
|
|
}
|
|
|
|
export const Request = Schema.Struct({
|
|
id: ID,
|
|
...RequestFields,
|
|
}).annotate({ identifier: "PermissionV2.Request" })
|
|
export interface Request extends Schema.Schema.Type<typeof Request> {}
|
|
|
|
export const Reply = Schema.Literals(["once", "always", "reject"]).annotate({ identifier: "PermissionV2.Reply" })
|
|
export type Reply = typeof Reply.Type
|
|
|
|
const Asked = define({ type: "permission.v2.asked", schema: Request.fields })
|
|
const Replied = define({
|
|
type: "permission.v2.replied",
|
|
schema: {
|
|
sessionID: SessionID,
|
|
requestID: ID,
|
|
reply: Reply,
|
|
},
|
|
})
|
|
export const Event = { Asked, Replied, Definitions: inventory(Asked, Replied) }
|
|
|
|
export const Effect = Schema.Literals(["allow", "deny", "ask"]).annotate({ identifier: "PermissionV2.Effect" })
|
|
export type Effect = typeof Effect.Type
|
|
|
|
export interface Rule extends Schema.Schema.Type<typeof Rule> {}
|
|
export const Rule = Schema.Struct({
|
|
action: Schema.String,
|
|
resource: Schema.String,
|
|
effect: Effect,
|
|
}).annotate({ identifier: "PermissionV2.Rule" })
|
|
|
|
export const Ruleset = Schema.Array(Rule).annotate({ identifier: "PermissionV2.Ruleset" })
|
|
export type Ruleset = typeof Ruleset.Type
|