@edgehero/pi-dispatch-admin 1.10.2 → 2.0.0

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@edgehero/pi-dispatch-admin",
3
- "version": "1.10.2",
4
- "description": "Operator console (a pi extension) + skill for pi-dispatch: run the pi coding agent as a self-hosted service. A /dispatch TUI for the queue, spend caps, run history, editable GitHub, GitLab, Forgejo and Azure DevOps triggers (cron/label/comment/PR/MR/work item), and scheduled pause windows — plus AI-operable, human-confirmed controls. Runs against a live pi-dispatch deployment.",
3
+ "version": "2.0.0",
4
+ "description": "Operator console for pi-dispatch, as a pi extension: a /dispatch panel over the queue, spend caps, scoped limits, run history and insights, editable cron and GitHub, GitLab, Forgejo and Azure DevOps triggers, pause windows, and human-confirmed tools your AI can operate.",
5
5
  "keywords": [
6
6
  "pi-package",
7
7
  "pi-extension",
@@ -19,7 +19,9 @@
19
19
  "job-queue",
20
20
  "cron",
21
21
  "tui",
22
- "dashboard"
22
+ "dashboard",
23
+ "podman",
24
+ "docker"
23
25
  ],
24
26
  "license": "MIT",
25
27
  "author": "Rob Boerman",
@@ -44,9 +44,11 @@ dialog before it takes effect**:
44
44
  - `dispatch_waits` — list the jobs the worker is HOLDING on a trigger's `run.waitFor` condition: job id,
45
45
  an id-only target, the operator's own words for what it waits on, and how long it has waited. Different
46
46
  from the queue's `delayed` count, which also mixes cron next-occurrences, retry backoff and quiet hours.
47
- - `dispatch_wait_cancel` — remove a held job so it never runs (confirm-gated). It is the only lever that
48
- reaches one: a held job has spent nothing, so no budget cap will ever refuse it, and deleting the trigger
49
- does not reach a job already enqueued.
47
+ - `dispatch_wait_cancel` — remove a held job so it never runs (confirm-gated). The caps cannot do this: a
48
+ held job spends nothing while it waits, so no budget cap will refuse it, and deleting the trigger does not
49
+ reach a job already enqueued. The operator has the same lever without you: `pi-dispatch cancel <jobId>`
50
+ at a terminal, or `h` then `x` in the panel — that CLI verb also removes a plain queued job and stops a
51
+ RUNNING one (its record then says `operator-cancel`), both beyond this tool's reach.
50
52
  - `dispatch_limit_add` / `dispatch_limit_edit` / `dispatch_limit_delete` — manage scoped limits (per
51
53
  repo/folder budget caps and concurrency: `day`/`week`/`month` job-count caps refuse a job pre-spend with
52
54
  reason `scope-cap`, never retried; `concurrent` defers the excess, never drops it; `dispatch_limits`
@@ -132,6 +134,26 @@ cannot, and that it is an edit they make to `triggers.json` themselves.** Do not
132
134
  built or pulled on the worker's own host, because jobs run with `--pull=never` and nothing is fetched at
133
135
  job time; and `pi-dispatch doctor` lists every image their triggers name and flags one that is missing.
134
136
 
137
+ ## Tool exclusion — `run.excludeTools`, and why you cannot set it
138
+
139
+ A trigger may carry `run.excludeTools`: built-in pi tools its jobs' sessions do NOT have. It exists so a
140
+ read-only flow (a triage that must not edit, a report that must not run a shell) is read-only by
141
+ construction rather than by request: the excluded tools are removed from the session's tool registry, so
142
+ nothing inside the job can switch them back on, and every such job logs the active tool list read back.
143
+ The drill-in states it beside the image row either way (`full pinned tool set` when absent).
144
+
145
+ **You cannot change it, in either direction.** `dispatch_trigger_add` and `dispatch_trigger_edit` have no
146
+ such parameter, and a chained job's request file can neither set nor drop it (the child inherits the
147
+ parent's exclusions). This is a permission surface, and the widening direction (a name quietly dropped
148
+ from the array) would read as harmless in any confirm dialog, which is exactly why no model-callable
149
+ route exists.
150
+
151
+ So if a user asks you to exclude a tool from a trigger, or to restore one: **say plainly that you cannot,
152
+ and that it is an edit they make to `triggers.json` themselves.** Two useful things you *can* say: only
153
+ the built-in names are legal (`read`, `bash`, `edit`, `write`, `grep`, `find`, `ls`; a misspelling
154
+ refuses at load rather than silently excluding nothing), and a genuinely read-only trigger usually also
155
+ wants `"packages": false`, because extension tools are not excludable.
156
+
135
157
  ## Vault secrets — `run.secrets`, and why you cannot set it
136
158
 
137
159
  A trigger may carry `run.secrets`: a map of environment variable name to an opaque **reference**, plus
@@ -267,8 +289,9 @@ What that means when you are asked about a job that "has not run":
267
289
  script is broken rather than the condition slow. `wait-expired` means a bound was reached.
268
290
  `wait-skew` / `wait-unreadable` mean two services in the deployment disagree about the field and one needs
269
291
  upgrading or restarting.
270
- - **Cancelling is an operator decision.** `dispatch_wait_cancel` needs a confirm, writes no run record (the
271
- job never ran), and cannot be undone: the delivery is gone, and a webhook does not resend itself.
292
+ - **Cancelling is an operator decision.** `dispatch_wait_cancel` needs a confirm, writes no run record of its
293
+ own (a held job usually never ran; one held again on a retry keeps whatever its earlier attempts recorded), and
294
+ cannot be undone: the delivery is gone, and a webhook does not resend itself.
272
295
 
273
296
  ## Scoped limits — and the folder mutex you cannot turn off
274
297