opencode-reviewer 1.0.0 → 1.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.
Files changed (3) hide show
  1. package/README.md +36 -12
  2. package/dist/tui.js +1741 -934
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -13,7 +13,7 @@ This plugin is meant to enable you to run sessions with less frequent input in a
13
13
 
14
14
  ![](./assets/recording.gif)
15
15
 
16
- Requires OpenCode 1.18.35 or newer on Linux.
16
+ Verified with OpenCode 1.18.35 on Linux.
17
17
 
18
18
  ## Install and config
19
19
 
@@ -50,7 +50,7 @@ OpenCode installs the [npm package](https://www.npmjs.com/package/opencode-revie
50
50
  "attention": { "banner": true, "sound": true },
51
51
  "unsafe": { "banner": true, "sound": true },
52
52
  "question": { "banner": true, "sound": true },
53
- "approved": { "banner": true, "sound": true },
53
+ "approved": { "banner": true, "sound": false },
54
54
  "error": { "banner": true, "sound": true },
55
55
  "ended": { "banner": true, "sound": true }
56
56
  },
@@ -106,11 +106,11 @@ inclusive, fractions are invalid, and the maximum safe integer is
106
106
  | `autoApprove` | boolean | `false` | Allow Safe reviews once automatically. Normally waits for completion, validation, rendering and the countdown, including behind this plugin's report history. |
107
107
  | `fastMode` | boolean | `false` | Requires `autoApprove: true`. Approve a visible, 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. |
108
108
  | `extraCareful` | boolean | `true` | Include extra-careful guidance when `autoApprove` is enabled. Setting `false` omits that guidance without disabling automatic approval. |
109
- | `autoApproveDelaySeconds` | integer | `15` | `0`–`3600` seconds. Positive values have an extra one-second initial hold; `0` skips the wait but retains rendering and eligibility checks. Ignored in fast mode. |
109
+ | `autoApproveDelaySeconds` | integer | `15` | `0`–`3600` seconds. Positive values include an extra 200 ms initial grace; `0` skips the wait but retains rendering and eligibility checks. Ignored in fast mode. |
110
110
  | `notify` | boolean | `true` | Master switch for desktop banners, sounds and reminders. `false` overrides all per-type controls. |
111
111
  | `notifySound` | boolean | `true` | Master switch for notification audio. `false` silences every type and reminder without disabling enabled banners. |
112
112
  | `staleReminderSeconds` | integer | `60` | `0` through the maximum safe integer, in seconds. `0` disables reminders; otherwise eligible pending human interactions repeat at this interval, limited to the native front-of-queue blocker per conversation. |
113
- | `notifications` | object | All types: `banner: true`, `sound: true` | Keys: `attention`, `unsafe`, `question`, `approved`, `error`, `ended`. Each entry is an object with optional `banner` and `sound` booleans. Omitted types/fields remain enabled; unknown types/fields are invalid. Controls also apply to reminders. |
113
+ | `notifications` | object | All banners enabled; all sounds enabled except `approved` | Keys: `attention`, `unsafe`, `question`, `approved`, `error`, `ended`. Each entry is an object with optional `banner` and `sound` booleans. Omitted types/fields retain their defaults; unknown types/fields are invalid. Controls also apply to reminders. |
114
114
  | `notificationSoundDirectory` | string | Unset (bundled sounds) | Absolute, NUL-free path, at most 4096 string code units. Use the six notification type names as basenames: usable `.wav` first, then `.mp3`, then the corresponding bundled sound. |
115
115
  | `formatRetries` | integer | `1` | `0`–`100` additional assessment-format correction attempts. `0` disables format corrections, not independent transport recovery. |
116
116
  | `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. |
@@ -131,6 +131,10 @@ The sidebar shows Safe, Unsafe, or Analysis unavailable. Explanations support
131
131
  Markdown and scrolling. If the sidebar is hidden, use OpenCode's Show sidebar
132
132
  command.
133
133
 
134
+ When browsing a direct subagent, the same front-of-queue review appears in a
135
+ right-hand panel at terminal widths of at least 120 columns. Its auto-approval
136
+ countdown can start there without returning to the parent conversation.
137
+
134
138
  Skill-load review is enabled by default; set `skill` permissions to `ask` in
135
139
  `opencode.json` to receive reviews. Its prompt requires both bounded risk and clear
136
140
  relevance to the current work. A harmless but irrelevant skill is rated Unsafe.
@@ -184,8 +188,8 @@ or Cancel to leave the request manual. Hiding or covering the panel also cancels
184
188
  that request's countdown, except when covered by this plugin's report history.
185
189
  Cancel before using native Allow always or rejection
186
190
  forms; those forms alone do not stop the countdown.
187
- Positive countdowns hold their configured starting number for one extra second
188
- before counting down. A zero-second setting still approves without that hold.
191
+ Positive countdowns add a 200 ms initial grace and then update on remaining-time
192
+ boundaries. A zero-second setting still approves without that grace.
189
193
 
190
194
  `/reviewer-disable` and `/reviewer-enable` control the current conversation and its
191
195
  descendants. The setting is saved for resume. Both commands are also in the command
@@ -291,11 +295,12 @@ terminal is focused:
291
295
  with its own sound. Provisional streamed ratings never notify.
292
296
  - **Agent has a question:** a pending agent question at the front of the native
293
297
  input queue, with its own sound.
294
- - **Reviewer approved a permission:** sent with the approval sound after confirmed
298
+ - **Reviewer approved a permission:** a silent banner by default, sent after confirmed
295
299
  automatic approval, including fast mode while its report is still streaming.
296
300
  Positive and zero delays also notify on success; the countdown is silent.
297
- Approval sounds are limited to
298
- one every two seconds; every eligible banner is retained for delivery.
301
+ Opt in with `notifications.approved.sound: true`. Approval sounds are limited to
302
+ one every two seconds, including delayed playback. Sounds from the same session
303
+ wait for the previous player to finish, so successive alerts do not overlap.
299
304
  - **Session error:** an unrecovered session/provider failure, not a review failure.
300
305
  - **Session ended:** a completed root-agent response, not a question/permission
301
306
  pause or an explicit user interruption.
@@ -311,7 +316,7 @@ actionable position, restarting analysis or entering automatic approval cancels
311
316
  pending attention delivery and reminders.
312
317
 
313
318
  Each type's `banner` and `sound` can be controlled independently. For example,
314
- `notifications.approved.banner: false` keeps approval sounds without banners;
319
+ `notifications.approved: { "banner": false, "sound": true }` enables approval sounds without banners;
315
320
  `notifications.question.sound: false` keeps question banners silent. Set both to
316
321
  `false` to disable that type. `notify: false` overrides all types and disables
317
322
  reminders too; `notifySound: false` silences all types and their reminders.
@@ -319,7 +324,8 @@ Sound-only delivery does not require a desktop banner or delivery acknowledgemen
319
324
  Invalid notification settings disable notification work without disabling reviews.
320
325
 
321
326
  Pending permissions and questions repeat after `staleReminderSeconds`, measured
322
- from initial dispatch, even if desktop delivery fails. Reminders replace their
327
+ from actual initial dispatch, even if desktop delivery fails. Capacity waiting
328
+ does not start the reminder clock or replace an undelivered initial alert. Reminders replace their
323
329
  previous banner and append **(Reminder)** to the event text, reusing the same
324
330
  sound, icon, session heading and click target. Only the native front-of-queue
325
331
  interaction per root conversation repeats: permissions precede questions, with
@@ -362,6 +368,18 @@ Audio is prepared before showing its banner and played from the normalized cache
362
368
  with a low-latency buffer; preparation never blocks permission approval.
363
369
  `stdbuf` makes delivery acknowledgements immediate instead of waiting for
364
370
  `notify-send` to flush its output when the banner closes.
371
+ Delivery is bounded: up to 64 active tickets (48 routine), 256 waiting actionable
372
+ episodes, and 128 waiting routine events. A full routine backlog drops new
373
+ approval/error/completion events; already admitted events retain their exact
374
+ targets. Actionable attention/Unsafe/question work has priority, rotating among
375
+ roots; after eight actionable dispatches, waiting routine work gets a turn.
376
+ Each root has only its current actionable episode, and waiting reminders coalesce.
377
+ The process pool allows 24 children: 20 banners (16 routine), two players, one
378
+ withdrawal and one activation. Audio preparation has two actual-operation slots;
379
+ audio waiting is bounded to 64 requests. Cancellation and timeouts do not free
380
+ physical slots until their operations settle. Queued actionable work is canceled
381
+ when its request resolves or loses native queue ownership. Desktop/process
382
+ failures remain best-effort and do not delay permission approval.
365
383
  Disable overlapping notification plugins to avoid duplicate alerts.
366
384
  </details>
367
385
 
@@ -370,6 +388,12 @@ Disable overlapping notification plugins to avoid duplicate alerts.
370
388
  Use Node.js 24.15.0+ within 24.x, or 22.22.2+ within 22.x, and npm.
371
389
  Run `npm ci --ignore-scripts`, then `npm run check` for typechecking, source tests,
372
390
  pure-helper tests and the build. `npm run test:helpers` runs the helper checks
373
- without building or starting OpenCode. Pull-request CI checks both Node versions.
391
+ without building or starting OpenCode. Pull-request CI checks both Node versions
392
+ and runs a separate representative Linux OpenCode 1.18.35 fixture profile.
393
+ After building, run `node scripts/test-runtime.mjs --profile ci` for that same
394
+ profile. Use `node scripts/test-runtime.mjs --list` for the complete runtime
395
+ inventory or `node scripts/test-runtime.mjs --plan --profile ci` for a
396
+ host-independent plan. Profiles select documented scenario/flag combinations;
397
+ interactive desktop checks and historical replays have separate prerequisites.
374
398
  See [AGENTS.md](https://github.com/mightykatun/opencode-reviewer/blob/main/AGENTS.md)
375
399
  for runtime tests and the tag-driven release process.