pi-openai-toolkit 0.14.13 → 0.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +250 -241
- package/README.zh.md +250 -241
- package/config.schema.json +352 -0
- package/docs/configuration.md +176 -0
- package/docs/internals.md +139 -128
- package/package.json +135 -127
- package/src/auto-mode/extension.ts +35 -13
- package/src/config/legacy.ts +717 -0
- package/src/config/migration.ts +100 -0
- package/src/config/notifications.ts +28 -0
- package/src/config/policy.ts +122 -0
- package/src/config/v2.ts +1347 -0
- package/src/config-command.ts +73 -0
- package/src/config.ts +318 -739
- package/src/context-management/tools.ts +353 -347
- package/src/context-management/window-manager.ts +696 -693
- package/src/debug.ts +5 -5
- package/src/deferred-tool-carryover.ts +3 -1
- package/src/extension-runtime.ts +1375 -1329
- package/src/image-generation/extension.ts +14 -18
- package/src/image-generation/protocol.ts +10 -4
- package/src/image-generation/service.ts +9 -3
- package/src/request-context-cache.ts +2 -1
- package/src/types.ts +641 -628
- package/src/web-search/alpha-client.ts +876 -875
- package/src/web-search/extension.ts +529 -523
- package/src/web-search/payload.ts +299 -295
- package/src/web-search/prompt.ts +60 -59
- package/src/web-search/types.ts +144 -144
package/README.md
CHANGED
|
@@ -1,241 +1,250 @@
|
|
|
1
|
-
# pi-openai-toolkit
|
|
2
|
-
|
|
3
|
-
Add Codex context windows, Responses compaction, hosted tools, and reviewed tool calls to Pi.
|
|
4
|
-
|
|
5
|
-
[](https://www.npmjs.com/package/pi-openai-toolkit)
|
|
6
|
-
[](LICENSE)
|
|
7
|
-
|
|
8
|
-
[简体中文](README.zh.md)
|
|
9
|
-
|
|
10
|
-
## Features
|
|
11
|
-
|
|
12
|
-
| Feature | Use it to |
|
|
13
|
-
| --- | --- |
|
|
14
|
-
| Codex Remote Context |
|
|
15
|
-
| Remote Compaction v2 | Continue an eligible Responses session with an encrypted server checkpoint. |
|
|
16
|
-
| Web Search routes | Choose local `pi-web-access`, hosted Responses `web_search`, or CPA standalone `
|
|
17
|
-
| Image generation |
|
|
18
|
-
| Tool-call review |
|
|
19
|
-
|
|
20
|
-
The package uses Pi's existing model, authentication, and session configuration. It does not add a provider or model.
|
|
21
|
-
|
|
22
|
-
## Install
|
|
23
|
-
|
|
24
|
-
Requires Pi 0.85.1 or newer and Node.js 22.19.0 or newer.
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
"
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
"
|
|
83
|
-
"
|
|
84
|
-
"
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
{
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
{
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
"
|
|
147
|
-
"
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
|
209
|
-
|
|
|
210
|
-
| `
|
|
211
|
-
| `
|
|
212
|
-
| `
|
|
213
|
-
| `
|
|
214
|
-
| `
|
|
215
|
-
| `
|
|
216
|
-
| `
|
|
217
|
-
| `
|
|
218
|
-
| `
|
|
219
|
-
| `
|
|
220
|
-
| `
|
|
221
|
-
| `
|
|
222
|
-
| `
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
## Development
|
|
229
|
-
|
|
230
|
-
From the repository root, after dependencies are installed:
|
|
231
|
-
|
|
232
|
-
```bash
|
|
233
|
-
npm run typecheck
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
1
|
+
# pi-openai-toolkit
|
|
2
|
+
|
|
3
|
+
Add Codex context windows, Responses compaction, hosted tools, and reviewed tool calls to Pi.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/pi-openai-toolkit)
|
|
6
|
+
[](LICENSE)
|
|
7
|
+
|
|
8
|
+
[简体中文](README.zh.md)
|
|
9
|
+
|
|
10
|
+
## Features
|
|
11
|
+
|
|
12
|
+
| Feature | Use it to |
|
|
13
|
+
| --- | --- |
|
|
14
|
+
| Codex Remote Context | Use the adapted Codex window protocol to start a new context window and retrieve earlier windows with `history`. |
|
|
15
|
+
| Remote Compaction v2 | Continue an eligible Responses session with an encrypted server checkpoint. |
|
|
16
|
+
| Web Search routes | Choose local `pi-web-access`, hosted Responses `web_search`, or experimental CPA standalone `web_run` per exact model. |
|
|
17
|
+
| Image generation | Call the hosted Responses image tool to generate images or edit explicitly supplied local references. |
|
|
18
|
+
| Tool-call review | Use Toolkit's approval gate to ask a reviewer model whether selected tool calls may run. |
|
|
19
|
+
|
|
20
|
+
The package uses Pi's existing model, authentication, and session configuration. It does not add a provider or model.
|
|
21
|
+
|
|
22
|
+
## Install
|
|
23
|
+
|
|
24
|
+
Requires Pi 0.85.1 or newer and Node.js 22.19.0 or newer.
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
pi install npm:pi-openai-toolkit
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Use `--local` to install the extension in the current project. Toolkit policy is still global; there are no project or environment policy overlays.
|
|
31
|
+
|
|
32
|
+
Without a config file, Remote Compaction v2 is enabled for eligible models, Remote Context windows are off, search is unmanaged, image generation is disabled, and Auto Mode is unavailable. These defaults do not verify backend support.
|
|
33
|
+
|
|
34
|
+
The only Toolkit config file is:
|
|
35
|
+
|
|
36
|
+
`~/.pi/agent/extensions/pi-openai-toolkit/config.json`
|
|
37
|
+
|
|
38
|
+
All JSON examples below except the Pi model-registration example use **configuration schema v2**. Create the file and parent directory if absent. Merge examples into an existing v2 document, keeping its other settings. An unversioned legacy file remains supported: do not add v2 fields to it or overwrite it with an example. First use `/toolkit-config migration-preview`; the [configuration reference](docs/configuration.md) explains the review and installed-version checks. Loading config and previewing migration never rewrite the source file.
|
|
39
|
+
|
|
40
|
+
## Quick start: enable Remote Context
|
|
41
|
+
|
|
42
|
+
This section is for Codex-style context windows. For search, images, or tool-call review only, skip to [Common tasks](#common-tasks).
|
|
43
|
+
|
|
44
|
+
### Use Pi's built-in Codex provider
|
|
45
|
+
|
|
46
|
+
You must already be signed in to Pi's built-in `openai-codex` provider. Create or merge this v2 Toolkit config:
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"schemaVersion": 2,
|
|
51
|
+
"defaults": {
|
|
52
|
+
"context": { "mode": "remote-windows" }
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Start Pi with a model from your existing Codex catalog:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
pi --model openai-codex/<model-id>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Replace `<model-id>` with the ID shown by your Pi setup. The session is activated when `new_context`, `get_context_remaining`, `history`, and `notes` appear. This verifies activation, not a completed backend round trip.
|
|
64
|
+
|
|
65
|
+
### Use a compatible gateway
|
|
66
|
+
|
|
67
|
+
This route requires `openai-responses` and a gateway that preserves Remote Context's Codex protocol fields. A successful ordinary chat request does not prove Remote Context compatibility.
|
|
68
|
+
|
|
69
|
+
If `~/.pi/agent/models.json` already registers a compatible model, skip registration and set Toolkit's exact model override below. Otherwise, add or merge this Pi provider entry. Replace the provider name, URL, environment variable, and model values with your setup. The numeric limits are examples, not project defaults.
|
|
70
|
+
|
|
71
|
+
```json
|
|
72
|
+
{
|
|
73
|
+
"providers": {
|
|
74
|
+
"my-gateway": {
|
|
75
|
+
"baseUrl": "https://your-gateway.example/v1",
|
|
76
|
+
"api": "openai-responses",
|
|
77
|
+
"apiKey": "$MY_GATEWAY_KEY",
|
|
78
|
+
"models": [{
|
|
79
|
+
"id": "gpt-5.6-luna",
|
|
80
|
+
"name": "GPT-5.6 Luna",
|
|
81
|
+
"reasoning": true,
|
|
82
|
+
"input": ["text"],
|
|
83
|
+
"contextWindow": 272000,
|
|
84
|
+
"maxTokens": 128000
|
|
85
|
+
}]
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Set the referenced key before starting Pi. In PowerShell:
|
|
92
|
+
|
|
93
|
+
```powershell
|
|
94
|
+
$env:MY_GATEWAY_KEY = "replace-with-your-gateway-key"
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
In a POSIX shell:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
export MY_GATEWAY_KEY="replace-with-your-gateway-key"
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Use the same terminal to start Pi. In the Toolkit config, make the key exactly match the registered provider and model ID:
|
|
104
|
+
|
|
105
|
+
```json
|
|
106
|
+
{
|
|
107
|
+
"schemaVersion": 2,
|
|
108
|
+
"models": {
|
|
109
|
+
"my-gateway/gpt-5.6-luna": {
|
|
110
|
+
"context": { "mode": "remote-windows" },
|
|
111
|
+
"compatibility": { "transport": "codex-gateway" }
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
pi --model my-gateway/gpt-5.6-luna
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Check for `new_context`, `get_context_remaining`, `history`, and `notes`. If absent, read the notification and check `/toolkit-config`, the exact model key, Pi API, credentials, and base URL. The transport setting opts into a protocol profile; it does not register a model or prove the backend supports it.
|
|
122
|
+
|
|
123
|
+
Earlier windows remain retrievable through `history`, but are not all automatically inserted into the current context.
|
|
124
|
+
|
|
125
|
+
## Common tasks
|
|
126
|
+
|
|
127
|
+
### Continue a session with server-side compaction
|
|
128
|
+
|
|
129
|
+
Use `context.mode: "remote-compaction"` for the Responses compaction path (the default), or `"pi"` to relinquish Toolkit context management. Set `context.remoteCompaction.model` only when a separate model should produce the checkpoint. These fields belong under `defaults` or an exact `models` override.
|
|
130
|
+
|
|
131
|
+
`context.remoteCompaction.inputSource` defaults to `"legacy"`: first compaction uses Pi's current session context, with event preparation as a last resort; recursion uses the raw branch tail. This preserves existing behavior but can diverge from provider-visible context when other extensions rewrite messages.
|
|
132
|
+
|
|
133
|
+
Opt into `"pi-context-hook"` to use the ordered Pi context-hook projection. If that bridge is unavailable, compaction cancels rather than sending unprojected history. Checkpoints are source-specific; switching input sources requires a new checkpoint. See [protocol details](docs/internals.md#remote-compaction-v2-wire-contract).
|
|
134
|
+
|
|
135
|
+
### Choose a Web Search route
|
|
136
|
+
|
|
137
|
+
Configure a global default and exact model overrides:
|
|
138
|
+
|
|
139
|
+
```json
|
|
140
|
+
{
|
|
141
|
+
"schemaVersion": 2,
|
|
142
|
+
"defaults": {
|
|
143
|
+
"webSearch": { "route": "local" }
|
|
144
|
+
},
|
|
145
|
+
"models": {
|
|
146
|
+
"my-gateway/gpt-5.6-luna": {
|
|
147
|
+
"webSearch": { "route": "hosted" }
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
- `unmanaged` releases Toolkit ownership. It does not disable third-party search or all Internet access.
|
|
154
|
+
- `local` preserves the original local `pi-web-access` tool state and removes conflicting hosted/standalone tools from provider payloads. It never activates a local tool that was inactive.
|
|
155
|
+
- `hosted` replaces the local `web_search` function with the native Responses search tool and source annotations.
|
|
156
|
+
- `standalone-alpha` deliberately opts into experimental CPA/Codex gateway search. It exposes sequential `web_run` and sends one isolated request per call to the provider-relative `/alpha/search`, using the current Pi model and credentials. The gateway must actually support that endpoint and capability; Toolkit does not probe or enable it.
|
|
157
|
+
|
|
158
|
+
Exact overrides win over defaults. There are no patterns, inferred capabilities, or fallback between routes. Invalid selected policy blocks the affected operation instead of choosing another route. The legacy hosted model list remains readable, but its permissive failure behavior is not identical to explicit v2 `hosted`; migration preview flags that difference.
|
|
159
|
+
|
|
160
|
+
### Generate an image
|
|
161
|
+
|
|
162
|
+
Image generation requires a Responses session and may incur provider charges. Enable it globally:
|
|
163
|
+
|
|
164
|
+
```json
|
|
165
|
+
{
|
|
166
|
+
"schemaVersion": 2,
|
|
167
|
+
"defaults": {
|
|
168
|
+
"imageGeneration": {
|
|
169
|
+
"enabled": true,
|
|
170
|
+
"defaultModel": "gpt-image-2.5",
|
|
171
|
+
"allowedModels": ["gpt-image-2.5", "grok-imagine-image-2.0"]
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
These are bare output-model IDs for the nested Responses `image_generation` tool. List order does not choose the default. `defaultModel` must belong to the nonempty `allowedModels` list; an optional one-call `model` must also be allowed. Invalid policy or a disallowed choice fails before authentication, reference upload, and paid dispatch. The provider must support the chosen model.
|
|
178
|
+
|
|
179
|
+
`openai_generate_image` accepts text-to-image requests and edits using explicitly supplied local references. Image policy cannot be overridden per session model.
|
|
180
|
+
|
|
181
|
+
### Review tool calls automatically
|
|
182
|
+
|
|
183
|
+
Make Auto Mode available to an exact model and choose its reviewer:
|
|
184
|
+
|
|
185
|
+
```json
|
|
186
|
+
{
|
|
187
|
+
"schemaVersion": 2,
|
|
188
|
+
"models": {
|
|
189
|
+
"my-gateway/gpt-5.6-luna": {
|
|
190
|
+
"autoMode": {
|
|
191
|
+
"available": true,
|
|
192
|
+
"reviewerModel": "my-gateway/gpt-5.6-luna"
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
`available` permits engagement; use `/auto on` or `--auto` to engage. `/auto off` explicitly disengages it. The default `side-effect` gate covers `bash`, `write`, `edit`, and configured extra tools; `gate: "all"` reviews every tool call. A reviewer timeout does not approve a call. Invalid configuration while engaged keeps a blocking gate until corrected or explicitly turned off.
|
|
200
|
+
|
|
201
|
+
The TUI shows activation, review activity, and a footer status. Compatible Pi tool renderers also show per-call allowed, denied, blocked, or unreviewed states. If that renderer seam is unavailable, Toolkit warns once and retains the footer display. Reviewer, classifier, and circuit-breaker controls are in the [configuration reference](docs/configuration.md).
|
|
202
|
+
|
|
203
|
+
## Common configuration
|
|
204
|
+
|
|
205
|
+
The global file uses built-ins, then `defaults`, then exact `models["provider/model-id"]` overrides. Missing fields inherit; arrays replace; `false` and `0` are retained. Supported optional model references accept `null` to clear inheritance. Defaults are not master switches: an exact override can enable a feature whose default is disabled.
|
|
206
|
+
|
|
207
|
+
| Field | Default | Use |
|
|
208
|
+
| --- | --- | --- |
|
|
209
|
+
| `defaults.context.mode` | `"remote-compaction"` | `"pi"`, `"remote-compaction"`, or `"remote-windows"`. |
|
|
210
|
+
| `models[exact].compatibility.transport` | `"standard"` | Exact gateway opt-in with `"codex-gateway"`. |
|
|
211
|
+
| `defaults.context.remoteCompaction.model` | `null` | Optional checkpoint producer. |
|
|
212
|
+
| `defaults.context.remoteCompaction.inputSource` | `"legacy"` | Source-specific checkpoint input policy. |
|
|
213
|
+
| `defaults.context.remoteWindows.reminderThresholdPercent` | `5` | `0` disables reminders and exhausted-window fallback. |
|
|
214
|
+
| `defaults.webSearch.route` | `"unmanaged"` | Toolkit search ownership policy. |
|
|
215
|
+
| `defaults.imageGeneration.enabled` | `false` | Global image-generation switch. |
|
|
216
|
+
| `defaults.imageGeneration.defaultModel` | `"gpt-image-2.5"` | Explicit default output model. |
|
|
217
|
+
| `defaults.imageGeneration.allowedModels` | `["gpt-image-2.5"]` | Allowed output models, global only. |
|
|
218
|
+
| `defaults.autoMode.available` | `false` | Permission to engage tool review. |
|
|
219
|
+
| `defaults.autoMode.gate` | `"side-effect"` | Selected side-effect tools or `"all"`. |
|
|
220
|
+
| `defaults.autoMode.timeoutMs` | `30000` | Reviewer timeout in milliseconds. |
|
|
221
|
+
| `diagnostics.level` | `"info"` | `"debug"` enables debug artifacts. |
|
|
222
|
+
| `diagnostics.captureRequests` / `captureResponses` | `false` | Independent request/compact-response capture opt-ins. |
|
|
223
|
+
|
|
224
|
+
Use `/toolkit-config` for effective values and origins, `/toolkit-config validate` for document issues, and `/toolkit-config migration-preview` for a read-only legacy candidate. These commands require a UI and perform no network/auth lookup, tool activation, or file writes. Configuration selection does not verify backend support.
|
|
225
|
+
|
|
226
|
+
Unknown v2 policy keys and malformed values produce visible scoped errors, independent of debug mode. Each public callback or tool execution uses one immutable snapshot across its awaited helpers; later operations reread the file. Separate Pi events are not one atomic transaction. See the [complete configuration reference](docs/configuration.md) and [editor schema](config.schema.json).
|
|
227
|
+
|
|
228
|
+
## Development
|
|
229
|
+
|
|
230
|
+
From the repository root, after dependencies are installed:
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
npm run typecheck
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
bun test
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
```bash
|
|
241
|
+
npm run test:pi
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
npm pack --dry-run
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
## License
|
|
249
|
+
|
|
250
|
+
MIT © awoaCrim and contributors. See [LICENSE](LICENSE) and [NOTICE](NOTICE).
|