opencode-reviewer 1.0.2 → 2.0.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 CHANGED
@@ -1,11 +1,8 @@
1
1
  # OpenCode Reviewer
2
2
 
3
- > ⚠️ **NOT v2 COMPATIBLE YET**
4
- >
5
- > I recommend not upgrading opencode to v2 yet as many things are still unstable
6
-
7
- Reviews pending permissions in the [OpenCode](https://github.com/anomalyco/opencode) sidebar using a separate LLM. Covers
8
- shell commands, file edits, skill loading, MCP calls, custom tools, and external-directory access.
3
+ Reviews pending permissions in the [OpenCode](https://github.com/anomalyco/opencode) sidebar using a separate LLM. Reviews
4
+ native shell commands, file edits, and external-directory access. Skill, MCP and
5
+ custom-tool requests currently remain manual.
9
6
  Supports streaming explanations, saved report history, auto-approval, and Linux
10
7
  desktop notifications with distinct sounds.
11
8
 
@@ -17,21 +14,23 @@ This plugin is meant to enable you to run sessions with less frequent input in a
17
14
 
18
15
  ![](./assets/recording.gif)
19
16
 
20
- Verified with OpenCode 1.18.35 on Linux. Version **1.0.2** is the final release
21
- compatible with OpenCode V1.
17
+ For OpenCode V2 on Linux. The plugin checks the server companion's protocol and
18
+ each request's data and scope rather than allowing only specific host versions.
22
19
 
23
20
  ## Install and config
24
21
 
25
- Add this entry to `~/.config/opencode/tui.json` or `.opencode/tui.json`.
26
- OpenCode installs the [npm package](https://www.npmjs.com/package/opencode-reviewer).
22
+ Add this entry to the global `~/.config/opencode/cli.json`, or
23
+ `$XDG_CONFIG_HOME/opencode/cli.json` when `XDG_CONFIG_HOME` is set.
24
+ There is no project-local CLI configuration. OpenCode loads the
25
+ [npm package](https://www.npmjs.com/package/opencode-reviewer) from this entry.
27
26
 
28
27
  ```json
29
28
  {
30
- "$schema": "https://opencode.ai/tui.json",
31
- "plugin": [
32
- [
33
- "opencode-reviewer@1.0.2",
34
- {
29
+ "$schema": "https://opencode.ai/v2/cli.json",
30
+ "plugins": [
31
+ {
32
+ "package": "opencode-reviewer@2.0.1",
33
+ "options": {
35
34
  "baseURL": "https://openrouter.ai/api/v1",
36
35
  "model": "your-model",
37
36
  "apiKey": "your-api-key",
@@ -66,7 +65,7 @@ OpenCode installs the [npm package](https://www.npmjs.com/package/opencode-revie
66
65
  "maxFiles": 6,
67
66
  "maxEvidenceBytes": 131072
68
67
  }
69
- ]
68
+ }
70
69
  ]
71
70
  }
72
71
  ```
@@ -82,14 +81,34 @@ endpoint. Remove `instructions` to use the built-in prompts and
82
81
 
83
82
  The connection, credential and directory values above are examples, not defaults.
84
83
  All boolean, numeric and per-type notification values shown are the defaults.
85
- Restart OpenCode after changing configuration. Reviews run when OpenCode asks for
86
- permission, so set the relevant rules to `ask` in `opencode.json`. Existing `allow`
87
- rules skip review.
84
+ Restart OpenCode after changing reviewer configuration. Also load the server
85
+ companion in `opencode.json`, globally or in the project. Keep permission rules
86
+ only in this server configuration, not in `cli.json`:
87
+
88
+ ```json
89
+ {
90
+ "$schema": "https://opencode.ai/config.json",
91
+ "plugins": ["opencode-reviewer@2.0.1"],
92
+ "permissions": [
93
+ { "action": "shell", "resource": "*", "effect": "ask" },
94
+ { "action": "edit", "resource": "*", "effect": "ask" },
95
+ { "action": "skill", "resource": "*", "effect": "ask" },
96
+ { "action": "external_directory", "resource": "*", "effect": "ask" }
97
+ ]
98
+ }
99
+ ```
100
+
101
+ Merge these entries with your existing configuration. Rules are ordered and the last
102
+ matching rule wins. Reviews run only when OpenCode asks for permission. Existing
103
+ `allow` rules and native autoaccept skip review. See OpenCode's
104
+ [server config](https://opencode.ai/v2/docs/config),
105
+ [CLI config](https://opencode.ai/v2/docs/cli/config) and
106
+ [CLI plugins](https://opencode.ai/v2/docs/build/plugins/cli) guides.
88
107
 
89
108
  ## Options reference
90
109
 
91
- These are options inside the plugin's configuration object in `tui.json`.
92
- Defaults apply only to omitted options; `null` is invalid. Boolean and integer
110
+ These are options inside the plugin's `options` object in global `cli.json`.
111
+ Defaults apply only to omitted options. `null` is invalid. Boolean and integer
93
112
  options require JSON booleans and numbers, not quoted strings. Integer ranges are
94
113
  inclusive, fractions are invalid, and the maximum safe integer is
95
114
  9,007,199,254,740,991. Unknown option names are rejected.
@@ -102,13 +121,13 @@ inclusive, fractions are invalid, and the maximum safe integer is
102
121
  | `apiKeyEnv` | string | Unset | Environment-variable name matching `[A-Za-z_][A-Za-z_0-9]*`. Without an inline key, its value must be set and nonblank when a review runs. Omit both key options for no Authorization header. |
103
122
  | `instructions` | string | Unset (built-ins) | Absolute, NUL-free directory path containing overrides for the [prompt templates](https://github.com/mightykatun/opencode-reviewer/tree/main/prompts), not inline instructions. Missing named files use built-ins; supplied files must be readable, regular, non-symlink, nonempty UTF-8 text up to 64 KiB. Fixed contracts cannot be overridden. |
104
123
  | `stream` | boolean | `false` | Request SSE and show provisional rating/text updates. Normal automatic approval waits for a completed, validated report; fast mode can approve on an early Safe rating. Presentation rules are described below. |
105
- | `reviewBash` | boolean | `true` | Review native shell-command permissions. |
106
- | `reviewEdits` | boolean | `true` | Review native `edit`, `write` and `apply_patch` permissions. |
107
- | `reviewSkills` | boolean | `true` | Review native skill-load permissions for dangerous guidance and relevance to the current task. Supplies the host's skill instructions and bounded, directly referenced supporting files within the skill directory. |
108
- | `reviewMcp` | boolean | `false` | Review identifiable MCP tool and resource permissions. |
109
- | `reviewCustomTools` | boolean | `false` | Review permissions requested by registered custom tools. |
124
+ | `reviewBash` | boolean | `true` | Review native `shell` permissions. The option keeps its existing name. |
125
+ | `reviewEdits` | boolean | `true` | Review native `edit`, `write` and `patch` tools, which use the `edit` permission action. |
126
+ | `reviewSkills` | boolean | `true` | Skill-review category switch. Exact mandatory skill instructions are currently unavailable to the V2 collector, so these requests remain manual. |
127
+ | `reviewMcp` | boolean | `false` | MCP-review category switch. V2 MCP collection is currently unsupported; enabling this does not supply missing origin/catalog evidence or permit automatic approval. |
128
+ | `reviewCustomTools` | boolean | `false` | Custom-tool review category switch. V2 custom-tool collection is currently unsupported; these requests remain manual. |
110
129
  | `reviewExternalDirectories` | boolean | `false` | Review directory access independently of operation-review switches. Directory approval can resume the operation without another prompt. |
111
- | `autoApprove` | boolean | `false` | Allow Safe reviews once automatically. Normally waits for completion, validation and the countdown. Root-view rendering is required, including behind report history; same-conversation subagent browsing permits hidden approval. |
130
+ | `autoApprove` | boolean | `false` | Allow Safe reviews once automatically. Normally waits for completion, validation and the countdown. Requires the top-level conversation and physical presentation proof; subagent browsing never permits automatic approval. Normal-mode report-history cover has a separate physical-proof exception. |
112
131
  | `fastMode` | boolean | `false` | Requires `autoApprove: true`. Approve an eligible, front-of-queue request as soon as a Safe rating is parsed, bypassing the countdown. Respects `stream`; with `stream: false`, waits for the complete validated response. Finish the report and save it in the background after approval. |
113
132
  | `extraCareful` | boolean | `true` | Include extra-careful guidance when `autoApprove` is enabled. Setting `false` omits that guidance without disabling automatic approval. |
114
133
  | `autoApproveDelaySeconds` | integer | `15` | `0`–`3600` seconds. Positive values include an extra 200 ms initial grace; `0` skips the wait but keeps the other approval checks. Ignored in fast mode. |
@@ -120,8 +139,8 @@ inclusive, fractions are invalid, and the maximum safe integer is
120
139
  | `formatRetries` | integer | `1` | `0`–`100` additional assessment-format correction attempts. `0` disables format corrections, not independent transport recovery. |
121
140
  | `maxOutputTokens` | integer | `4096` | `1` through the maximum safe integer. Sent as `max_tokens` on every reviewer POST, including retries/corrections. Your provider/model enforces its supported output limit. |
122
141
  | `timeoutMs` | integer | `30000` | `1`–`3600000` milliseconds shared across evidence collection, HTTP requests, retries and corrections; not a fresh budget per POST. |
123
- | `maxFiles` | integer | `6` | `1`–`1000` distinct file candidates per shell/edit/skill review, including unavailable candidates. Skill reviews count the main instructions as one file. |
124
- | `maxEvidenceBytes` | integer | `131072` | `1`–`16777216` bytes for command/source content, edit diffs or category-specific JSON evidence. Skill reviews share this budget between mandatory skill JSON and UTF-8 supporting-file content. Optional items are omitted whole; oversized mandatory evidence fails analysis. This is not a cap on the full prompt or HTTP request. |
142
+ | `maxFiles` | integer | `6` | `1`–`1000` distinct file candidates per shell/edit review, including unavailable candidates. |
143
+ | `maxEvidenceBytes` | integer | `131072` | `1`–`16777216` bytes for command/source content, edit diffs or category-specific JSON evidence. Optional items are omitted whole; oversized mandatory evidence fails analysis. This is not a cap on the full prompt or HTTP request. |
125
144
 
126
145
  Notification channels are independent: `banner: false, sound: true` is sound-only;
127
146
  `banner: true, sound: false` is banner-only; both `false` disable that type.
@@ -136,46 +155,49 @@ The sidebar shows Safe, Unsafe, or Analysis unavailable. Explanations support
136
155
  Markdown and scrolling. If the sidebar is hidden, use OpenCode's Show sidebar
137
156
  command.
138
157
 
139
- The reviewer side panel appears only in the top-level conversation. Browsing its
140
- subagents, including nested subagents, hides the panel while reviews and both normal
141
- and fast automatic approvals continue. Countdown deadlines stay the same, and new
142
- Safe reviews can become eligible while hidden. Return to the top-level conversation
143
- to see the current report or browse saved history.
144
-
145
- On the top-level route, automatic approval requires mouse tracking for the host's
146
- painted-panel ownership checks. With mouse tracking disabled there, reports remain
147
- available for manual review.
148
-
149
- Skill-load review is enabled by default; set `skill` permissions to `ask` in
150
- `opencode.json` to receive reviews. Its prompt requires both bounded risk and clear
151
- relevance to the current work. A harmless but irrelevant skill is rated Unsafe.
152
- The reviewer receives the exact main instructions from the host's skill catalog,
153
- plus bounded snapshots of directly referenced local files within the skill directory.
154
- It does not execute scripts, follow references in supporting files, expand directory
155
- listings, fetch external URLs, or read supporting files outside that directory.
156
- Built-in skills without a local directory receive instruction-only review.
157
- Customize this guidance with `SKILL-REVIEW-PROMPT.md` in your prompt directory.
158
-
159
- For every review category, subagent requests include the latest immediate delegation
160
- linked to the requesting assistant invocation, alongside the genuine root-user prompt.
161
- Resumed subagents use the current delegation; nested subagents include only their
162
- immediate delegation. Missing or over-64-KiB delegation text is noted rather than
163
- replaced with an older task. Both prompts are context for the reviewer, not instructions
164
- that can override its review contract.
158
+ The reviewer panel appears only in the main conversation. Opening any subagent,
159
+ including a nested one, hides the panel and prevents normal and fast auto-approval.
160
+ Reviews may still finish while hidden. If a Safe report has never started a normal
161
+ countdown, returning to the main conversation can start a fresh one once the host
162
+ confirms the panel is visible. Leaving after a countdown starts cancels auto-approval
163
+ for that request for the rest of that plugin run. Returning or disabling and
164
+ re-enabling review won't restart it.
165
+
166
+ Auto-approval requires mouse tracking so the host can check that the panel is
167
+ visible and receives clicks. With mouse tracking off, you can still read reports
168
+ and approve requests manually. The plugin doesn't enable mouse tracking or reveal
169
+ a hidden sidebar unless you click an approval notification; it checks that the
170
+ sidebar is absent from the main conversation before showing it.
171
+
172
+ The skill, MCP and custom-tool options are still present, but these reviews aren't
173
+ supported in V2. The reviewer can't get the required skill instructions or verify
174
+ the source and catalog information for MCP and custom tools. Those requests need
175
+ manual approval; they aren't rated Safe.
176
+
177
+ Code Mode and its tool search stay enabled. Native tool calls can be reviewed when
178
+ the reviewer can match them exactly to their permission requests. Nested calls
179
+ without an exact match need manual approval. This assumes other installed plugins don't change
180
+ what native tools do, replace or alias their executors, or rewrite commands after
181
+ the reviewer has captured them.
182
+
183
+ Subagent reviews include the latest user prompt from the main conversation. The
184
+ V2 evidence collector can't get the exact task passed to the requesting subagent,
185
+ so it leaves that out rather than guessing from older tasks, sibling requests or
186
+ queued follow-ups. Missing optional context doesn't prevent review if the required
187
+ operation evidence is verified. Context can't override the review rules.
165
188
 
166
189
  With streaming enabled, Evaluating and its spinner disappear when a rating arrives.
167
- The rating remains provisional until the full response is validated. A retry
168
- clears the preview and restores the loading indicator. Normal auto-approval
169
- starts only after the full response is validated and rendered, except that rendering
170
- is not required while the panel is intentionally hidden by same-conversation
171
- subagent browsing.
172
-
173
- With `autoApprove: true` and `fastMode: true`, a parsed Safe rating approves the
174
- current eligible permission immediately, without a countdown or waiting for the
175
- rest of a streamed report. Same-conversation subagent browsing also permits fast
176
- approval while the panel is hidden. Explicit sidebar hiding, covering dialogs and
177
- report history prevent fast approval. Without streaming, fast mode waits for the
178
- full validated response and then skips the countdown.
190
+ The rating is provisional until the full response passes validation. A retry
191
+ clears the preview and brings back the loading indicator. Normal auto-approval
192
+ waits for the full validated report and for the host to confirm that it's displayed
193
+ in the main conversation.
194
+
195
+ With `autoApprove: true` and `fastMode: true`, a parsed Safe rating can approve the
196
+ request before the streamed report finishes, without a countdown. The request must
197
+ be first in OpenCode's permission queue, and the host must confirm the panel is
198
+ visible in the main conversation. Browsing a subagent, hiding the sidebar or
199
+ covering it with a dialog or report history prevents fast approval. Without
200
+ streaming, fast mode waits for the full validated response, then skips the countdown.
179
201
 
180
202
  After confirmed fast approval, the live panel shows **Auto-approved; finishing
181
203
  report…** and stays ahead of newer requests until its report finishes. Hiding the
@@ -198,13 +220,15 @@ limits and overall timeout still apply. Retried requests can incur additional
198
220
  provider charges, and unreported usage remains unknown.
199
221
 
200
222
  During an auto-approval countdown, click the countdown to allow once immediately,
201
- or Cancel to leave the request manual. Hiding or covering the panel also cancels
202
- that request's countdown, except when covered by this plugin's report history or
203
- intentionally hidden while browsing the same conversation's subagents. Switching
204
- to an unrelated conversation still cancels it. Returning cannot revive a canceled
205
- request.
223
+ or Cancel to leave the request manual. Hiding or covering the panel cancels the
224
+ countdown too, except when this plugin's report history is displayed in the main
225
+ conversation and passes the host's visibility checks. Browsing any subagent or
226
+ switching conversations cancels it. Returning, reopening the panel or re-enabling
227
+ review won't restart a canceled countdown. If the plugin can't confirm the result
228
+ of an approval attempt, it leaves the request manual and never retries that attempt.
206
229
  Cancel before using native Allow always or rejection
207
230
  forms; those forms alone do not stop the countdown.
231
+ Cancel remains available during native preparation, until the approval is sent.
208
232
  Positive countdowns add a 200 ms initial grace and then update on remaining-time
209
233
  boundaries. A zero-second setting still approves without that grace.
210
234
 
@@ -213,6 +237,10 @@ descendants. The setting is saved for resume. Both commands are also in the comm
213
237
  palette. Disabling stops unapproved reviews and countdowns while native permission
214
238
  controls remain available. Already-approved fast-mode reports finish in the background.
215
239
 
240
+ If the server reconnects or the companion is replaced, reviews and auto-approval
241
+ stop. Reload the plugin or restart OpenCode to resume. This keeps cached permissions
242
+ from the old connection separate from the new one.
243
+
216
244
  ### Report history
217
245
 
218
246
  Use `/reviewer-history` or **Reviewer: Report history** in the command palette to
@@ -222,6 +250,8 @@ PageUp/PageDown scroll. Close or Escape closes history. Repeating the command
222
250
  returns to the newest report. History remains available with review disabled or
223
251
  invalid reviewer configuration. The history command preserves a hidden sidebar;
224
252
  clicking an approval notification reveals it and selects that permission's live or saved report.
253
+ Keyboard browsing also works with mouse tracking off; that does not grant
254
+ automatic-approval history cover.
225
255
 
226
256
  Each entry shows the original report, available usage, model, provider and outcome:
227
257
  **Auto approved**, **Manually approved**, **Cancelled**, or **Rejected**. Cancelled
@@ -231,19 +261,27 @@ native Allow once replies whose submitting client cannot be identified. History
231
261
  keeps the latest completed report, which can differ from the report that caused
232
262
  approval in another window.
233
263
 
234
- History can cover an ongoing review without stopping its countdown. A newly
235
- completed Safe review can also start its countdown beneath history after its full
236
- report is rendered. Native dialogs, including the command palette, still cancel an
237
- active countdown; opening history afterward cannot restart it. Browsing saved
238
- reports never approves a request or replays notifications.
239
-
240
- Reports are saved only after a qualifying permission resolution. Saved reports
241
- can contain private text and are retained in OpenCode's local state directory
242
- until their conversation is deleted. Deleting a root removes its descendants'
243
- details; deletion missed while OpenCode was closed is reconciled when that host
244
- scope is visited again. Windows using the same state directory share this history,
245
- partitioned by host directory and root conversation. Uncommitted reports can be
246
- lost on shutdown or prolonged storage failure.
264
+ In normal mode, opening report history can leave a countdown running in the main
265
+ conversation. The host must confirm that the history heading and footer are visible
266
+ and the review report is rendered. A newly completed Safe review can become eligible
267
+ for a countdown under the same checks. OpenCode dialogs, including the command palette, still cancel an
268
+ active countdown; opening history afterward won't restart it. History blocks fast
269
+ approval. Browsing saved reports doesn't itself approve requests or replay notifications.
270
+
271
+ Reports are saved only after a permission resolution that qualifies for history.
272
+ They can contain private text and are kept under OpenCode's local state base:
273
+ `$XDG_STATE_HOME`, or `~/.local/state` when unset. Safely accessible history stays
274
+ under `opencode/opencode-reviewer/`. If the host directory is unsuitable for private
275
+ storage, the plugin uses its private, plugin-owned sibling
276
+ `opencode-reviewer-state/opencode-reviewer/` without changing host-directory permissions.
277
+ An existing safe sibling database remains in use across restarts. Conversation
278
+ enable/disable settings stay in the original OpenCode state directory.
279
+ The plugin deletes them only when it can verify that a deleted conversation belongs
280
+ to the matching server and scope. If that can't be verified after an offline
281
+ deletion, it keeps the history; a missing list entry or bare 404 isn't enough.
282
+ Windows using the same state directory share history, grouped by host directory
283
+ and main conversation. Reports not yet saved can be lost on shutdown or during a
284
+ prolonged storage failure.
247
285
 
248
286
  ### Usage totals
249
287
 
@@ -253,8 +291,8 @@ views. Use Tab or click a scope to switch. The dialog opens on Lifetime;
253
291
  Conversation uses the session selected when opened, resolving its root and all
254
292
  descendants, including subagents, within the current host-directory scope.
255
293
  Opening from a descendant shows the same combined conversation totals.
256
- OpenRouter
257
- costs use reported charges; other endpoints use available catalog estimates.
294
+ Statistics remain available with review disabled or invalid reviewer configuration.
295
+ OpenRouter costs use reported charges; other endpoints use available catalog estimates.
258
296
  Received usage counts even if a review fails or is interrupted. Unreported charges
259
297
  are missing from the totals.
260
298
 
@@ -349,8 +387,8 @@ interaction per root conversation repeats: permissions precede questions, with
349
387
  the host's session/request ordering. Queued interactions stay silent. Handoff sends
350
388
  the next eligible request's initial notification, then waits a full interval before
351
389
  its first reminder. Independent visited conversations
352
- can each remind. The supported host presents input for roots and direct children;
353
- deeper descendants cannot become a native root-input notification or reminder target.
390
+ can each remind. The supported V2 host's root input queue includes the full descendant
391
+ family, root first and then the host's public family order.
354
392
 
355
393
  Answering/dismissing a question in OpenCode, resolving a permission, deleting its
356
394
  session or closing the plugin stops its reminders. Closing/clicking a desktop
@@ -362,7 +400,7 @@ Notifications cover conversations visited in this terminal and their descendants
362
400
  Existing pending requests at startup/resume are not replayed or reminded, but still
363
401
  participate in queue ordering. Clicking can select
364
402
  the originating GNOME Terminal tab and root conversation. Native input prompts
365
- cover root/direct-child requests in the supported host. Open dialogs are
403
+ cover the root and its full descendant family in the supported host. Open dialogs are
366
404
  left intact; other terminals still receive banners and sounds. Desktop policies
367
405
  control expiry/history and whether activation actually brings a window forward.
368
406
  Clicking **Reviewer approved a permission** opens that permission's unfinished
@@ -406,7 +444,8 @@ Use Node.js 24.15.0+ within 24.x, or 22.22.2+ within 22.x, and npm.
406
444
  Run `npm ci --ignore-scripts`, then `npm run check` for typechecking, source tests,
407
445
  pure-helper tests and the build. `npm run test:helpers` runs the helper checks
408
446
  without building or starting OpenCode. Pull-request CI checks both Node versions
409
- and runs a separate representative Linux OpenCode 1.18.35 fixture profile.
447
+ and runs a separate representative Linux fixture profile on stock OpenCode
448
+ 2.0.26 and 2.0.27.
410
449
  After building, run `node scripts/test-runtime.mjs --profile ci` for that same
411
450
  profile. Use `node scripts/test-runtime.mjs --list` for the complete runtime
412
451
  inventory or `node scripts/test-runtime.mjs --plan --profile ci` for a
@@ -27,6 +27,41 @@ ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
27
27
  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
28
28
  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29
29
 
30
+ # Bundled dependency: @opencode/theme 2.0.26
31
+
32
+ https://github.com/anomalyco/opencode/tree/v2.0.26/packages/theme
33
+
34
+ The pinned theme syntax helper is bundled unchanged in the terminal payload.
35
+ A build-time adapter replaces its public barrel with a syntax-only re-export;
36
+ unused theme parsers, schemas and their Effect dependency are not bundled.
37
+ Solid and OpenTUI remain host-provided external dependencies.
38
+
39
+ License source: https://github.com/anomalyco/opencode/blob/v2.0.26/LICENSE
40
+
41
+ ```text
42
+ MIT License
43
+
44
+ Copyright (c) 2025 opencode
45
+
46
+ Permission is hereby granted, free of charge, to any person obtaining a copy
47
+ of this software and associated documentation files (the "Software"), to deal
48
+ in the Software without restriction, including without limitation the rights
49
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
50
+ copies of the Software, and to permit persons to whom the Software is
51
+ furnished to do so, subject to the following conditions:
52
+
53
+ The above copyright notice and this permission notice shall be included in all
54
+ copies or substantial portions of the Software.
55
+
56
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
57
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
58
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
59
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
60
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
61
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
62
+ SOFTWARE.
63
+ ```
64
+
30
65
  # Bundled audio decoder and supplied sounds
31
66
 
32
67
  The six notification MP3 files were supplied by the maintainer with