Permissions
Pending permission requests and the reply that approves or denies one.
Send these requests to your own running server. Values stay in this browser.
How this works
Start a server with nikcli serve --hostname 127.0.0.1 --port 4096. Requests go
straight from this page to that address — the browser allows it because loopback counts as a
secure origin, and the server allows it because nikcli-ai.dev is in its CORS
allowlist.
To try things without touching your real sessions or config, start the server with
NIKCLI_TEST_HOME pointed at a throwaway directory — see
the guided tour.
Operations
3 endpoints, generated from the
server's own OpenAPI document. Every path also accepts the
directory and workspace query parameters that select which instance
handles the request.
| get | /permission | permission.list |
| get | /permission/blocked | permission.blocked |
| post | /permission/{requestID}/reply | permission.reply |
permission.list | Name | In | Type | Required |
|---|---|---|---|
| directory | query | string | optional |
| workspace | query | string | optional |
({ id: string sessionID: string permission: string patterns: string[] metadata: { [key: string]: unknown } always: string[] tool?: | { messageID: string callID: string } | null })[]
Example response captured
[] SDK example
import { createNikcliClient } from "@nikcli-ai/sdk/httpapi"
const client = createNikcliClient()
await client.permission.list({
...
}) Try it
permission.blocked | Name | In | Type | Required |
|---|---|---|---|
| directory | query | string | optional |
| workspace | query | string | optional |
({ id: string sessionID: string permission: string patterns: string[] rule: string reason: string time: | number | "Infinity" | "-Infinity" | "NaN" tool?: | { messageID: string callID: string } | null })[]
Example response from schema
[
{
"id": "",
"sessionID": "",
"permission": "",
"patterns": [
""
],
"rule": "",
"reason": "",
"time": 0,
"tool": {
"messageID": "",
"callID": ""
}
}
] Generated from the response schema — field values are placeholders, the shape is real.
SDK example
import { createNikcliClient } from "@nikcli-ai/sdk/httpapi"
const client = createNikcliClient()
await client.permission.blocked({
...
}) Try it
permission.reply | Name | In | Type | Required |
|---|---|---|---|
| requestID | path | string | required |
| directory | query | string | optional |
| workspace | query | string | optional |
{ reply: PermissionReply message?: string | null }
boolean Example response from schema
false
Generated from the response schema — field values are placeholders, the shape is real.
SDK example
import { createNikcliClient } from "@nikcli-ai/sdk/httpapi"
const client = createNikcliClient()
await client.permission.reply({
...
}) Try it
Schemas
The 4 schemas reachable from these endpoints. Each is shown one level
deep; nested types link to their own entry below.
Names ending in _2, _3 and so on are the OpenAPI emitter
disambiguating same-named schemas declared by different HttpApi groups — they are distinct
shapes, not duplicates.
{ id: string sessionID: string permission: string patterns: string[] rule: string reason: string time: | number | "Infinity" | "-Infinity" | "NaN" tool?: | { messageID: string callID: string } | null }
"once" | "always" | "reject"
{ reply: PermissionReply message?: string | null }
{ id: string sessionID: string permission: string patterns: string[] metadata: { [key: string]: unknown } always: string[] tool?: | { messageID: string callID: string } | null }