@pi-unipi/unipi 3.0.0-alpha.2 → 3.0.0-alpha.4

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 (229) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +5 -5
  3. package/package.json +23 -22
  4. package/packages/ask-user/package.json +2 -2
  5. package/packages/autocomplete/package.json +1 -1
  6. package/packages/autocomplete/src/constants.ts +20 -23
  7. package/packages/background-tasks/package.json +2 -2
  8. package/packages/background-tasks/src/config.ts +0 -73
  9. package/packages/background-tasks/src/index.ts +0 -15
  10. package/packages/background-tasks/src/registry.ts +1 -171
  11. package/packages/background-tasks/src/types.ts +0 -32
  12. package/packages/btw/README.md +13 -56
  13. package/packages/btw/extensions/btw.ts +403 -1796
  14. package/packages/btw/package.json +5 -2
  15. package/packages/btw/skills/btw/SKILL.md +7 -143
  16. package/packages/compactor/README.md +59 -286
  17. package/packages/compactor/package.json +5 -9
  18. package/packages/compactor/skills/compactor/SKILL.md +13 -20
  19. package/packages/compactor/src/card.ts +95 -0
  20. package/packages/compactor/src/commands/index.ts +85 -124
  21. package/packages/compactor/src/compaction/compact-args.ts +5 -3
  22. package/packages/compactor/src/compaction/filter-noise.ts +1 -1
  23. package/packages/compactor/src/compaction/hooks.ts +533 -312
  24. package/packages/compactor/src/compaction/jev-prune.ts +114 -0
  25. package/packages/compactor/src/compaction/source.ts +159 -0
  26. package/packages/compactor/src/compaction/summarize.ts +704 -52
  27. package/packages/compactor/src/config/manager.ts +127 -127
  28. package/packages/compactor/src/config/schema.ts +32 -48
  29. package/packages/compactor/src/index.ts +40 -431
  30. package/packages/compactor/src/info-screen.ts +44 -190
  31. package/packages/compactor/src/session/recall-blocks.ts +1 -1
  32. package/packages/compactor/src/stats.ts +76 -0
  33. package/packages/compactor/src/tools/context-budget.ts +17 -34
  34. package/packages/compactor/src/tools/ctx-doctor.ts +45 -36
  35. package/packages/compactor/src/tools/register.ts +29 -269
  36. package/packages/compactor/src/types.ts +48 -186
  37. package/packages/core/child-agent.ts +1 -0
  38. package/packages/core/command-echo.ts +63 -0
  39. package/packages/core/compaction-context.ts +41 -0
  40. package/packages/core/constants.ts +7 -12
  41. package/packages/core/fusion-status.ts +4 -0
  42. package/packages/core/index.ts +4 -0
  43. package/packages/core/package.json +1 -1
  44. package/packages/core/src/child-agent/child-args.ts +31 -0
  45. package/packages/core/src/child-agent/delivery.ts +41 -0
  46. package/packages/core/src/child-agent/index.ts +5 -0
  47. package/packages/core/src/child-agent/readers.ts +202 -0
  48. package/packages/core/src/child-agent/runtime.ts +571 -0
  49. package/packages/core/src/jev/settings.ts +177 -14
  50. package/packages/core/src/settings/engine.ts +48 -2
  51. package/packages/core/src/settings/hub.ts +39 -10
  52. package/packages/core/src/settings/schema.ts +19 -3
  53. package/packages/core/src/tui/hub-kit.ts +12 -0
  54. package/packages/core/src/tui/kit.ts +198 -0
  55. package/packages/core/src/tui/progress.ts +73 -0
  56. package/packages/footer/README.md +4 -6
  57. package/packages/footer/package.json +3 -3
  58. package/packages/footer/src/help.ts +1 -1
  59. package/packages/footer/src/index.ts +33 -2
  60. package/packages/footer/src/presets.ts +3 -4
  61. package/packages/footer/src/rendering/icons.ts +0 -20
  62. package/packages/footer/src/segments/compactor.ts +52 -142
  63. package/packages/footer/src/segments/status-ext.ts +0 -1
  64. package/packages/fusion/package.json +3 -3
  65. package/packages/fusion/src/child-args.ts +1 -0
  66. package/packages/fusion/src/index.ts +121 -5
  67. package/packages/fusion/src/pi-settings.ts +57 -0
  68. package/packages/fusion/src/picker.ts +116 -37
  69. package/packages/fusion/src/preset.ts +56 -2
  70. package/packages/fusion/src/prompts.ts +1 -1
  71. package/packages/fusion/src/sidekick-runtime.ts +1 -420
  72. package/packages/fusion/src/tools.ts +71 -133
  73. package/packages/fusion/src/transcript.ts +37 -82
  74. package/packages/image/package.json +2 -2
  75. package/packages/info-screen/package.json +2 -2
  76. package/packages/input-shortcuts/package.json +2 -2
  77. package/packages/input-shortcuts/src/cleared-input.ts +97 -0
  78. package/packages/input-shortcuts/src/index.ts +4 -0
  79. package/packages/kanboard/README.md +16 -8
  80. package/packages/kanboard/index.ts +4 -0
  81. package/packages/kanboard/package.json +7 -7
  82. package/packages/kanboard/skills/kanboard/SKILL.md +10 -4
  83. package/packages/kanboard/src/bin.ts +4 -2
  84. package/packages/kanboard/src/commands.ts +6 -1
  85. package/packages/kanboard/src/progress.ts +27 -0
  86. package/packages/kanboard/src/runner.ts +227 -63
  87. package/packages/kanboard/src/settings.ts +62 -2
  88. package/packages/long-horizon/index.ts +53 -5
  89. package/packages/long-horizon/package.json +2 -2
  90. package/packages/long-horizon/src/commands.ts +18 -1
  91. package/packages/long-horizon/src/compaction-brief.ts +35 -0
  92. package/packages/long-horizon/src/engine/continuation.ts +4 -3
  93. package/packages/long-horizon/src/engine/goal-state.ts +2 -1
  94. package/packages/long-horizon/src/engine/runaway.ts +1 -1
  95. package/packages/long-horizon/src/gate.ts +13 -8
  96. package/packages/long-horizon/src/progress.ts +87 -0
  97. package/packages/long-horizon/src/runtime.ts +61 -6
  98. package/packages/long-horizon/src/settings.ts +53 -38
  99. package/packages/long-horizon/src/tools/graph.ts +1 -1
  100. package/packages/long-horizon/src/tools/swarm.ts +3 -3
  101. package/packages/mcp/package.json +2 -2
  102. package/packages/memory/index.ts +48 -17
  103. package/packages/memory/package.json +3 -3
  104. package/packages/memory/tools.ts +99 -105
  105. package/packages/notify/package.json +2 -2
  106. package/packages/skill-registry/package.json +1 -1
  107. package/packages/subagents/README.md +40 -119
  108. package/packages/subagents/package.json +5 -13
  109. package/packages/subagents/skills/subagents/SKILL.md +18 -42
  110. package/packages/subagents/src/agents.ts +213 -0
  111. package/packages/subagents/src/badge-session.ts +46 -0
  112. package/packages/subagents/src/badge.ts +43 -0
  113. package/packages/subagents/src/cards.ts +172 -0
  114. package/packages/subagents/src/index.ts +559 -1086
  115. package/packages/subagents/src/manager.ts +399 -0
  116. package/packages/subagents/src/profiles.ts +130 -0
  117. package/packages/subagents/src/transcript.ts +154 -0
  118. package/packages/subagents/src/ui.ts +328 -0
  119. package/packages/unipi/bundled.js +11231 -21693
  120. package/packages/unipi/index.ts +3 -2
  121. package/packages/updater/package.json +2 -2
  122. package/packages/utility/package.json +2 -2
  123. package/packages/utility/src/settings.ts +3 -2
  124. package/packages/utility/src/skill-discovery.ts +2 -2
  125. package/packages/watchdog/index.ts +4 -4
  126. package/packages/watchdog/package.json +3 -3
  127. package/packages/watchdog/src/config.ts +3 -2
  128. package/packages/web-api/package.json +2 -2
  129. package/packages/workflow/package.json +2 -2
  130. package/packages/workflow/src/permission/decide.ts +1 -2
  131. package/packages/workflow/src/permission/index.ts +12 -4
  132. package/packages/workflow/src/permission/settings.ts +39 -4
  133. package/packages/background-tasks/extensions/delegate-child.ts +0 -1
  134. package/packages/background-tasks/src/context-parent-snapshot.ts +0 -142
  135. package/packages/background-tasks/src/context-token-budget.ts +0 -903
  136. package/packages/background-tasks/src/context-visible-conversation-v2.ts +0 -551
  137. package/packages/background-tasks/src/delegate/artifacts.ts +0 -487
  138. package/packages/background-tasks/src/delegate/budget.ts +0 -415
  139. package/packages/background-tasks/src/delegate/hook-contract-evidence.json +0 -18
  140. package/packages/background-tasks/src/delegate/hook-contract.ts +0 -154
  141. package/packages/background-tasks/src/delegate/launch.ts +0 -484
  142. package/packages/background-tasks/src/delegate/result-package.ts +0 -459
  143. package/packages/background-tasks/src/delegate/runner.ts +0 -430
  144. package/packages/background-tasks/src/delegate/seed.ts +0 -423
  145. package/packages/background-tasks/src/delegate/types.ts +0 -323
  146. package/packages/background-tasks/src/delegate-child-extension.ts +0 -978
  147. package/packages/background-tasks/src/delegate-extension.ts +0 -654
  148. package/packages/background-tasks/src/fixtures/delegate-context-incident.json +0 -17
  149. package/packages/compactor/skills/compactor-detail/SKILL.md +0 -116
  150. package/packages/compactor/skills/compactor-doctor/SKILL.md +0 -71
  151. package/packages/compactor/skills/compactor-stats/SKILL.md +0 -51
  152. package/packages/compactor/src/compaction/build-sections.ts +0 -76
  153. package/packages/compactor/src/compaction/extract/goals.ts +0 -36
  154. package/packages/compactor/src/compaction/extract/preferences.ts +0 -40
  155. package/packages/compactor/src/compaction/format.ts +0 -53
  156. package/packages/compactor/src/compaction/merge.ts +0 -143
  157. package/packages/compactor/src/config/presets.ts +0 -160
  158. package/packages/compactor/src/executor/executor.ts +0 -233
  159. package/packages/compactor/src/executor/runtime.ts +0 -115
  160. package/packages/compactor/src/security/evaluator.ts +0 -89
  161. package/packages/compactor/src/security/policy.ts +0 -96
  162. package/packages/compactor/src/security/scanner.ts +0 -65
  163. package/packages/compactor/src/session/auto-inject.ts +0 -60
  164. package/packages/compactor/src/session/db.ts +0 -325
  165. package/packages/compactor/src/session/extract.ts +0 -144
  166. package/packages/compactor/src/session/resume-inject.ts +0 -64
  167. package/packages/compactor/src/session/snapshot.ts +0 -327
  168. package/packages/compactor/src/tools/ctx-batch-execute.ts +0 -41
  169. package/packages/compactor/src/tools/ctx-execute-file.ts +0 -23
  170. package/packages/compactor/src/tools/ctx-execute.ts +0 -23
  171. package/packages/compactor/src/tools/ctx-stats.ts +0 -96
  172. package/packages/subagents/agents/delegate.md +0 -14
  173. package/packages/subagents/agents/oracle.md +0 -78
  174. package/packages/subagents/agents/researcher.md +0 -52
  175. package/packages/subagents/agents/reviewer.md +0 -80
  176. package/packages/subagents/agents/scout.md +0 -50
  177. package/packages/subagents/agents/worker.md +0 -59
  178. package/packages/subagents/prompts/council.md +0 -48
  179. package/packages/subagents/prompts/gather-context-and-clarify.md +0 -13
  180. package/packages/subagents/prompts/parallel-cleanup.md +0 -59
  181. package/packages/subagents/prompts/parallel-research.md +0 -50
  182. package/packages/subagents/prompts/parallel-review.md +0 -54
  183. package/packages/subagents/prompts/review-loop.md +0 -43
  184. package/packages/subagents/skills/council-mode/SKILL.md +0 -230
  185. package/packages/subagents/skills/subagents/references/constraints-and-recipes.md +0 -259
  186. package/packages/subagents/skills/subagents/references/execution-controls.md +0 -454
  187. package/packages/subagents/skills/subagents/references/management-authoring-rpc.md +0 -161
  188. package/packages/subagents/skills/subagents/references/multi-lane-orchestration.md +0 -39
  189. package/packages/subagents/skills/subagents/references/prompting-and-roles.md +0 -267
  190. package/packages/subagents/src/acceptance.ts +0 -331
  191. package/packages/subagents/src/agent-manager.ts +0 -405
  192. package/packages/subagents/src/agent-memory.ts +0 -300
  193. package/packages/subagents/src/agent-overrides.ts +0 -183
  194. package/packages/subagents/src/agent-runner.ts +0 -271
  195. package/packages/subagents/src/async-runner.ts +0 -422
  196. package/packages/subagents/src/authority-policy.ts +0 -47
  197. package/packages/subagents/src/budgets.ts +0 -285
  198. package/packages/subagents/src/child-safety.ts +0 -140
  199. package/packages/subagents/src/config.ts +0 -249
  200. package/packages/subagents/src/conversation-viewer.ts +0 -281
  201. package/packages/subagents/src/core-compat.ts +0 -94
  202. package/packages/subagents/src/custom-agents.ts +0 -343
  203. package/packages/subagents/src/file-system-retry.ts +0 -50
  204. package/packages/subagents/src/fleet-data.ts +0 -105
  205. package/packages/subagents/src/fleet-view.ts +0 -322
  206. package/packages/subagents/src/foreground-detach.ts +0 -59
  207. package/packages/subagents/src/fork-context.ts +0 -285
  208. package/packages/subagents/src/global.d.ts +0 -7
  209. package/packages/subagents/src/guide.ts +0 -129
  210. package/packages/subagents/src/mission-state.ts +0 -133
  211. package/packages/subagents/src/mission-store.ts +0 -436
  212. package/packages/subagents/src/output-limits.ts +0 -142
  213. package/packages/subagents/src/parity-types.ts +0 -315
  214. package/packages/subagents/src/pi-args.ts +0 -167
  215. package/packages/subagents/src/result-files.ts +0 -232
  216. package/packages/subagents/src/result-watcher.ts +0 -221
  217. package/packages/subagents/src/retained-children.ts +0 -176
  218. package/packages/subagents/src/run-fanout-budget.ts +0 -356
  219. package/packages/subagents/src/scheduled-runs.ts +0 -349
  220. package/packages/subagents/src/schemas.ts +0 -263
  221. package/packages/subagents/src/slash-commands.ts +0 -80
  222. package/packages/subagents/src/supervisor-channel.ts +0 -249
  223. package/packages/subagents/src/tool-handler.ts +0 -1144
  224. package/packages/subagents/src/types.ts +0 -238
  225. package/packages/subagents/src/widget.ts +0 -457
  226. package/packages/subagents/src/workflow-script.ts +0 -737
  227. package/packages/subagents/src/workflow-worker.ts +0 -384
  228. package/packages/subagents/src/worktree.ts +0 -614
  229. /package/packages/{subagents/src → core/src/child-agent}/pi-spawn.ts +0 -0
package/CHANGELOG.md CHANGED
@@ -6,6 +6,69 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [3.0.0-alpha.4] — 2026-09-28
10
+
11
+ ### Breaking Changes
12
+
13
+ - **BREAKING: compactor reworked.** Session continuity (the SQLite event log and the snapshot restored after compaction) is removed: it logged every session under one shared ID, so restored snapshots mixed projects and reached ~60k tokens. Also removed: the sandbox tools (`sandbox`, `sandbox_file`, `sandbox_batch`), the `compact` tool (it never compacted), the `compactor_stats`/`compactor_doctor` tools, presets, and the strategy modes that had no effect. **Migration path:** `/unipi:compact` and `/unipi:lossless-compact` still work but are deprecated. Use `/unipi:compact-vcc`, `/unipi:compact-jev` or `/unipi:compact-by-llm`. Old configs are translated: `overrideDefaultCompaction: false` becomes Method = model summary, and `autoCompaction.enabled` becomes When = at a percentage. `~/.unipi/db/compactor` is no longer used and can be deleted.
14
+
15
+ ### Added
16
+
17
+ - `compactor`: the lossless summary is rebuilt from the full session history on every compaction, so it can no longer grow from one compaction to the next (a real session went 15k → 236k → 248k characters). It puts the current state first: Active Work, Your Requests, Latest State, Decisions & Constraints, Files, Commits, Open Errors, Recent Transcript. Each section has a hard budget.
18
+ - Text that extensions inject with the user role (loop prompts, nudges, notifications) is recognised and left out of Your Requests; extension-sent messages are also marked when they are sent.
19
+ - `ask_user` answers are kept as "question → answer" decisions.
20
+ - Typed credentials are redacted.
21
+ - `compactor`: **lossless + jev** method (`/unipi:compact-jev`). jev, the Decision model, drops items that are no longer in force, such as finished one-off requests, reversed decisions and fixed errors, at per-kind confidence thresholds. If jev is unavailable, the plain lossless summary is used.
22
+ - `compactor`: the settings screen shows 5 main settings (Method, Pi's /compact, When, Percentage, Notifications); everything else is under **Advanced compaction**.
23
+ - `core`: `registerCompactionContext()`. long-horizon (goal, ralph) and kanboard register their live state, and every compaction summary leads with it.
24
+ - `scripts/compactor-eval.mts` replays the compactor at real compaction points of recorded sessions and shows what happened next, for review. `scripts/compactor-continue.mts` writes resumable A/B session files (old vs new compaction) for a blind "continue from here" test with `pi --fork … -nt -p`.
25
+ - **Decision Model settings** (`/unipi:settings → Decision Model`): the jev provider, model, base URL, key and timeout now live in one shared `decision-model` namespace instead of long-horizon's judge. Every module that uses it (long-horizon routing, permission auto mode, skill exposure, watchdog, kanboard strategy, compactor pruning) has a **Decision model** block that inherits the shared model by default or switches to a custom one; empty custom fields fall back to the shared value. Existing `long-horizon.judge.*` transport settings are migrated once.
26
+ - `compactor`: user corrections ("restore the background… I did not request this change") are kept as decisions.
27
+ - `compactor`: **Lessons** section: lessons the agent wrote down itself (memory notes, `# Confirmed: …` comments in its commands, diagnosis sentences), kept verbatim. **Project Knowledge** section: notes it wrote or read, repeated build/test/deploy commands, hosts. Decisions keep early standing rules ("always…", "never…") instead of only the most recent ones.
28
+ - `compactor`: jev asks short, local questions it can answer precisely: "durable lesson or one-off note?" and "does this later item replace that earlier one?" on items about the same subject. A reversal in the recent messages removes the stale lesson it replaces.
29
+ - `compactor`: **compaction card** in the transcript under Pi's `[compaction]` block: one line (`Compacted 7.9k → 2.2k tokens · lossless + jev · 1 stale dropped · at 3%`), ctrl+o for method, trigger, kept tail, sections and jev drops. Never sent to the model; replaces the compaction toasts.
30
+ - `footer`: the stats strip under the input shows `5 compactions · 47k→15k · just now` once the session has compacted. The five compactor segments are now one icon-free `compactions` segment.
31
+ - `compactor`: the info-screen Compactor tab shows the method and trigger settings, compactions by method, tokens before → after, and the last compaction.
32
+
33
+ ### Fixed
34
+
35
+ - `compactor`: the percentage trigger compacts at the `turn_end` boundary instead of calling `ctx.compact()`, which aborted the run and left goal, ralph and kanboard loops waiting. The "auto-continue" message is removed; Pi 0.87 continues after automatic compaction on its own, so it only added empty extra turns.
36
+ - `compactor`: stats come from the session's own compaction entries instead of a fixed "12% kept" guess (also in the footer segments).
37
+ - `compactor`: the kept tail is sized to the model's context window (recut above 40%, `keep:N` included) and the summary is capped at 8% of it, so compaction can no longer overflow small-context models.
38
+ - `compactor`: secrets are redacted before summary items are clipped (a clipped quote could leak a password).
39
+ - `compactor`: `/unipi:compact-doctor` no longer calls the jev method "model summary"; `/unipi:compact-stats` counts jev separately; a manual compaction with nothing to compact no longer repeats Pi's error.
40
+ - `kanboard` tests wrote a fake judge key (`"k"`) into the real `~/.unipi/config/long-horizon/config.json`, which silently disabled the jev judge. They now use project scope.
41
+
42
+ ## [3.0.0-alpha.3] — 2026-09-27
43
+
44
+ ### Breaking Changes
45
+
46
+ - **BREAKING: `subagents` rebuilt on Devin's model.** `spawn_helper`/`get_helper_result` and `bg_delegate`/`bg_result` are gone, along with workflow scripts, missions, schedules, budgets, acceptance gates, agent memory, worktrees, prompt templates and the bundled agents. **Migration path:** use `run_subagent` (foreground / background / resume) with `subagent_explore` or `subagent_general`, or a custom markdown agent in `~/.unipi/config/agents` / `<project>/.unipi/config/agents` (`/unipi:agents` creates them). `read_subagent` replaces the old result tools. Saved `backgroundTasks.delegate.*` settings are ignored, not deleted.
47
+ - **BREAKING: `btw` is an inline panel.** `/unipi:btw-new`, `-tangent`, `-clear`, `-inject`, `-summarize` and `--save` are removed; each `/unipi:btw` question runs in a fresh read-only session seeded from the main branch. Old btw notes still render.
48
+ - **BREAKING: `/unipi:model` saves the default with Alt+Enter**, not Ctrl+S (which clashed with terminals, VS Code, Zellij and XOFF). The startup model and thinking level are also in `/unipi:settings → Fusion → Startup`.
49
+ - `long-horizon`: default mode is now `none` (the judge still routes); set `longHorizon.defaultMode` to keep the old behaviour.
50
+ - `workflow`: the all-projects permission mode moved to its own `permission.defaultMode` key (migrated once from a legacy global `mode`).
51
+
52
+ ### Added
53
+
54
+ - **subagents: Devin-parity screens.** Live foreground card, `N subagents (k running) · ↓ select` strip, ↓ opens a dock (view transcript, `f` foreground, `x` cancel), Ctrl+B backgrounds and Esc cancels a foreground run, state survives resume. Settings hub: default model, thinking, max running, "Manage agents…".
55
+ - **fusion: Devin-parity sidekick.** Steps stream into the chat, blocking handoffs forward approvals to you, background handoffs deny them; the sidekick runs the lead's extensions. Fusion's lead policy and long-horizon's mode block are named system-prompt sections (long-horizon used to drop the lead policy).
56
+ - **kanboard:** task strategies (none/goal/ralph/swarm/graph) and plan-first labels, board default strategy `auto` (jev picks), blocking policy `avoid` (agents note assumptions instead of blocking), grouped board settings dialog written through to the extension settings, Review lane "Done all".
57
+ - **TUI:** one visual language from a shared kit in `@pi-unipi/core` — crafted spinner, badges, rails, progress bars. Subagent cards settle to ✓/✗ in place; background notices, `read_subagent` and the dock are badges; memory cards are rails.
58
+ - **Progress bars** for ralph (checklist), kanboard (board) and goal (a user-only side estimate + summary per loop and on `/unipi:goal status`, configurable in Long-Horizon → Progress).
59
+ - **input-shortcuts:** Ctrl+C keeps the cleared input struck through in the transcript (never sent to the model); ↑ restores it.
60
+ - `core`: every unipi command echoes `❭ /cmd args` in the transcript; the settings engine has an optional `onSet` hook.
61
+ - `npm run tui:gallery` — standalone preview of UniPi's TUI designs, spinners and terminal capabilities.
62
+
63
+ ### Fixed
64
+
65
+ - **long-horizon: goal and ralph loops no longer stop after the first turn.** The next-turn message was sent while pi still counted the turn as running and was rejected (`Agent is already processing`); it is now queued as a follow-up.
66
+ - **long-horizon: batched goals no longer stall.** A turn that changed files and then claimed completion counted as no progress when the verifier said not met, so goals that claim after every batch got a generic nudge instead of the verifier's feedback and paused after eight claims.
67
+ - **fusion:** the Fusion row can always be applied — the model cache refreshes on a miss (bridge-registered models were "not available"), stale saved lead/sidekick keys are dropped, and Enter/Tab opens the dropdown for a missing half. Sidekick tools only appear while Fusion is active; the picker is wide again.
68
+ - **settings:** the permission project and default rows no longer open two pickers at once.
69
+ - **kanboard:** the binary lookup prefers a source checkout's dev build over a stale platform package.
70
+ - **memory:** at most one queued save reminder.
71
+
9
72
  ## [3.0.0-alpha.2] — 2026-09-26
10
73
 
11
74
  ### Fixed
package/README.md CHANGED
@@ -21,7 +21,7 @@ pi install npm:@pi-unipi/unipi
21
21
 
22
22
  **[Memory](./packages/memory/README.md)** — Markdown files + [MemPalace](https://github.com/mempalace/mempalace) semantic search share a memory palace across pi, Devin, and zcode. Facts, preferences, and decisions persist across sessions; v2 data converts via `/unipi:memory migrate`.
23
23
 
24
- **[Compactor](./packages/compactor/README.md)** — Zero-LLM context engine. 6-stage pipeline hits 95%+ token reduction at zero API cost. Session continuity, percentage auto-compaction, session recall, and sandbox execution.
24
+ **[Compactor](./packages/compactor/README.md)** — Compaction that keeps work going. Lossless zero-LLM summaries (or Pi's model summary), rebuilt from the full session history, led by the live goal/ralph/kanboard state; the full history stays searchable with session recall.
25
25
 
26
26
  **[Prefix-cache architecture](./docs/prefix-cache-architecture.md)** — Append-only request discipline, explicit cache epochs, deterministic tools, privacy-safe diagnostics, provider limitations, and bounded cold-epoch output.
27
27
 
@@ -41,7 +41,7 @@ pi install npm:@pi-unipi/unipi
41
41
 
42
42
  **[Footer](./packages/footer/README.md)** — Persistent status bar showing live stats from every package. Now with the Glance footer: a framed input box with an animated rainbow brand, git branch title, and a live session strip (turns, wall/tool time, TTFT, tok/s, cache hit). Responsive layout, presets, per-segment toggling.
43
43
 
44
- **[BTW](./packages/btw/README.md)** — Side conversations that run in parallel. Ask questions without interrupting the main agent.
44
+ **[BTW](./packages/btw/README.md)** — Inline side questions (`/unipi:btw`) answered by a fresh read-only session seeded from the current context — the main agent never sees them.
45
45
 
46
46
  **[Ask User](./packages/ask-user/README.md)** — Structured input for decision gates. Single-select, multi-select, freeform. The agent asks instead of guessing.
47
47
 
@@ -92,11 +92,11 @@ Coexists triggers enhance behavior when packages are installed together. Workflo
92
92
  | Kanboard | `/unipi:` | kanboard (board: capture, work runner, web UI) |
93
93
  | Long-Horizon | `/unipi:goal`, `/unipi:ralph`, `/unipi:swarm`, `/unipi:graph` | <prompt>, start, stop, status, resume, clear |
94
94
  | Memory | `/unipi:memory-` | process, search, consolidate, forget |
95
- | Compactor | `/unipi:` | lossless-compact, session-recall, compact-stats, compact-preset, compact-help |
95
+ | Compactor | `/unipi:` | compact-vcc, compact-by-llm, session-recall, compact-stats, compact-doctor, compact-help |
96
96
  | Notify | `/unipi:notify-` | settings, test, set-tg, set-ntfy |
97
97
  | MCP | `/unipi:mcp-` | add, settings, sync, status |
98
98
  | Web | `/unipi:web-` | settings, cache-clear |
99
- | BTW | `/unipi:btw` | question, btw-new, btw-tangent, btw-inject, btw-summarize |
99
+ | BTW | `/unipi:btw` | question |
100
100
  | Utility | `/unipi:` | env, doctor, status, cleanup, badge-name |
101
101
  | Kanboard | `/unipi:kanboard` | toggle, doctor |
102
102
  | Footer | `/unipi:footer` | toggle, settings |
@@ -121,7 +121,7 @@ Coexists triggers enhance behavior when packages are installed together. Workflo
121
121
  | `sidekick` / `read_subagent` | fusion | Delegate to the persistent sidekick and collect its report |
122
122
  | `bg_run` / `bg_status` / `bg_logs` / `bg_kill` / `bg_delegate` / `bg_result` | background-tasks | Long-running commands and background delegate agents |
123
123
  | `ask_user` | ask-user | User input |
124
- | `compact` / `session_recall` / `sandbox` | compactor | Context management |
124
+ | `session_recall` / `context_budget` | compactor | Context management |
125
125
  | `ctx_env` | utility | Environment info |
126
126
  | `set_session_name` | utility | Session name for badge |
127
127
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/unipi",
3
- "version": "3.0.0-alpha.2",
3
+ "version": "3.0.0-alpha.4",
4
4
  "description": "All-in-one extension suite for Pi coding agent",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -29,6 +29,7 @@
29
29
  "publish:all": "npm publish --workspaces --access public",
30
30
  "test": "npx tsx --test tests/*.test.js packages/memory/tests/*.test.ts && npm test --workspaces --if-present",
31
31
  "typecheck": "npx tsc --noEmit --skipLibCheck",
32
+ "tui:gallery": "npx tsx scripts/tui-gallery/index.ts",
32
33
  "publish:kanboard": "node scripts/publish-kanboard-platforms.mjs"
33
34
  },
34
35
  "files": [
@@ -83,27 +84,27 @@
83
84
  "typebox": "^1.1.38"
84
85
  },
85
86
  "dependencies": {
86
- "@pi-unipi/ask-user": "3.0.0-alpha.2",
87
- "@pi-unipi/background-tasks": "3.0.0-alpha.2",
88
- "@pi-unipi/btw": "3.0.0-alpha.2",
89
- "@pi-unipi/command-enchantment": "3.0.0-alpha.2",
90
- "@pi-unipi/compactor": "3.0.0-alpha.2",
91
- "@pi-unipi/core": "3.0.0-alpha.2",
92
- "@pi-unipi/footer": "3.0.0-alpha.2",
93
- "@pi-unipi/image": "3.0.0-alpha.2",
94
- "@pi-unipi/fusion": "3.0.0-alpha.2",
95
- "@pi-unipi/info-screen": "3.0.0-alpha.2",
96
- "@pi-unipi/input-shortcuts": "3.0.0-alpha.2",
97
- "@pi-unipi/kanboard": "3.0.0-alpha.2",
98
- "@pi-unipi/mcp": "3.0.0-alpha.2",
99
- "@pi-unipi/memory": "3.0.0-alpha.2",
100
- "@pi-unipi/notify": "3.0.0-alpha.2",
101
- "@pi-unipi/skill-registry": "3.0.0-alpha.2",
102
- "@pi-unipi/subagents": "3.0.0-alpha.2",
103
- "@pi-unipi/updater": "3.0.0-alpha.2",
104
- "@pi-unipi/utility": "3.0.0-alpha.2",
105
- "@pi-unipi/web-api": "3.0.0-alpha.2",
106
- "@pi-unipi/workflow": "3.0.0-alpha.2"
87
+ "@pi-unipi/ask-user": "3.0.0-alpha.4",
88
+ "@pi-unipi/background-tasks": "3.0.0-alpha.4",
89
+ "@pi-unipi/btw": "3.0.0-alpha.4",
90
+ "@pi-unipi/command-enchantment": "3.0.0-alpha.4",
91
+ "@pi-unipi/compactor": "3.0.0-alpha.4",
92
+ "@pi-unipi/core": "3.0.0-alpha.4",
93
+ "@pi-unipi/footer": "3.0.0-alpha.4",
94
+ "@pi-unipi/image": "3.0.0-alpha.4",
95
+ "@pi-unipi/fusion": "3.0.0-alpha.4",
96
+ "@pi-unipi/info-screen": "3.0.0-alpha.4",
97
+ "@pi-unipi/input-shortcuts": "3.0.0-alpha.4",
98
+ "@pi-unipi/kanboard": "3.0.0-alpha.4",
99
+ "@pi-unipi/mcp": "3.0.0-alpha.4",
100
+ "@pi-unipi/memory": "3.0.0-alpha.4",
101
+ "@pi-unipi/notify": "3.0.0-alpha.4",
102
+ "@pi-unipi/skill-registry": "3.0.0-alpha.4",
103
+ "@pi-unipi/subagents": "3.0.0-alpha.4",
104
+ "@pi-unipi/updater": "3.0.0-alpha.4",
105
+ "@pi-unipi/utility": "3.0.0-alpha.4",
106
+ "@pi-unipi/web-api": "3.0.0-alpha.4",
107
+ "@pi-unipi/workflow": "3.0.0-alpha.4"
107
108
  },
108
109
  "devDependencies": {
109
110
  "@earendil-works/pi-agent-core": "^0.87.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/ask-user",
3
- "version": "3.0.0-alpha.2",
3
+ "version": "3.0.0-alpha.4",
4
4
  "description": "Structured user input tool for Pi coding agent — single-select, multi-select, freeform",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -40,7 +40,7 @@
40
40
  "access": "public"
41
41
  },
42
42
  "dependencies": {
43
- "@pi-unipi/core": "3.0.0-alpha.2"
43
+ "@pi-unipi/core": "3.0.0-alpha.4"
44
44
  },
45
45
  "peerDependencies": {
46
46
  "@earendil-works/pi-coding-agent": "^0.87.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/command-enchantment",
3
- "version": "3.0.0-alpha.2",
3
+ "version": "3.0.0-alpha.4",
4
4
  "description": "Enhanced TUI autocomplete for /unipi:* commands — colored, sorted, and grouped by package",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -58,13 +58,12 @@ export const COMMAND_REGISTRY: Record<string, string> = {
58
58
  "unipi:memory-forget": "memory",
59
59
  "unipi:global-memory-list": "memory",
60
60
 
61
- // btw (6 commands)
61
+ // btw
62
62
  "unipi:btw": "btw",
63
- "unipi:btw-tangent": "btw",
64
- "unipi:btw-new": "btw",
65
- "unipi:btw-clear": "btw",
66
- "unipi:btw-inject": "btw",
67
- "unipi:btw-summarize": "btw",
63
+
64
+ // subagents
65
+ "unipi:subagents": "subagents",
66
+ "unipi:agents": "subagents",
68
67
 
69
68
  // mcp (5 commands)
70
69
  "unipi:mcp-status": "mcp",
@@ -82,10 +81,7 @@ export const COMMAND_REGISTRY: Record<string, string> = {
82
81
  // utility (settings hub)
83
82
  "unipi:settings": "utility",
84
83
 
85
- // subagents (3 commands)
86
- "unipi:subagents-fleet": "subagents",
87
- "unipi:subagents-doctor": "subagents",
88
- "unipi:subagents-guide": "subagents",
84
+ // subagents (no user commands — Devin model)
89
85
 
90
86
  // background-tasks (8 commands)
91
87
  "unipi:bg": "background-tasks",
@@ -101,6 +97,9 @@ export const COMMAND_REGISTRY: Record<string, string> = {
101
97
  // web-api (2 commands)
102
98
 
103
99
  // compact (9 commands)
100
+ "unipi:compact-vcc": "compact",
101
+ "unipi:compact-jev": "compact",
102
+ "unipi:compact-by-llm": "compact",
104
103
  "unipi:lossless-compact": "compact",
105
104
  "unipi:compact": "compact",
106
105
  "unipi:session-recall": "compact",
@@ -150,12 +149,10 @@ export const COMMAND_DESCRIPTIONS: Record<string, string> = {
150
149
  "unipi:memory-forget": "Delete a memory by title",
151
150
  "unipi:global-memory-list": "List all memories across all projects",
152
151
 
153
- "unipi:btw": "Run a parallel side conversation",
154
- "unipi:btw-tangent": "Start a contextless BTW tangent thread",
155
- "unipi:btw-new": "Start a fresh BTW thread with session context",
156
- "unipi:btw-clear": "Dismiss and clear the BTW thread",
157
- "unipi:btw-inject": "Inject the BTW thread into the main agent",
158
- "unipi:btw-summarize": "Summarize and inject the BTW thread",
152
+ "unipi:btw": "Ask a side question in an inline panel (read-only)",
153
+
154
+ "unipi:subagents": "Open the subagent panel (also ↓ from an empty input)",
155
+ "unipi:agents": "Manage subagent profiles — create, edit, copy, delete custom agents",
159
156
 
160
157
  "unipi:mcp-status": "Show MCP server status",
161
158
 
@@ -175,12 +172,15 @@ export const COMMAND_DESCRIPTIONS: Record<string, string> = {
175
172
  "unipi:info": "Show system information",
176
173
 
177
174
 
178
- "unipi:lossless-compact": "Immediate zero-LLM compaction",
179
- "unipi:compact": "(DEPRECATED) Use /unipi:lossless-compact instead",
175
+ "unipi:compact-vcc": "Lossless compaction now — no model call (keep:N)",
176
+ "unipi:compact-jev": "Lossless compaction, pruned by jev of what is no longer in force",
177
+ "unipi:compact-by-llm": "Compact now with a model-written summary",
178
+ "unipi:lossless-compact": "(DEPRECATED) Use /unipi:compact-vcc instead",
179
+ "unipi:compact": "(DEPRECATED) Use /unipi:compact-vcc instead",
180
180
  "unipi:session-recall": "Search session history, including compacted-away messages",
181
181
  "unipi:compact-recall": "(DEPRECATED) Use /unipi:session-recall instead",
182
- "unipi:compact-stats": "Show compaction statistics",
183
- "unipi:compact-doctor": "Diagnose compaction issues",
182
+ "unipi:compact-stats": "Show this session's compaction savings",
183
+ "unipi:compact-doctor": "Check compaction settings",
184
184
  "unipi:compact-help": "Show compactor command help",
185
185
  "unipi:notify-event": "Toggle a notify event without the TUI: <event> <on|off>",
186
186
 
@@ -195,9 +195,6 @@ export const COMMAND_DESCRIPTIONS: Record<string, string> = {
195
195
  "unipi:bg-tasks": "Open the background task manager UI",
196
196
  "unipi:model": "Pick a model or Fusion lead+sidekick pair (Devin-style picker)",
197
197
  "unipi:fusion-stats": "Estimated Fusion savings (sidekick tokens priced at lead rates)",
198
- "unipi:subagents-fleet": "Open the subagents fleet view",
199
- "unipi:subagents-doctor": "Diagnose subagents configuration",
200
- "unipi:subagents-guide": "Show the subagents usage guide",
201
198
  };
202
199
 
203
200
  // ─── Package Display Names ───────────────────────────────────────────
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/background-tasks",
3
- "version": "3.0.0-alpha.2",
3
+ "version": "3.0.0-alpha.4",
4
4
  "description": "Background tasks for UniPi — durable shell jobs and delegated background agents with a footer dock",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -10,7 +10,7 @@
10
10
  },
11
11
  "dependencies": {
12
12
  "@earendil-works/pi-ai": "^0.87.1",
13
- "@pi-unipi/core": "3.0.0-alpha.2",
13
+ "@pi-unipi/core": "3.0.0-alpha.4",
14
14
  "turndown": "^7.2.4"
15
15
  },
16
16
  "devDependencies": {
@@ -27,14 +27,6 @@ export interface BackgroundTasksConfig {
27
27
  maxFinishedTasks: number;
28
28
  /** Output cap in bytes before a task is killed+failed (default 20 MiB). */
29
29
  maxOutputBytes: number;
30
- /** Delegate defaults. */
31
- delegate: {
32
- extensionMode: "isolated" | "ambient";
33
- autoDeliver: "never" | "when_small" | "always";
34
- maxTurns: number;
35
- maxToolCalls: number;
36
- timeoutSeconds: number;
37
- };
38
30
  }
39
31
 
40
32
  export const DEFAULT_CONFIG: BackgroundTasksConfig = {
@@ -44,13 +36,6 @@ export const DEFAULT_CONFIG: BackgroundTasksConfig = {
44
36
  defaultTimeoutSeconds: 0,
45
37
  maxFinishedTasks: 30,
46
38
  maxOutputBytes: 20 * 1024 * 1024,
47
- delegate: {
48
- extensionMode: "isolated",
49
- autoDeliver: "when_small",
50
- maxTurns: 40,
51
- maxToolCalls: 120,
52
- timeoutSeconds: 900,
53
- },
54
39
  };
55
40
 
56
41
  function getGlobalConfigPath(): string {
@@ -144,32 +129,6 @@ export function validateBackgroundTasksConfig(config: unknown): string[] {
144
129
  problems.push("maxOutputBytes must be an integer >= 1024");
145
130
  }
146
131
  }
147
- if (c.delegate !== undefined) {
148
- if (typeof c.delegate !== "object" || c.delegate === null) {
149
- problems.push("delegate must be an object");
150
- } else {
151
- const d = c.delegate as Record<string, unknown>;
152
- if (d.extensionMode !== undefined && d.extensionMode !== "isolated" && d.extensionMode !== "ambient") {
153
- problems.push('delegate.extensionMode must be "isolated" or "ambient"');
154
- }
155
- if (
156
- d.autoDeliver !== undefined &&
157
- d.autoDeliver !== "never" &&
158
- d.autoDeliver !== "when_small" &&
159
- d.autoDeliver !== "always"
160
- ) {
161
- problems.push('delegate.autoDeliver must be "never", "when_small", or "always"');
162
- }
163
- for (const key of ["maxTurns", "maxToolCalls"] as const) {
164
- if (d[key] !== undefined && (typeof d[key] !== "number" || !Number.isInteger(d[key]) || (d[key] as number) < 1)) {
165
- problems.push(`delegate.${key} must be a positive integer`);
166
- }
167
- }
168
- if (d.timeoutSeconds !== undefined && (typeof d.timeoutSeconds !== "number" || !Number.isFinite(d.timeoutSeconds) || (d.timeoutSeconds as number) <= 0)) {
169
- problems.push("delegate.timeoutSeconds must be a positive number");
170
- }
171
- }
172
- }
173
132
  return problems;
174
133
  }
175
134
 
@@ -203,29 +162,6 @@ registerSettings({
203
162
  { key: "maxOutputBytes", type: "number", label: "Output cap bytes", min: 1024, description: "Kill+fail a task past this output size" },
204
163
  ],
205
164
  },
206
- {
207
- title: "Delegate",
208
- fields: [
209
- {
210
- key: "delegate.extensionMode",
211
- type: "enum",
212
- label: "Extension mode",
213
- options: [
214
- { value: "isolated", label: "isolated" },
215
- { value: "ambient", label: "ambient (weakens isolation)" },
216
- ],
217
- },
218
- {
219
- key: "delegate.autoDeliver",
220
- type: "enum",
221
- label: "Auto deliver",
222
- options: ["when_small", "always", "never"],
223
- },
224
- { key: "delegate.maxTurns", type: "number", label: "Max turns", min: 1 },
225
- { key: "delegate.maxToolCalls", type: "number", label: "Max tool calls", min: 1 },
226
- { key: "delegate.timeoutSeconds", type: "number", label: "Timeout s", min: 1 },
227
- ],
228
- },
229
165
  ],
230
166
  });
231
167
 
@@ -278,15 +214,6 @@ export function loadBackgroundTasksConfig(cwd: string): LoadedBackgroundTasksCon
278
214
  typeof merged.maxOutputBytes === "number" && Number.isInteger(merged.maxOutputBytes) && merged.maxOutputBytes >= 1024
279
215
  ? merged.maxOutputBytes
280
216
  : DEFAULT_CONFIG.maxOutputBytes,
281
- delegate: {
282
- ...DEFAULT_CONFIG.delegate,
283
- ...merged.delegate,
284
- extensionMode: merged.delegate?.extensionMode === "ambient" ? "ambient" : "isolated",
285
- autoDeliver:
286
- merged.delegate?.autoDeliver === "never" || merged.delegate?.autoDeliver === "always"
287
- ? merged.delegate.autoDeliver
288
- : "when_small",
289
- },
290
217
  };
291
218
  return { config, warnings };
292
219
  }
@@ -18,7 +18,6 @@ import {
18
18
  type BackgroundTaskExtensionService,
19
19
  } from "./extension-api.js";
20
20
  import { registerToolsAndCommands } from "./tools.js";
21
- import { registerDelegateExtension } from "./delegate-extension.js";
22
21
  import { setSharedTaskRegistry, clearSharedTaskRegistry } from "./registry-shared.js";
23
22
  import { formatDuration, taskDisplayName, type BgTask, type StartTaskOptions } from "./types.js";
24
23
 
@@ -205,11 +204,6 @@ export default function backgroundTasksExtension(pi: ExtensionAPI): void {
205
204
  return result;
206
205
  },
207
206
  rerunTask: async (task) => {
208
- if (task.delegate !== undefined) {
209
- throw new Error(
210
- "Only shell-command tasks can be rerun from the dock; relaunch this typed workflow through its owning tool.",
211
- );
212
- }
213
207
  const rerunOptions: StartTaskOptions = {
214
208
  name: taskDisplayName(task),
215
209
  isAgent: task.isAgent,
@@ -261,15 +255,6 @@ export default function backgroundTasksExtension(pi: ExtensionAPI): void {
261
255
  clearFinishedNotices,
262
256
  });
263
257
 
264
- registerDelegateExtension(pi, {
265
- startDelegateTask: async (ctx, options) => {
266
- currentCtx = ctx;
267
- return registry.startDelegateTask(ctx, options);
268
- },
269
- snapshot: (task) => registry.snapshot(task),
270
- resolveTask: (idOrPrefix) => registry.resolveTask(idOrPrefix),
271
- });
272
-
273
258
  pi.on("session_start", async (_event, ctx) => {
274
259
  registry.setShuttingDown(false);
275
260
  wakeLineInstalled = false; // pi clears extension widgets on reload/new session