# ctx.permission `PermissionService` — provided by `@deepseek-ai/dsh-permission`. Owns the deployment's permission presets and their write path. Requires a confining `ctx.bash` executor and `ctx.approval`; unmatched knob values are reported as CUSTOM_PRESET, not an error. [Source](https://github.com/deepseek-harness/deepseek-harness/blob/master/packages/ui/permission/src/index.ts#L94) ### ctx.permission.names ```ts website-api get names(): readonly string[] ``` The advertised preset names, in the preset table's declaration order. [Source](https://github.com/deepseek-harness/deepseek-harness/blob/master/packages/ui/permission/src/index.ts#L134) ### ctx.permission.current(events) ```ts website-api current(events: readonly SessionEvent[]): string ``` Resolve the preset matching the effective knob values. A still-matching last selection wins shared-bundle ties; otherwise the first table match wins, or CUSTOM_PRESET when no entry matches. - `events` — the session's events in log order. **Returns** the effective preset name, or `custom` when nothing matches. [Source](https://github.com/deepseek-harness/deepseek-harness/blob/master/packages/ui/permission/src/index.ts#L145) ### ctx.permission.resolve(name) ```ts website-api resolve(name: string): PresetSpec ``` Resolve a preset's knob bundle. - `name` — the preset name to resolve. **Returns** the configured bundle. [Source](https://github.com/deepseek-harness/deepseek-harness/blob/master/packages/ui/permission/src/index.ts#L166) ### ctx.permission.optionOf(name) ```ts website-api optionOf(name: string): PresetOption ``` Build the client option for a table entry or CUSTOM_PRESET. A missing label falls back to the table key. - `name` — a table key, or `custom`. **Returns** the option a client renders. [Source](https://github.com/deepseek-harness/deepseek-harness/blob/master/packages/ui/permission/src/index.ts#L181) ### ctx.permission.set(session, name) ```ts website-api set(session: Session, name: string): void ``` Record a changed preset, then update each changed knob through its own setter. Selecting the effective preset again appends nothing. - `session` — the session the switch belongs to. - `name` — the preset to switch to; unknown names throw. [Source](https://github.com/deepseek-harness/deepseek-harness/blob/master/packages/ui/permission/src/index.ts#L195)