pi-crew 0.10.6 → 0.11.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/CHANGELOG.md +215 -0
- package/README.md +0 -1
- package/dist/index.mjs +30623 -29844
- package/package.json +170 -169
- package/schema.json +10 -0
- package/scripts/watch-agent-transcript.mjs +120 -0
- package/skills/real-test-pi-crew/REPORT-TEMPLATE.md +2 -0
- package/skills/real-test-pi-crew/SKILL.md +181 -1
- package/src/config/config-validation.ts +0 -2
- package/src/config/defaults.ts +0 -1
- package/src/config/types.ts +0 -5
- package/src/extension/crew-input-router.ts +2 -0
- package/src/extension/crew-vibes/config.ts +1 -77
- package/src/extension/crew-vibes/index.ts +36 -330
- package/src/extension/crew-vibes/render.ts +1 -106
- package/src/extension/help.ts +1 -2
- package/src/extension/register.ts +7 -2
- package/src/extension/registration/command-registration.ts +5 -1
- package/src/extension/registration/commands/manage.ts +5 -4
- package/src/extension/registration/commands/schedules.ts +212 -0
- package/src/extension/registration/commands/shared.ts +56 -2
- package/src/extension/registration/lifecycle-handlers.ts +16 -2
- package/src/extension/registration/schedule-toast-bridge.ts +109 -0
- package/src/extension/registration/subagent-tools.ts +16 -6
- package/src/extension/registration/team-tool.ts +10 -3
- package/src/extension/registration/terminal-status-wiring.ts +172 -0
- package/src/extension/registration/viewers.ts +72 -1
- package/src/extension/team-tool/handle-schedule.ts +120 -1
- package/src/extension/team-tool/handle-settings.ts +14 -2
- package/src/runtime/scheduling/scheduler.ts +120 -6
- package/src/runtime/settings-store.ts +28 -2
- package/src/runtime/task-display.ts +1 -1
- package/src/schema/config-schema.ts +4 -0
- package/src/state/coordination/locks.ts +17 -2
- package/src/ui/adaptive-card.ts +65 -0
- package/src/ui/agents-jobs-browser.ts +791 -0
- package/src/ui/card-colors.ts +36 -7
- package/src/ui/dashboard-panes/agents-pane.ts +52 -17
- package/src/ui/dashboard-panes/cancellation-pane.ts +0 -42
- package/src/ui/dashboard-panes/health-pane.ts +7 -5
- package/src/ui/dashboard-panes/mailbox-pane.ts +22 -6
- package/src/ui/dashboard-panes/metrics-pane.ts +15 -7
- package/src/ui/dashboard-panes/pane-theme.ts +21 -0
- package/src/ui/dashboard-panes/plan-pane.ts +63 -30
- package/src/ui/dashboard-panes/progress-pane.ts +3 -2
- package/src/ui/dashboard-panes/schedules-pane.ts +177 -0
- package/src/ui/dashboard-panes/transcript-pane.ts +11 -5
- package/src/ui/dwf-phase-display.ts +3 -20
- package/src/ui/format-helpers.ts +22 -0
- package/src/ui/inline-panel/crew-editor.ts +32 -9
- package/src/ui/inline-panel/index.ts +66 -4
- package/src/ui/key-utils.ts +3 -0
- package/src/ui/keybinding-map.ts +286 -34
- package/src/ui/live-conversation-overlay.ts +176 -46
- package/src/ui/live-run-sidebar.ts +134 -55
- package/src/ui/mascot.ts +34 -17
- package/src/ui/overlays/agent-picker-overlay.ts +81 -26
- package/src/ui/overlays/confirm-overlay.ts +55 -28
- package/src/ui/overlays/help-overlay.ts +108 -53
- package/src/ui/overlays/mailbox-compose-overlay.ts +89 -49
- package/src/ui/overlays/mailbox-detail-overlay.ts +137 -57
- package/src/ui/powerbar-publisher.ts +0 -1
- package/src/ui/rail.ts +333 -0
- package/src/ui/run-dashboard.ts +344 -72
- package/src/ui/settings-overlay.ts +84 -42
- package/src/ui/terminal-status.ts +7 -1
- package/src/ui/theme-adapter.ts +0 -45
- package/src/ui/theme-discovery.ts +12 -6
- package/src/ui/tool-progress-formatter.ts +126 -8
- package/src/ui/tool-renderers/brief-mode.ts +8 -66
- package/src/ui/tool-renderers/index.ts +372 -521
- package/src/ui/transcript-viewer.ts +33 -14
- package/src/ui/widget/index.ts +86 -133
- package/src/ui/widget/task-list.ts +64 -32
- package/src/ui/widget/widget-formatters.ts +3 -399
- package/src/ui/widget/widget-model.ts +28 -7
- package/src/ui/widget/widget-renderer.ts +298 -265
- package/src/ui/widget/widget-types.ts +0 -9
- package/src/utils/relative-time.ts +33 -0
- package/src/utils/visual.ts +0 -4
- package/src/extension/crew-vibes/figures.ts +0 -101
- package/src/extension/crew-vibes/font-detect.ts +0 -71
- package/src/extension/crew-vibes/footer.ts +0 -313
- package/src/extension/crew-vibes/speed.ts +0 -286
- package/src/ui/dock-footer.ts +0 -49
- package/src/ui/dynamic-border.ts +0 -35
- package/src/ui/loaders.ts +0 -6
- package/src/ui/overlay-stack.ts +0 -148
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,221 @@
|
|
|
2
2
|
|
|
3
3
|
> **Note:** `atomic-write-v2.ts` / `AtomicWriter` mentioned in historical entries below was consolidated into `atomic-write.ts` as of v0.9.42. This changelog is preserved as historical record — the migration was completed (the v2 class was never adopted; v1 won on simplicity + symlink-safety + link+unlink atomicity). See `docs/migration/atomic-write-v2-migration.md` for the decision rationale.
|
|
4
4
|
|
|
5
|
+
## [0.11.1] — RAIL: one UI design language for every surface + UI-audit fixes (2026-09-16)
|
|
6
|
+
|
|
7
|
+
### feat(ui): RAIL — a single visual language for the whole product
|
|
8
|
+
|
|
9
|
+
- **New shared design system.** `src/ui/rail.ts` owns every glyph and helper —
|
|
10
|
+
rail `┏ ┣ ┃ ┗`, the `NAME ▸ SUBJECT` canopy, dot leaders `······`, the
|
|
11
|
+
eighth-block gauge `▕████▎░░▏`, status slot/badge/icon maps, `overflowHint`,
|
|
12
|
+
`formatHint`/`keyToken`, `CURSOR`/`ACTIVE` — and `docs/UI-DESIGN-SYSTEM.md`
|
|
13
|
+
documents the grammar, the seven surface classes and the width contract.
|
|
14
|
+
`src/ui/tool-renderers/index.ts` now imports from it instead of declaring its
|
|
15
|
+
own copies.
|
|
16
|
+
- **Tool card (team + subagent) redesigned**: width-deferred through
|
|
17
|
+
`AdaptiveCard` (a frame built for 116 columns no longer tears at 100), one
|
|
18
|
+
unified identity canopy (`┏ CREW ▸ <team>`, `┏ AGENT ▸ <name>`,
|
|
19
|
+
`┏ LIST`), agent name surfaced while the run is still streaming, fail-visible
|
|
20
|
+
outcome on three levels, `done`/`succeeded` alias handling, merged
|
|
21
|
+
tally+gauge with the elapsed segment right-aligned, and `role/agent`
|
|
22
|
+
duplication collapsed (`verifier/verifier` → `verifier`).
|
|
23
|
+
- **Every other surface migrated**: crew widget (still exactly ONE row:
|
|
24
|
+
`┃ ⠧ CREW ▸ fast-fix · 2 running · 3/5 done · ⏰ 1 sched ···· ↓·enter`, idle row
|
|
25
|
+
`┃ CREW ▸ idle · …`, focused `❯` marker), plan/task list (`┏ PLAN ▸ <title>`),
|
|
26
|
+
live-run sidebar (`┏ LIVE ▸ <runId8>` + `┣ ACTIVE ▸ n`), team dashboard,
|
|
27
|
+
Agents & Jobs browser, settings overlay, transcript viewer, live-conversation
|
|
28
|
+
/ help / confirm / mailbox-detail / mailbox-compose / agent-picker overlays,
|
|
29
|
+
dashboard panes and `/team-mascot`. The rounded box `╭─╮│╰─╯├┤` and the inline
|
|
30
|
+
`── label ──` rule are retired (sections are `┣ NAME ▸ x`).
|
|
31
|
+
- **One dialect per concept**: cursor `›`, active/section marker `▸`, overflow
|
|
32
|
+
`▲ n above` / `▼ m below` (was four dialects), hints `keys label · …` with the
|
|
33
|
+
close/cancel action last and canonical key spelling (`Esc`, `Enter`, `Tab`) —
|
|
34
|
+
including an `exactKeys` mode for the case-sensitive plan-approval keyspace
|
|
35
|
+
(`A` approve vs `n` deny).
|
|
36
|
+
|
|
37
|
+
### fix(ui): bugs found by the audit, the cold-verify pass and live runs
|
|
38
|
+
|
|
39
|
+
- **`undefined — ↓·enter` in the widget after a run finished** — the zero-runs
|
|
40
|
+
branch built its row without checking `schedLine`; with no active runs and no
|
|
41
|
+
schedules it painted the literal `undefined`. It now renders nothing.
|
|
42
|
+
- **No `undefined` can reach a string**: every interpolated field on records read
|
|
43
|
+
from disk (`agents.json`, schedules, metrics) is guarded — role/agent/model
|
|
44
|
+
routing in the sidebar and agent picker, every persisted job field in the
|
|
45
|
+
schedules pane, metric label values, and the settings `Edit` title.
|
|
46
|
+
- `1 tools` → `1 tool` (one `formatCount` helper, five surfaces).
|
|
47
|
+
- Help cheatsheet no longer prints a raw TAB (`keyToken` missed `\t`).
|
|
48
|
+
- `role->agent` → `role▸agent` everywhere, including the producer
|
|
49
|
+
(`task-display.ts`) rather than only at one render boundary.
|
|
50
|
+
- Settings overlay: the edit submenu hint is built by `formatHint` and no longer
|
|
51
|
+
advertises a key that is not bound.
|
|
52
|
+
|
|
53
|
+
### fix(ui): phantom affordances, schema drift and theme discovery (P0)
|
|
54
|
+
|
|
55
|
+
- **`/team-settings theme <name>` works again**: `theme-discovery.ts` used bare
|
|
56
|
+
`require("node:fs")` inside a module loaded by dynamic import, so discovery
|
|
57
|
+
could fail silently and only the builtin themes were selectable. Now a
|
|
58
|
+
top-level import, with a HOME-sandboxed test (13 themes discovered, active
|
|
59
|
+
theme read from `settings.json`, `setPiTheme()` writes).
|
|
60
|
+
- Removed the phantom `p` (progressToggle) binding/action/help entry, the no-op
|
|
61
|
+
`placement` option, and the non-existent `/team-cleanup` / `/team-health`
|
|
62
|
+
commands from help.
|
|
63
|
+
- Schema/docs drift: `ui.widgetRowStyle`, `ui.inlinePanel`,
|
|
64
|
+
`ui.autoCloseDashboardMs` added to `schema.json` + configuration schema so
|
|
65
|
+
editors stop flagging valid keys; brief-mode command description scoped to
|
|
66
|
+
what it really does; help overlay gained the Schedules and Plan key groups;
|
|
67
|
+
keyboard reference and command docs corrected.
|
|
68
|
+
- `LiveConversationOverlay` gained a real `handleInput` (scroll, auto-scroll
|
|
69
|
+
toggle, close) so its advertised footer keys are reachable.
|
|
70
|
+
- **Terminal status restored**: the documented tab-title + Ghostty `OSC 9;4`
|
|
71
|
+
progress integration is now wired (`installTerminalStatus`) instead of the
|
|
72
|
+
no-op dispose handler; best-effort, debounced, headless-safe.
|
|
73
|
+
|
|
74
|
+
### chore: dead code removed
|
|
75
|
+
|
|
76
|
+
- Deleted `overlay-stack.ts`, `ui/loaders.ts`, `crew-vibes/figures.ts`,
|
|
77
|
+
`crew-vibes/font-detect.ts`, `dynamic-border.ts` and `boxLine()` plus their
|
|
78
|
+
tests (~1.7k lines net), together with the dead `compactAgentRow` chain.
|
|
79
|
+
- Removed the orphaned `ui.widgetRowStyle` config chain (default, type,
|
|
80
|
+
parser, TypeBox schema, `schema.json`, KNOWN_KEYS, `model.rowStyle` field,
|
|
81
|
+
`WidgetRowStyle` type): the M4 RAIL dock renders exactly one layout, so the
|
|
82
|
+
key had no reader left. The strict schema now rejects it as unknown;
|
|
83
|
+
schema-sync + settings tests pin the removal in both directions so it cannot
|
|
84
|
+
resurface.
|
|
85
|
+
|
|
86
|
+
### fix(ui): defects found by rendering a REAL team run
|
|
87
|
+
|
|
88
|
+
Rendering the live run `team_20260916110100` through every surface (tool card,
|
|
89
|
+
widget dock, plan card, sidebar, dashboard, agents & jobs browser) exposed seven
|
|
90
|
+
defects the review passes had missed:
|
|
91
|
+
|
|
92
|
+
- **The dock spun forever.** `┃ ⠹ CREW ▸ fast-fix · 0 running · 3/3 done` — a
|
|
93
|
+
spinner with nothing to spin for, because the header always received a braille
|
|
94
|
+
frame. The leading glyph now reflects state (`⠋…` only while a worker is
|
|
95
|
+
running, otherwise `✓`/`✗`); zero counts (`0 running`) are no longer printed.
|
|
96
|
+
- **The dock lost its key hint on a narrow terminal.** At 50 columns the row
|
|
97
|
+
ended in `···· ↓…`; the leader budget now shrinks with the width so the left
|
|
98
|
+
segment is trimmed (with `…`) and `↓·enter` always survives.
|
|
99
|
+
- **The run dashboard truncated the status into `complete…`.** The narrow-width
|
|
100
|
+
fallback clipped `head · meta` as one string, cutting the very token the run
|
|
101
|
+
list exists to show. Meta now yields first, then the goal; the head (run id +
|
|
102
|
+
status) is only clipped if it cannot fit at all.
|
|
103
|
+
- **Sidebar printed an invented `· right default` string** — replaced with the
|
|
104
|
+
run's real `workspaceMode` (`single` / `worktree`).
|
|
105
|
+
- **`fast-fix/fast-fix`** in the sidebar and dashboard — one shared
|
|
106
|
+
`teamWorkflowLabel()` collapses the workflow half when it repeats the team.
|
|
107
|
+
- **Raw usage rows** (`input=2780, output=3715, cacheRead=57216, cost=0.000000,
|
|
108
|
+
turns=0`) — the sidebar now uses the compact `↑2.8k ↓3.7k` form the tool card
|
|
109
|
+
already had (the `key=value` form stays for CLI/status output).
|
|
110
|
+
- **`314.7s` instead of `5m44s`**, `1 runs` instead of `1 run`, `3 agents` /
|
|
111
|
+
`N runs` without pluralisation, and `┃ - none` for empty sections — all
|
|
112
|
+
normalised through `formatDuration` / `formatCount`.
|
|
113
|
+
|
|
114
|
+
### verification
|
|
115
|
+
|
|
116
|
+
- `test:unit` full suite, `test:critical` (117/117), `test:bundle` (2/2), biome,
|
|
117
|
+
`format:check`, `tsc --noEmit` and bundle size/staleness gates all run on the
|
|
118
|
+
release tree; UI migration verified by an independent verifier rendering real
|
|
119
|
+
surfaces at 40/60/80/100/160 columns.
|
|
120
|
+
|
|
121
|
+
## [0.11.0] — Scheduled Jobs UI + Agents & Jobs browser + kitty CSI-u hardening (2026-09-15)
|
|
122
|
+
|
|
123
|
+
### feat(ui): Agents & Jobs browser — the crew widget's ↓+Enter popup
|
|
124
|
+
|
|
125
|
+
- The crew widget is now ONE screen line (`Crew agents 3/5 · 1 running · 24m · ↓·enter`); pressing `↓` or Enter opens the Agents & Jobs browser — a framed modal (border box with live counts in the top frame, key hints in the bottom frame) listing every widget-visible agent and scheduled job from the SAME data source as the widget counts (`activeWidgetRuns()` over `.crew/state/runs/*/agents.json` + `recordTokPerSec()` usage snapshots), so the browser and the widget can never disagree.
|
|
126
|
+
- Agent rows show role/status/duration/tok-per-sec live; job rows show cron/interval + next run. Focus modes cycle Agents → Jobs; jobs keep their inline detail view.
|
|
127
|
+
- Pressing Enter on an agent row opens the full transcript overlay (`DurableTranscriptViewer` — the same experience as `/crew transcript`). For RUNNING agents the transcript path resolves through a 3-tier fallback (record.transcriptPath → status.json → artifacts-root `transcripts/<taskId>.attempt-N.jsonl` convention), because records only carry the path after completion.
|
|
128
|
+
- The legacy `p` key (spawn a mux pane tailing the watcher-formatted log) is retired: a log tail is not a real pi session. The retired code stays as commented blocks for a future "focus the existing surface pane" key.
|
|
129
|
+
|
|
130
|
+
### feat(agents): live surface panes — watch a worker's REAL pi TUI
|
|
131
|
+
|
|
132
|
+
- New `runtime.surface` config (`~/.pi/agent/pi-crew.json`): `{ mode: "herdr" | "tmux", visibleAgents: ["agent", ...] }` boots eligible workers inside a real mux pane running the pi TUI (the worker's `--mode json -p` args are stripped for the pane) — watch the worker's actual footer/model/widget live instead of log tails. The pane closes itself when the worker finishes; resume is never used (resuming would kill the subagent).
|
|
133
|
+
- Surface spawns emit `worker.surface_spawned` (+ `surfacePaneId` on `worker.started`); gate rejections emit `worker.surface_gate_blocked` with the reason. Async workers forward TERM/HERDR_*/mux env into the child.
|
|
134
|
+
|
|
135
|
+
### fix(ui): kitty CSI-u hardening — matchesKey everywhere
|
|
136
|
+
|
|
137
|
+
- Every overlay now routes Enter/Escape through `@earendil-works/pi-tui`'s `matchesKey` instead of raw byte compare: kitty's disambiguate-codes protocol sends `\x1b[13u`/`\x1b[27u`, so raw `\r`/`\x1b` compares silently swallowed keys. Sweep covered the agents browser, confirm, agent-picker, mailbox detail, mailbox compose, live-conversation overlays, transcript viewer, mascot, and settings overlay (backspace ×2).
|
|
138
|
+
- `src/ui/key-utils.ts` re-exports `matchesKey` for overlays that cannot import pi-tui directly.
|
|
139
|
+
|
|
140
|
+
### fix(ci-windows): the two real flakes behind windows-latest failures
|
|
141
|
+
|
|
142
|
+
- Broker integration helpers compressed EVERY client timer to 100ms (intent: only the 1s hello deadline) — the 15s request timeout and the explicit 2s escalate budget fired before slow NTFS durable writes could land, nondeterministically killing clients with fallback-sticky `request-timeout` (broadcast/DM/escalate tests). Timers ≤1s compress; real request budgets stay real.
|
|
143
|
+
- `O_CREAT|O_EXCL` against a `.flock` held mid-create by another process surfaces as EPERM/EBUSY (not EEXIST) on Windows — both lock retry loops now treat EPERM/EBUSY as contention (deadline still bounds the wait). Fixes the ST-3 cross-process flock EPERM crash.
|
|
144
|
+
- Also in this release: `npm run lint` (biome) added to the pre-push gate — three unused members left by the p retirement had slipped past a tsc+format-only gate.
|
|
145
|
+
|
|
146
|
+
### Scheduled Jobs UI (tiers A/C/D/E — previously unreleased)
|
|
147
|
+
|
|
148
|
+
### feat(vibes): tok/s speed UI REMOVED — pi's built-in working indicator always used
|
|
149
|
+
|
|
150
|
+
- Maintainer decision: the entire speed subsystem is deleted, not toggled off — custom spinner frames (`setWorkingIndicator`), the `Working N tok/s` message (`setWorkingMessage`), SpeedTracker/SpeedAnimator, the speed config block, and every speed event handler (agent_start/turn_start/message_*/turn_end/agent_end wiring). crew-vibes is now a single-purpose module: fetch the provider rate-limit quota and publish it as a status entry on pi's native footer. `/team-vibes` shrinks to `[on|off]`.
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
### feat(footer): restore pi's NATIVE footer — custom footer replacement retired (UI-review option 1)
|
|
154
|
+
|
|
155
|
+
- Maintainer decision: the crew-vibes custom footer (setFooter replacement that re-implemented pi's pwd/stats/status lines to guarantee the quota a never-truncated line) is REMOVED — pi's built-in footer is always shown. The re-implementation had drifted from native (missing `CH%` cache-hit, missing `xp` segment, totals ignoring toolResult/branch-summary/compaction usage, hardcoded `(auto)`), and composing pi's native FooterComponent is impossible by design (extensions only receive ReadonlySessionManager, not AgentSession).
|
|
156
|
+
- Provider quota (`z.ai 5h ━ 37% 46m Wk …`) now publishes through `ctx.ui.setStatus` and joins pi's native status line (right-truncates on very narrow terminals — accepted).
|
|
157
|
+
- The crew widget ALWAYS renders through pi's widget slots now (`bottom` placement maps to belowEditor): FooterDockHost, the dock-footer registry, slotInstalled/dockedInFooter state, and WidgetRenderOptions.noSchedulesLine are deleted. The ⏰ schedules line and all run rows paint in the belowEditor slot exactly as the pre-footer design; the keep-alive fix is preserved.
|
|
158
|
+
- Clock-injection sweep (D6-T4) in the render path: compactDockLines/detailed rows/agents-pane now pin ONE clock per render (options.now / options.nowMs) threaded into orderWidgetAgents, dockUsageText, agentStats, computeLiveDurationMs — no more scattered Date.now() reads that could straddle a tick.
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
### feat(footer): retire the capacity stage meter; the ⏰ schedules segment takes its slot
|
|
162
|
+
|
|
163
|
+
- Maintainer decision after the full UI review: the capacity meter (context token count `74k` + `○ Orbit/Cruise/Warp/…` stage glyph) duplicated the context percent already shown on the stats line and carried no actionable signal — removed from the footer composition (`renderCapacity` remains exported for its unit tests).
|
|
164
|
+
- The meter line now carries the Tier-C schedules segment on the LEFT (`⏰ N sched · next …`) with the provider quota right-aligned on the SAME line (wraps to two lines only on narrow terminals). Net effect: one screen line saved — the schedules line no longer paints as its own dock line when the crew-vibes footer is active.
|
|
165
|
+
- `CrewWidgetModel.dockedInFooter` + `WidgetRenderOptions.noSchedulesLine`: in the dock path the widget no longer paints `⏰` itself (the footer owns it — no duplicate painter); slot mode (no footer sink) keeps painting it unchanged.
|
|
166
|
+
|
|
167
|
+
### fix(scheduler): cron jobs never fired — arm() had no `cron` branch (P1-1 from UI review)
|
|
168
|
+
|
|
169
|
+
- Root cause of the live "next 7h ago" symptom: `arm()` only handled `interval`/`once`, so cron jobs were persisted with a `nextRun` but never got a timer — silent death. `nextRunTime()`/`nextCronDate` (already in the same file) were simply never wired into arming.
|
|
170
|
+
- `arm()` now arms cron via a chained `setTimeout` hop toward the next occurrence, clamped below the 2^31-1 ms timer ceiling (`MAX_TIMER_DELAY_MS`) so yearly crons cannot mis-fire on overflow; `disarm()` clears the cron handle on the right branch.
|
|
171
|
+
- After each cron fire, `advanceCronNextRun()` recomputes and persists the next occurrence (previously `nextRun` was written exactly once, at job creation); jobs whose next occurrence is not computable self-disable with an `error` event explaining why.
|
|
172
|
+
- Scheduler constructor takes an injectable clock (`now?: () => Date`, default `Date.now`) per the D6-T4 clock-injection convention — cron firing tests run on a fake clock, no real sleeps.
|
|
173
|
+
- New suite `test/unit/runtime/scheduling/scheduler-cron-arm.test.ts` (first fire, re-arm + nextRun advance, mid-flight disable, overflow chaining, disarm) — red on the pre-fix HEAD, green with the fix.
|
|
174
|
+
|
|
175
|
+
### feat(ui): B2 gate hint — "N project-tier jobs hidden" on all three surfaces (P2-1)
|
|
176
|
+
|
|
177
|
+
- The Wave B2 opt-in gate (`schedulingEnabled` + `allowProjectScheduledJobs`, both required in user-tier `~/.pi/crew-settings.json`) was completely invisible: gated-out jobs made every surface fall into the plain empty state, looking like the jobs were lost.
|
|
178
|
+
- New companion getter `getScheduledJobsHiddenCount()` / pure `scheduledJobsHiddenCountOf(tiers)` in `settings-store.ts` (no signature change to `getScheduledJobs`); the paint path reuses the registration-time tiers stash — no new disk reads on render.
|
|
179
|
+
- Schedules pane + `/schedules` (via the shared renderer, parity test kept) append one dim hint line, the widget line appends a compact `· N hidden` — all three surfaces, EN-only per project convention, shown only when hiddenCount > 0.
|
|
180
|
+
|
|
181
|
+
### test: settings-store tests are now hermetic
|
|
182
|
+
|
|
183
|
+
- `loadCrewSettings()` gained an optional `globalFile` param (default unchanged). The three affected tests previously read the developer's REAL `~/.pi/crew-settings.json` ("defaults when file missing" failed the moment that file exists with scheduling flags) — they now pin an absent temp global file.
|
|
184
|
+
|
|
185
|
+
Full Scheduled Jobs UI stack over the existing scheduler/settings layer. No version bump yet — no schema or persistence changes; reads a single provider, mutations go through the existing extension channel.
|
|
186
|
+
|
|
187
|
+
### feat(ui): schedules dashboard pane (tier A)
|
|
188
|
+
|
|
189
|
+
- New pane 8 in the run dashboard (`src/ui/dashboard-panes/schedules-pane.ts`, pure string renderer): one main line per job (enabled glyph ●/○ · name truncate · humanized schedule · relative next-run · last status ✓/✗/⟳ · runCount) plus a sub line (subagentType · lastRun · id in headless mode). Empty state: `No scheduled jobs — create via team tool action='schedule'`.
|
|
190
|
+
- Keys `T/N/V/X/R` (pane-scoped in `keybinding-map.ts`): toggle-enabled, run-now, details toggle (goal + ScheduleSpec + spawnedRunIds), delete with a **2-step confirm-gate** (first X arms + warning line, any other key disarms), refresh (drops the provider cache). Job cursor up/down while pane 8 owns input.
|
|
191
|
+
- Mutations never touch the scheduler from the UI layer: they leave the dashboard only as `done()` selections carrying `schedule-*` actions + `jobId`, routed by `commands/shared.ts openTeamDashboard` through `handleTeamTool({action:'schedule', subAction, jobId})` → `handle-schedule.ts` (the same channel as the chat tool), then the result surfaces as an info/error toast and the dashboard reopens.
|
|
192
|
+
|
|
193
|
+
### feat(ui): schedules line in the crew widget (tier C)
|
|
194
|
+
|
|
195
|
+
- One lowest-priority widget row (`src/ui/widget/widget-renderer.ts`): `⏰ N sched · next Xm` — painted ONLY when ≥1 enabled job exists, always last (below active-run info). The line joins the widget cache signature so add/remove/toggle repaints immediately. Survives the no-runs collapse (scheduled jobs are exactly what runs while nothing interactive is active). One clock read per render feeds both the signature and the painted line.
|
|
196
|
+
|
|
197
|
+
### feat(extension): scheduler event toasts (tier D)
|
|
198
|
+
|
|
199
|
+
- New `schedule-toast-bridge.ts` wired into the scheduler's `emit` in `lifecycle-handlers.ts`: `fired` → `⏰ <name> fired → <agentId>` (info); failures → red. Failure has two producers — the scheduler's synchronous `error` event and the (common) async executor rejection recorded as a `running→error` lastStatus transition — deduped per attempt so one failed attempt = one notice. Success surfaces as `⏰ <name> ✓ succeeded` on a tracked lastStatus transition only (no drip on patches). Bounded like the hung-notice pattern; headless no-ops; all interpolated fields sanitized.
|
|
200
|
+
|
|
201
|
+
### feat(commands): /schedules + /schedules log (tier E, headless-compatible)
|
|
202
|
+
|
|
203
|
+
- New `/schedules` command re-uses the SAME pane renderer (text-block variant — no copied table logic) so command and dashboard can never drift. Natural-language phrases `crew schedule` / `scheduled jobs` rewrite via the crew-input-router.
|
|
204
|
+
- `/schedules log <jobId-or-name>` resolves a job by id or name, tails the most recent output artifact of its latest spawned run (32KB bound, traversal-guarded via `resolveRealContainedPath`; unsafe-charset runIds degrade to an error result). Works under `pi -p` — the handler touches only `ctx.cwd` + `ctx.ui.notify`.
|
|
205
|
+
|
|
206
|
+
### fix(scheduling): run-now on a once job consumes it
|
|
207
|
+
|
|
208
|
+
- `CrewScheduler.runNow()` on a `once` job now self-disables after the forced fire (mirroring the timer-driven path). Previously the still-armed timer would fire the job a SECOND time at its scheduled time — a one-shot executing twice.
|
|
209
|
+
|
|
210
|
+
### Constraints honored
|
|
211
|
+
|
|
212
|
+
- **Single source of truth (G17)** — every consumer (pane, command, widget, autocomplete) reads jobs through one provider `getScheduledJobs()` (scheduler singleton, gated settings-tier fallback). No defaults copies anywhere.
|
|
213
|
+
- **Injectable clock (D6-T4)** — renderers take `now: Date` as a parameter; no `Date.now()` on any render path (pane, widget, command, and the provider TTL timestamp).
|
|
214
|
+
- **Extension channel only** — toggle/run-now/delete dispatch through `handle-schedule.ts` subActions; persisted `scheduledJobs` shape unchanged.
|
|
215
|
+
|
|
216
|
+
### Tests
|
|
217
|
+
|
|
218
|
+
- New: `schedules-pane`, `schedules-dashboard`, `widget-schedules-line`, `relative-time`, `schedules-command`, `schedule-toast-bridge`, `team-tool-schedule-provider`, `scheduler-run-now`, `dashboard-schedule-routing` (155+ assertions across render parity, injected clock, confirm-gate, toast bounds/dedup, traversal guards, once-job run-now regression, shared.ts routing integration).
|
|
219
|
+
|
|
5
220
|
## [0.10.6] — agent/skill resource layer + broker coordination fixes (2026-09-12)
|
|
6
221
|
|
|
7
222
|
### fix(bundle): PACKAGE_SKILLS_DIR resolves via `packageRoot()` instead of broken `import.meta.url` walk-up
|
package/README.md
CHANGED
|
@@ -699,7 +699,6 @@ the `goal` action's completion-guarantee loop to builtin workflows.
|
|
|
699
699
|
| Key path | Type | Default | Description |
|
|
700
700
|
|----------|------|---------|-------------|
|
|
701
701
|
| `ui.widgetPlacement` | `aboveEditor \| belowEditor \| bottom` | `bottom` | Where the status widget renders. `bottom` docks inside the crew-vibes footer (very bottom of the screen), falling back to `belowEditor` when no footer sink exists. |
|
|
702
|
-
| `ui.widgetRowStyle` | `compact \| detailed` | `compact` | Per-agent row layout in the widget (`compact` = one width-budgeted line per agent; `detailed` = two-line tree). |
|
|
703
702
|
| `ui.inlinePanel` | `boolean` | `true` | Keyboard-navigable agent rows under the prompt (`↓` from an empty prompt). Yields to any extension that owns the editor component. |
|
|
704
703
|
| `ui.refreshMs` | `number` | `1000` | Internal UI refresh cadence default (not a user-settable `ui.*` schema key — kept here for completeness). |
|
|
705
704
|
| `ui.widgetDefaultFrameMs` | `number` | `1000` | Internal widget frame-budget default (not a user-settable `ui.*` schema key — kept here for completeness). |
|