@pi-unipi/unipi 3.0.0-alpha.0 → 3.0.0-alpha.10
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 +163 -0
- package/README.md +8 -11
- package/package.json +29 -30
- package/packages/ask-user/README.md +55 -107
- package/packages/ask-user/ask-ui.ts +306 -732
- package/packages/ask-user/clipboard.ts +50 -0
- package/packages/ask-user/config.ts +74 -78
- package/packages/ask-user/package.json +5 -5
- package/packages/ask-user/questions.ts +151 -0
- package/packages/ask-user/skills/ask-user/SKILL.md +59 -133
- package/packages/ask-user/tools.ts +179 -432
- package/packages/autocomplete/package.json +4 -4
- package/packages/autocomplete/src/constants.ts +51 -48
- package/packages/autocomplete/src/sorting.ts +8 -0
- package/packages/background-tasks/package.json +6 -6
- package/packages/background-tasks/src/config.ts +0 -73
- package/packages/background-tasks/src/index.ts +0 -15
- package/packages/background-tasks/src/registry.ts +1 -171
- package/packages/background-tasks/src/types.ts +0 -32
- package/packages/btw/README.md +13 -56
- package/packages/btw/extensions/btw.ts +403 -1796
- package/packages/btw/package.json +9 -6
- package/packages/btw/skills/btw/SKILL.md +7 -143
- package/packages/compactor/README.md +59 -286
- package/packages/compactor/package.json +8 -12
- package/packages/compactor/skills/compactor/SKILL.md +13 -20
- package/packages/compactor/src/card.ts +95 -0
- package/packages/compactor/src/commands/index.ts +85 -124
- package/packages/compactor/src/compaction/compact-args.ts +5 -3
- package/packages/compactor/src/compaction/filter-noise.ts +1 -1
- package/packages/compactor/src/compaction/hooks.ts +533 -312
- package/packages/compactor/src/compaction/jev-prune.ts +114 -0
- package/packages/compactor/src/compaction/source.ts +178 -0
- package/packages/compactor/src/compaction/summarize.ts +704 -52
- package/packages/compactor/src/config/manager.ts +127 -127
- package/packages/compactor/src/config/schema.ts +32 -48
- package/packages/compactor/src/index.ts +40 -431
- package/packages/compactor/src/info-screen.ts +44 -190
- package/packages/compactor/src/session/recall-blocks.ts +1 -1
- package/packages/compactor/src/stats.ts +76 -0
- package/packages/compactor/src/tools/context-budget.ts +17 -34
- package/packages/compactor/src/tools/ctx-doctor.ts +45 -36
- package/packages/compactor/src/tools/register.ts +29 -269
- package/packages/compactor/src/types.ts +48 -186
- package/packages/core/child-agent.ts +1 -0
- package/packages/core/command-echo.ts +63 -0
- package/packages/core/compaction-context.ts +41 -0
- package/packages/core/constants.ts +11 -35
- package/packages/core/events.ts +0 -53
- package/packages/core/fusion-status.ts +4 -0
- package/packages/core/index.ts +7 -0
- package/packages/core/model-cache.ts +81 -7
- package/packages/core/package.json +6 -6
- package/packages/core/src/attach/detect.ts +163 -0
- package/packages/core/src/child-agent/child-args.ts +31 -0
- package/packages/core/src/child-agent/delivery.ts +41 -0
- package/packages/core/src/child-agent/index.ts +5 -0
- package/packages/core/src/child-agent/readers.ts +203 -0
- package/packages/core/src/child-agent/runtime.ts +571 -0
- package/packages/core/src/jev/chatter.ts +24 -0
- package/packages/core/src/jev/settings.ts +177 -14
- package/packages/core/src/package-colors.ts +2 -0
- package/packages/core/src/settings/catalog.ts +39 -15
- package/packages/core/src/settings/engine.ts +48 -2
- package/packages/core/src/settings/hub.ts +83 -20
- package/packages/core/src/settings/migrations.ts +15 -0
- package/packages/core/src/settings/open.ts +49 -0
- package/packages/core/src/settings/schema.ts +27 -7
- package/packages/core/src/tui/hub-kit.ts +18 -5
- package/packages/core/src/tui/kit.ts +198 -0
- package/packages/core/src/tui/progress.ts +73 -0
- package/packages/core/src/workspace/state-migration.ts +21 -10
- package/packages/footer/README.md +4 -6
- package/packages/footer/package.json +6 -6
- package/packages/footer/src/help.ts +1 -1
- package/packages/footer/src/index.ts +33 -2
- package/packages/footer/src/presets.ts +3 -4
- package/packages/footer/src/rendering/icons.ts +0 -20
- package/packages/footer/src/segments/compactor.ts +52 -142
- package/packages/footer/src/segments/memory.ts +23 -0
- package/packages/footer/src/segments/status-ext.ts +0 -1
- package/packages/fusion/package.json +6 -6
- package/packages/fusion/src/child-args.ts +1 -0
- package/packages/fusion/src/index.ts +121 -5
- package/packages/fusion/src/pi-settings.ts +57 -0
- package/packages/fusion/src/picker.ts +145 -42
- package/packages/fusion/src/preset.ts +56 -2
- package/packages/fusion/src/prompts.ts +1 -1
- package/packages/fusion/src/sidekick-runtime.ts +1 -420
- package/packages/fusion/src/tools.ts +71 -133
- package/packages/fusion/src/transcript.ts +37 -82
- package/packages/info-screen/package.json +5 -5
- package/packages/input-shortcuts/package.json +5 -5
- package/packages/input-shortcuts/src/cleared-input.ts +97 -0
- package/packages/input-shortcuts/src/index.ts +4 -0
- package/packages/input-shortcuts/src/registers.ts +0 -0
- package/packages/input-shortcuts/src/undo-redo.ts +0 -0
- package/packages/kanboard/README.md +16 -8
- package/packages/kanboard/index.ts +8 -0
- package/packages/kanboard/package.json +9 -9
- package/packages/kanboard/skills/kanboard/SKILL.md +10 -4
- package/packages/kanboard/src/bin.ts +4 -2
- package/packages/kanboard/src/commands.ts +63 -27
- package/packages/kanboard/src/guard.ts +41 -18
- package/packages/kanboard/src/progress.ts +27 -0
- package/packages/kanboard/src/runner.ts +321 -73
- package/packages/kanboard/src/settings.ts +82 -2
- package/packages/long-horizon/index.ts +109 -8
- package/packages/long-horizon/package.json +5 -5
- package/packages/long-horizon/src/commands.ts +98 -6
- package/packages/long-horizon/src/compaction-brief.ts +35 -0
- package/packages/long-horizon/src/engine/continuation.ts +68 -11
- package/packages/long-horizon/src/engine/goal-state.ts +64 -13
- package/packages/long-horizon/src/engine/runaway.ts +68 -11
- package/packages/long-horizon/src/gate.ts +29 -11
- package/packages/long-horizon/src/progress.ts +87 -0
- package/packages/long-horizon/src/prompts/goal.ts +1 -1
- package/packages/long-horizon/src/runtime.ts +162 -12
- package/packages/long-horizon/src/settings.ts +54 -39
- package/packages/long-horizon/src/tools/goal.ts +6 -0
- package/packages/long-horizon/src/tools/graph.ts +1 -1
- package/packages/long-horizon/src/tools/swarm.ts +3 -3
- package/packages/mcp/package.json +5 -5
- package/packages/memory/README.md +102 -132
- package/packages/memory/commands.ts +262 -127
- package/packages/memory/convert.ts +1072 -0
- package/packages/memory/daemon.ts +312 -0
- package/packages/memory/files.ts +186 -0
- package/packages/memory/index.ts +335 -213
- package/packages/memory/mempalace.ts +140 -863
- package/packages/memory/package.json +15 -12
- package/packages/memory/paths.ts +95 -0
- package/packages/memory/pending.ts +78 -0
- package/packages/memory/reader.ts +272 -0
- package/packages/memory/session.ts +387 -0
- package/packages/memory/settings.ts +69 -262
- package/packages/memory/skills/memory/SKILL.md +59 -140
- package/packages/memory/tools.ts +336 -324
- package/packages/notify/package.json +5 -5
- package/packages/skill-registry/README.md +55 -16
- package/packages/skill-registry/index.ts +223 -0
- package/packages/skill-registry/package.json +20 -4
- package/packages/skill-registry/skills/brainstorm/SKILL.md +16 -13
- package/packages/skill-registry/skills/gather-context/SKILL.md +10 -8
- package/packages/skill-registry/skills/plan/SKILL.md +23 -20
- package/packages/skill-registry/skills/review-work/SKILL.md +10 -7
- package/packages/skill-registry/skills/work/SKILL.md +15 -12
- package/packages/skill-registry/src/editor.ts +208 -0
- package/packages/skill-registry/src/judge.ts +293 -0
- package/packages/skill-registry/src/registry.ts +98 -0
- package/packages/skill-registry/src/settings.ts +258 -0
- package/packages/skill-registry/src/vault.ts +80 -0
- package/packages/subagents/README.md +39 -119
- package/packages/subagents/package.json +8 -16
- package/packages/subagents/skills/subagents/SKILL.md +18 -42
- package/packages/subagents/src/agents.ts +213 -0
- package/packages/subagents/src/cards.ts +172 -0
- package/packages/subagents/src/index.ts +554 -1087
- package/packages/subagents/src/manager.ts +399 -0
- package/packages/subagents/src/profiles.ts +130 -0
- package/packages/subagents/src/transcript.ts +154 -0
- package/packages/subagents/src/ui.ts +328 -0
- package/packages/unipi/bundled.js +27053 -35421
- package/packages/unipi/index.ts +38 -10
- package/packages/updater/package.json +5 -5
- package/packages/utility/README.md +67 -69
- package/packages/utility/package.json +5 -5
- package/packages/utility/skills/image/SKILL.md +37 -0
- package/packages/utility/skills/utility/SKILL.md +17 -60
- package/packages/utility/src/answer/extract.ts +128 -0
- package/packages/utility/src/answer/index.ts +213 -0
- package/packages/utility/src/answer/reply.ts +133 -0
- package/packages/utility/src/answer/web.ts +167 -0
- package/packages/utility/src/attach/index.ts +205 -0
- package/packages/utility/src/commands.ts +38 -147
- package/packages/utility/src/diagnostics/engine.ts +50 -5
- package/packages/utility/src/image/index.ts +33 -0
- package/packages/utility/src/image/models.ts +221 -0
- package/packages/{image/src → utility/src/image}/recognize.ts +2 -2
- package/packages/utility/src/image/settings.ts +178 -0
- package/packages/{image/src/image-source.ts → utility/src/image/source.ts} +1 -1
- package/packages/utility/src/image/tools.ts +168 -0
- package/packages/utility/src/image/transports.ts +186 -0
- package/packages/utility/src/index.ts +49 -388
- package/packages/utility/src/lifecycle/cleanup.ts +116 -311
- package/packages/utility/src/rename/gate.ts +102 -0
- package/packages/utility/src/rename/index.ts +191 -0
- package/packages/utility/src/rename/session.ts +170 -0
- package/packages/utility/src/render/parse.ts +156 -0
- package/packages/utility/src/render/pi-settings.ts +38 -0
- package/packages/utility/src/render/simple.ts +508 -0
- package/packages/utility/src/render/tools.ts +336 -0
- package/packages/utility/src/settings.ts +166 -233
- package/packages/utility/src/types.ts +1 -222
- package/packages/watchdog/index.ts +4 -5
- package/packages/watchdog/package.json +6 -6
- package/packages/watchdog/src/config.ts +3 -2
- package/packages/web-api/package.json +4 -4
- package/packages/workflow/package.json +5 -5
- package/packages/workflow/src/permission/decide.ts +2 -3
- package/packages/workflow/src/permission/index.ts +12 -4
- package/packages/workflow/src/permission/settings.ts +39 -4
- package/packages/background-tasks/extensions/delegate-child.ts +0 -1
- package/packages/background-tasks/src/context-parent-snapshot.ts +0 -142
- package/packages/background-tasks/src/context-token-budget.ts +0 -903
- package/packages/background-tasks/src/context-visible-conversation-v2.ts +0 -551
- package/packages/background-tasks/src/delegate/artifacts.ts +0 -487
- package/packages/background-tasks/src/delegate/budget.ts +0 -415
- package/packages/background-tasks/src/delegate/hook-contract-evidence.json +0 -18
- package/packages/background-tasks/src/delegate/hook-contract.ts +0 -154
- package/packages/background-tasks/src/delegate/launch.ts +0 -484
- package/packages/background-tasks/src/delegate/result-package.ts +0 -459
- package/packages/background-tasks/src/delegate/runner.ts +0 -430
- package/packages/background-tasks/src/delegate/seed.ts +0 -423
- package/packages/background-tasks/src/delegate/types.ts +0 -323
- package/packages/background-tasks/src/delegate-child-extension.ts +0 -978
- package/packages/background-tasks/src/delegate-extension.ts +0 -654
- package/packages/background-tasks/src/fixtures/delegate-context-incident.json +0 -17
- package/packages/compactor/skills/compactor-detail/SKILL.md +0 -116
- package/packages/compactor/skills/compactor-doctor/SKILL.md +0 -71
- package/packages/compactor/skills/compactor-stats/SKILL.md +0 -51
- package/packages/compactor/src/compaction/build-sections.ts +0 -76
- package/packages/compactor/src/compaction/extract/goals.ts +0 -36
- package/packages/compactor/src/compaction/extract/preferences.ts +0 -40
- package/packages/compactor/src/compaction/format.ts +0 -53
- package/packages/compactor/src/compaction/merge.ts +0 -143
- package/packages/compactor/src/config/presets.ts +0 -160
- package/packages/compactor/src/executor/executor.ts +0 -233
- package/packages/compactor/src/executor/runtime.ts +0 -115
- package/packages/compactor/src/security/evaluator.ts +0 -89
- package/packages/compactor/src/security/policy.ts +0 -96
- package/packages/compactor/src/security/scanner.ts +0 -65
- package/packages/compactor/src/session/auto-inject.ts +0 -60
- package/packages/compactor/src/session/db.ts +0 -325
- package/packages/compactor/src/session/extract.ts +0 -144
- package/packages/compactor/src/session/resume-inject.ts +0 -64
- package/packages/compactor/src/session/snapshot.ts +0 -327
- package/packages/compactor/src/tools/ctx-batch-execute.ts +0 -41
- package/packages/compactor/src/tools/ctx-execute-file.ts +0 -23
- package/packages/compactor/src/tools/ctx-execute.ts +0 -23
- package/packages/compactor/src/tools/ctx-stats.ts +0 -96
- package/packages/image/README.md +0 -99
- package/packages/image/package.json +0 -61
- package/packages/image/skills/image/SKILL.md +0 -76
- package/packages/image/src/generate.ts +0 -256
- package/packages/image/src/index.ts +0 -135
- package/packages/image/src/models.ts +0 -519
- package/packages/image/src/openai-images-api.ts +0 -282
- package/packages/image/src/register-providers.ts +0 -209
- package/packages/image/src/settings.ts +0 -173
- package/packages/image/src/tools.ts +0 -326
- package/packages/memory/bridge/mempalace_bridge.py +0 -683
- package/packages/memory/embedding.ts +0 -222
- package/packages/memory/storage.ts +0 -609
- package/packages/subagents/agents/delegate.md +0 -14
- package/packages/subagents/agents/oracle.md +0 -78
- package/packages/subagents/agents/researcher.md +0 -52
- package/packages/subagents/agents/reviewer.md +0 -80
- package/packages/subagents/agents/scout.md +0 -50
- package/packages/subagents/agents/worker.md +0 -59
- package/packages/subagents/prompts/council.md +0 -48
- package/packages/subagents/prompts/gather-context-and-clarify.md +0 -13
- package/packages/subagents/prompts/parallel-cleanup.md +0 -59
- package/packages/subagents/prompts/parallel-research.md +0 -50
- package/packages/subagents/prompts/parallel-review.md +0 -54
- package/packages/subagents/prompts/review-loop.md +0 -43
- package/packages/subagents/skills/council-mode/SKILL.md +0 -230
- package/packages/subagents/skills/subagents/references/constraints-and-recipes.md +0 -259
- package/packages/subagents/skills/subagents/references/execution-controls.md +0 -454
- package/packages/subagents/skills/subagents/references/management-authoring-rpc.md +0 -161
- package/packages/subagents/skills/subagents/references/multi-lane-orchestration.md +0 -39
- package/packages/subagents/skills/subagents/references/prompting-and-roles.md +0 -267
- package/packages/subagents/src/acceptance.ts +0 -331
- package/packages/subagents/src/agent-manager.ts +0 -405
- package/packages/subagents/src/agent-memory.ts +0 -300
- package/packages/subagents/src/agent-overrides.ts +0 -183
- package/packages/subagents/src/agent-runner.ts +0 -271
- package/packages/subagents/src/async-runner.ts +0 -422
- package/packages/subagents/src/authority-policy.ts +0 -47
- package/packages/subagents/src/budgets.ts +0 -285
- package/packages/subagents/src/child-safety.ts +0 -140
- package/packages/subagents/src/config.ts +0 -249
- package/packages/subagents/src/conversation-viewer.ts +0 -281
- package/packages/subagents/src/core-compat.ts +0 -94
- package/packages/subagents/src/custom-agents.ts +0 -343
- package/packages/subagents/src/file-system-retry.ts +0 -50
- package/packages/subagents/src/fleet-data.ts +0 -105
- package/packages/subagents/src/fleet-view.ts +0 -322
- package/packages/subagents/src/foreground-detach.ts +0 -59
- package/packages/subagents/src/fork-context.ts +0 -285
- package/packages/subagents/src/global.d.ts +0 -7
- package/packages/subagents/src/guide.ts +0 -129
- package/packages/subagents/src/mission-state.ts +0 -133
- package/packages/subagents/src/mission-store.ts +0 -436
- package/packages/subagents/src/output-limits.ts +0 -142
- package/packages/subagents/src/parity-types.ts +0 -315
- package/packages/subagents/src/pi-args.ts +0 -167
- package/packages/subagents/src/result-files.ts +0 -232
- package/packages/subagents/src/result-watcher.ts +0 -221
- package/packages/subagents/src/retained-children.ts +0 -176
- package/packages/subagents/src/run-fanout-budget.ts +0 -356
- package/packages/subagents/src/scheduled-runs.ts +0 -349
- package/packages/subagents/src/schemas.ts +0 -263
- package/packages/subagents/src/slash-commands.ts +0 -80
- package/packages/subagents/src/supervisor-channel.ts +0 -249
- package/packages/subagents/src/tool-handler.ts +0 -1144
- package/packages/subagents/src/types.ts +0 -238
- package/packages/subagents/src/widget.ts +0 -457
- package/packages/subagents/src/workflow-script.ts +0 -737
- package/packages/subagents/src/workflow-worker.ts +0 -384
- package/packages/subagents/src/worktree.ts +0 -614
- package/packages/utility/src/analytics/collector.ts +0 -293
- package/packages/utility/src/info-screen.ts +0 -80
- package/packages/utility/src/lifecycle/process.ts +0 -162
- package/packages/utility/src/prefix-cache.ts +0 -263
- package/packages/utility/src/skill-discovery.ts +0 -542
- package/packages/utility/src/tools/env.ts +0 -113
- package/packages/utility/src/tui/name-badge-state.ts +0 -315
- package/packages/utility/src/tui/name-badge.ts +0 -109
- /package/packages/{subagents/src → core/src/child-agent}/pi-spawn.ts +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,169 @@ 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.10] — 2026-09-29
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
- `kanboard`: **jev routing off for new boards** — `defaultStrategy` now defaults to `none` (one-pass) instead of `auto`; set it back to Auto (Settings → Kanboard → Task defaults) to let jev decide again. Existing stored settings keep their value.
|
|
13
|
+
- `kanboard`: Auto strategy answers are now confidence-gated — jev's choice only applies at or above the new `jevThreshold` setting (default 0.8); a missing or low-confidence answer runs the task `none` instead. The strategy debug log shows `confidence=X/threshold`.
|
|
14
|
+
- `long-horizon`: judge confidence threshold default 0.6 → 0.8 for new installs (below it the judge abstains to the default mode); existing stored settings keep their value. `judge.enabled` still defaults to off and `defaultMode` to `none`.
|
|
15
|
+
|
|
16
|
+
## [3.0.0-alpha.9] — 2026-09-29
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
- `long-horizon`: `/unipi:goal|swarm|graph stop` — terminally ends the active owner (goal → `complete(user_requested)`; pending proposal discarded; no further continuation follow-up). `/unipi:clear` on an active owner now points at stop instead of silently doing nothing.
|
|
20
|
+
- `long-horizon`: `/unipi:regular` — stops any active owner (incl. ralph loops) and pins the session to plain mode; an explicit mode command unlatches it.
|
|
21
|
+
- `long-horizon`: command runners `unipi:goal-pause` / `unipi:goal-resume` / `unipi:goal-stop` for cross-module callers.
|
|
22
|
+
- `kanboard`: `/unipi:kanboard-do` grants session **write credits** (setting `kanboard.doCredits`, default 10) instead of a turn-scoped window — credits persist across turns, each board write costs 1, reads stay free, runner tasks keep unlimited access, `off` revokes.
|
|
23
|
+
|
|
24
|
+
### Changed
|
|
25
|
+
- `long-horizon`: verifier resilience — evaluator failures retry once, then pause `paused(verifier_unavailable)`; two consecutive inconclusive verdicts pause `paused(verifier_inconclusive)`; five consecutive `not_met` claims pause unconditionally (stall-cap coupling removed). Paused goals park the owner so `/unipi:goal resume` works.
|
|
26
|
+
- `long-horizon`: tokens — provider usage now read in both pi shapes (`{input, output, …}` and `{inputTokens, outputTokens}`); usage-less turns estimate tokens (chars/4) and flag `tokens_estimated` in `get_goal` and the continuation hint.
|
|
27
|
+
- `long-horizon`: no-progress guard keys "identical arguments" on real tool arguments (captured per `toolCallId`), exempts search no-matches, `get_goal`/`update_goal`, and kanboard reads — no more false "ran 3 times with identical arguments" after three different commands.
|
|
28
|
+
- `kanboard`: an interrupted/released task parks its goal (id recorded in the release note) and resumes it on re-claim; a user-stopped goal releases the task to Todo ("goal stopped by user") instead of In Review; a task cancelled outside the runner stops its goal.
|
|
29
|
+
- `kanboard`: `-do` suggestions only for task-id-like tokens (no more task rows under free prose).
|
|
30
|
+
## [3.0.0-alpha.7] — 2026-09-28
|
|
31
|
+
|
|
32
|
+
### Changed
|
|
33
|
+
|
|
34
|
+
- `ask-user`: `ask_user` is **off by default** (Settings → Ask User). When off, the agent is told to ask in its reply instead.
|
|
35
|
+
|
|
36
|
+
## [3.0.0-alpha.6] — 2026-09-28
|
|
37
|
+
|
|
38
|
+
### Changed
|
|
39
|
+
|
|
40
|
+
- `ask-user`: **rebuilt after Devin's question UI**. One `ask_user` call carries 1–4 questions (`questions: [{ header, question, options, multi_select }]`) with an automatic "Other" choice. Header chips show progress; digits pick; typing on "Other" needs no Enter and the text stays editable; ←→ switch questions; Enter moves on and submits on the last; unanswered questions are sent as skipped; `?` tells the agent you want to clarify first; Esc stops the turn. Pasted/dropped paths and Ctrl+V images in "Other" become `[Image #N]` / `[File #N]` and images reach the model. The transcript shows a short answer tree. The older single-question form is still accepted (`timeout` is ignored). Settings (/unipi:settings → Ask User): questions per call, what Esc does (stop the turn or send what's answered), whether number keys move on, "Other" agent-decided / always / never, and the "not ready" line — the old "allowed formats" switches are gone. Esc and `end_turn` options stop the turn cleanly instead of aborting it.
|
|
41
|
+
|
|
42
|
+
### Fixed
|
|
43
|
+
|
|
44
|
+
- `ask-user`: several `ask_user` calls in one message opened their dialogs at the same time, so only the last was answerable and the turn hung forever; the tool now runs one call at a time.
|
|
45
|
+
- `compactor`: answers from multi-question `ask_user` results are kept as "question → answer" decisions.
|
|
46
|
+
|
|
47
|
+
## [3.0.0-alpha.5] — 2026-09-28
|
|
48
|
+
|
|
49
|
+
### Breaking Changes
|
|
50
|
+
|
|
51
|
+
- **BREAKING: `@pi-unipi/image` removed.** Image generation, editing and recognition now live in `@pi-unipi/utility` (same `image` settings namespace, so existing configs keep working). **Migration path:** nothing to do with the umbrella package; if you installed `@pi-unipi/image` on its own, remove it and use `@pi-unipi/utility`.
|
|
52
|
+
- **BREAKING: utility slimmed.** Removed `/unipi:reload` (use pi's `/reload`), `/unipi:status`, `/unipi:env`, `/unipi:prefix-cache`, the agent tools `ctx_env` and `set_session_name`, the top name-badge bar, the analytics collector and the process-lifecycle signal handlers. **Migration path:** `/unipi:doctor` covers the health checks; sessions are named automatically (below) or with pi's `/name`. Old `badge.*` settings carry over to `rename.*`.
|
|
53
|
+
- **BREAKING: skill exposure moved** from `utility.skills` to the new `skills` namespace (`@pi-unipi/skill-registry`). Migrated automatically on first read.
|
|
54
|
+
|
|
55
|
+
### Added
|
|
56
|
+
|
|
57
|
+
- `utility`: `/unipi:retry`, an alias of `/unipi:continue`.
|
|
58
|
+
- `utility`: **automatic session naming.** After each round, jev checks whether the round (your message plus what the agent did) established a subject and, for a named session, whether it moved to a different task; a throwaway session with a single `rename_session` tool writes the name. Greetings never rename; names set with `/name` are never overwritten; Herdr pane/tab sync kept.
|
|
59
|
+
- `utility`: **`/unipi:answer`** — answer the last reply without scrolling: `reply` (default: the reply scrolls above a fixed input box, like `/unipi:btw`), `questions` (one answer per question, Q/A template) or `web` (local form; over SSH it prints the `ssh -L` forward). A hint above the editor says when a reply asks questions.
|
|
60
|
+
- `utility`: **pasted images and files** become `[Image #N]` / `[File #N]` attachments with a chip row above the editor and inline previews in Kitty, Ghostty, iTerm2 and WezTerm; images are sent to the model as images.
|
|
61
|
+
- `utility`: **image tools** `image_generate`, `image_edit` (new) and `image_recognize`, with OpenRouter, fal and custom-endpoint routes, a key per provider, and model pickers filtered by input/output modality. Default model FLUX.2 [klein] 4B.
|
|
62
|
+
- `utility`: **response formatting** — Settings → Utility → Response formatting: `simple` (one line per tool), `regular` (pi's own) or `advanced` (highlighted commands incl. embedded heredoc/`-c` code, tinted syntax-highlighted diffs, test summaries, exit lines).
|
|
63
|
+
- `utility`: `/unipi:settings <search>` opens the hub filtered; typing `/settings` lists `/unipi:settings` first.
|
|
64
|
+
- `skill-registry`: now a real extension. **Skill settings…** grid (`/unipi:skills` → Skill settings…): per skill Enabled / Discoverable / Must show, per global or project scope, plus a skill vault at `~/.unipi/skill-vault` whose skills stay off until a scope turns them on (skill proxy, off by default).
|
|
65
|
+
- `core`: the shared model cache (`~/.unipi/config/models-cache.json`) records input/output modalities; the settings hub pickers and kanboard read it.
|
|
66
|
+
|
|
67
|
+
### Changed
|
|
68
|
+
|
|
69
|
+
- `skill-registry`: skill judging keeps skills named in the request, lists hidden skills by name in the system prompt, waits for the first real request instead of freezing on a greeting, and caps generic workflow skills.
|
|
70
|
+
- `fusion`: `/unipi:model` lists only your preset lead/sidekick models; typing searches the whole catalogue (also inside the lead/sidekick dropdowns).
|
|
71
|
+
- `utility`: `/unipi:cleanup` only removes files on an explicit list, previews them and asks first; v2 memory backups can never be removed. `/unipi:doctor` checks the model cache, the Decision Model key and skill exposure.
|
|
72
|
+
|
|
73
|
+
### Fixed
|
|
74
|
+
|
|
75
|
+
- `image`: generation failed for most users (only a pi-ai OpenRouter route with a key pi often couldn't see) and failures were reported to the agent as successes.
|
|
76
|
+
- `core`: capability-filtered model pickers hide entries with no declared input again.
|
|
77
|
+
|
|
78
|
+
## [3.0.0-alpha.4] — 2026-09-28
|
|
79
|
+
|
|
80
|
+
### Breaking Changes
|
|
81
|
+
|
|
82
|
+
- **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.
|
|
83
|
+
|
|
84
|
+
### Added
|
|
85
|
+
|
|
86
|
+
- `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.
|
|
87
|
+
- 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.
|
|
88
|
+
- `ask_user` answers are kept as "question → answer" decisions.
|
|
89
|
+
- Typed credentials are redacted.
|
|
90
|
+
- `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.
|
|
91
|
+
- `compactor`: the settings screen shows 5 main settings (Method, Pi's /compact, When, Percentage, Notifications); everything else is under **Advanced compaction**.
|
|
92
|
+
- `core`: `registerCompactionContext()`. long-horizon (goal, ralph) and kanboard register their live state, and every compaction summary leads with it.
|
|
93
|
+
- `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`.
|
|
94
|
+
- **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.
|
|
95
|
+
- `compactor`: user corrections ("restore the background… I did not request this change") are kept as decisions.
|
|
96
|
+
- `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.
|
|
97
|
+
- `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.
|
|
98
|
+
- `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.
|
|
99
|
+
- `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.
|
|
100
|
+
- `compactor`: the info-screen Compactor tab shows the method and trigger settings, compactions by method, tokens before → after, and the last compaction.
|
|
101
|
+
|
|
102
|
+
### Fixed
|
|
103
|
+
|
|
104
|
+
- `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.
|
|
105
|
+
- `compactor`: stats come from the session's own compaction entries instead of a fixed "12% kept" guess (also in the footer segments).
|
|
106
|
+
- `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.
|
|
107
|
+
- `compactor`: secrets are redacted before summary items are clipped (a clipped quote could leak a password).
|
|
108
|
+
- `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.
|
|
109
|
+
- `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.
|
|
110
|
+
|
|
111
|
+
## [3.0.0-alpha.3] — 2026-09-27
|
|
112
|
+
|
|
113
|
+
### Breaking Changes
|
|
114
|
+
|
|
115
|
+
- **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.
|
|
116
|
+
- **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.
|
|
117
|
+
- **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`.
|
|
118
|
+
- `long-horizon`: default mode is now `none` (the judge still routes); set `longHorizon.defaultMode` to keep the old behaviour.
|
|
119
|
+
- `workflow`: the all-projects permission mode moved to its own `permission.defaultMode` key (migrated once from a legacy global `mode`).
|
|
120
|
+
|
|
121
|
+
### Added
|
|
122
|
+
|
|
123
|
+
- **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…".
|
|
124
|
+
- **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).
|
|
125
|
+
- **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".
|
|
126
|
+
- **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.
|
|
127
|
+
- **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).
|
|
128
|
+
- **input-shortcuts:** Ctrl+C keeps the cleared input struck through in the transcript (never sent to the model); ↑ restores it.
|
|
129
|
+
- `core`: every unipi command echoes `❭ /cmd args` in the transcript; the settings engine has an optional `onSet` hook.
|
|
130
|
+
- `npm run tui:gallery` — standalone preview of UniPi's TUI designs, spinners and terminal capabilities.
|
|
131
|
+
|
|
132
|
+
### Fixed
|
|
133
|
+
|
|
134
|
+
- **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.
|
|
135
|
+
- **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.
|
|
136
|
+
- **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.
|
|
137
|
+
- **settings:** the permission project and default rows no longer open two pickers at once.
|
|
138
|
+
- **kanboard:** the binary lookup prefers a source checkout's dev build over a stale platform package.
|
|
139
|
+
- **memory:** at most one queued save reminder.
|
|
140
|
+
|
|
141
|
+
## [3.0.0-alpha.2] — 2026-09-26
|
|
142
|
+
|
|
143
|
+
### Fixed
|
|
144
|
+
|
|
145
|
+
- **kanboard: the crate reports the right version.** `crates/kanboard/Cargo.toml` (and its `Cargo.lock`) stayed at alpha.0 through the alpha.1 bump, so `unipi-kanboard --version` lied. `scripts/sync-pins.mjs` is now the single bump entry point — one run sets every `version` field (root, workspaces, `packages/kanboard-bin/<platform>`) and the `[package] version =` line of every `crates/*/Cargo.toml`.
|
|
146
|
+
- **memory: the migration counter now counts every finished record.** `/unipi:memory status` and the completion notify showed `done 4281/4288` on a clean run because records with no old drawer were finished without incrementing `done`. A clean migration now ends `4288/4288 · 0 failed` (failed units reported separately as `· N failed`).
|
|
147
|
+
- **tests: no more real-HOME/env leakage.** The workflow permission-settings test and the utility skill-judge test now sandbox `HOME` and clear `OPENROUTER_API_KEY`/`TYPESAFE_API_KEY`, so `npm test` passes in a normal shell; the kanboard binary-resolution test honors the env → platform-package → dev-build precedence when a published platform package is installed.
|
|
148
|
+
|
|
149
|
+
### Removed
|
|
150
|
+
|
|
151
|
+
- `scripts/test-subagents-tarball.mjs` — stale v2-era script expecting a `dist/` build `@pi-unipi/subagents` never produces (the package ships `src/`); unreferenced by package.json, CI, or the release chore.
|
|
152
|
+
|
|
153
|
+
## [3.0.0-alpha.1] — 2026-09-25
|
|
154
|
+
|
|
155
|
+
### Breaking Changes
|
|
156
|
+
|
|
157
|
+
- **BREAKING: `memory` is rebuilt on upstream MemPalace 3.10** — the Python bridge (`mempalace_bridge.py`), SQLite/embedding backends, and the direct-`upsert` write path are gone. **Migration path:** v2 data is never converted automatically — pi shows `v2 memories found — run /unipi:memory migrate` on the session card + footer, and `/unipi:memory migrate` prints a plan, asks to confirm, then converts with backups (`~/.mempalace/palace.bak-unipi-<ts>` + `~/.unipi/memory-v2-backup-<ts>`). Rollback instructions live in `packages/memory/README.md` ("Going back to v2").
|
|
158
|
+
- **BREAKING: memory embedding settings removed** — `provider`, `model`, `baseUrl`, `dimensions`, `apiKey`, `suppressMigrationWarning`, the re-embed action, and `/unipi:memory-reembed` are gone; MemPalace embeds itself. Migration path: none needed — stale settings are ignored.
|
|
159
|
+
- **BREAKING: `memory.autoStartDaemon` now defaults OFF** — v3 writes directly (`mempalace mine`, honoring the user's `write_routing`) unless a daemon is already running, so MemPalace MCP servers in other tools are unaffected. Turn it on in `/unipi:settings` → Memory if you want parallel pi sessions to never collide.
|
|
160
|
+
- **BREAKING: pi SDK floor raised to `^0.87.1`** — all `@earendil-works/pi-*` pins moved to 0.87.1 (extension boundary events, `SessionManager`-canonical context). Older pi releases still load most extensions but npm flags the peer mismatch; pin `@pi-unipi/*@3.0.0-alpha.0` to stay on 0.86.
|
|
161
|
+
- `core`: `~/.unipi/state/fusion` and `~/.unipi/trajectory` are **archived, never purged** — they move to `~/.unipi/v2-archive/<name>-<ts>/` on first v3 start (v2 may still write them on shared machines; delete the archive by hand when you're sure).
|
|
162
|
+
|
|
163
|
+
### Added
|
|
164
|
+
|
|
165
|
+
- **memory: the whole module rewritten onto MemPalace's native model.** Markdown files at `~/.unipi/memory/<project>/<type>/<id>.md` (type ∈ `preference | decision | pattern | summary`, wing = sanitized project name) are the durable tier; a per-project `mempalace.yaml` maps the type rooms and a `.gitignore` (`/*.md`) keeps whole-dir mines away from legacy flat files. Writes go through the MemPalace daemon's `/jobs` queue (`mine` jobs for store, `mempalace_delete_by_source` for delete); with no daemon pi writes directly via `mempalace mine` (upstream "prefer" routing) or a one-shot write-mode MCP server, and failures land in `.pending.json` (replayed at session start, after writes, and every 2 min). Reads go through one long-lived read-only `mempalace-mcp` stdio process (~33 ms per call) so search sees **every** drawer — pi, Devin, zcode, diaries.
|
|
166
|
+
- **memory: `/unipi:memory migrate`** — explicit one-way v2 conversion: plan + confirm, palace + md-tree backups, dir normalization (collisions keep newer `updated`, losers → `.conflicts/`), typed layout, daemon-driven mining, per-record verification before any old drawer is deleted, resumable `.conversion.json` under a `.conversion.lock` single-runner guard, temp daemon auto-stopped at the end. Loose files added later are adopted in the background post-conversion.
|
|
167
|
+
- **memory: version gate + markdown-only mode.** `MIN_MEMPALACE = 3.10.0`: older installs get a background `uv tool upgrade` attempt and fall back to local-mode (md files still work; search/list use term scoring and label hits `local`). No install + no uv → same local mode with an install hint on the session card.
|
|
168
|
+
- **memory: v2 command surface restored** — `/unipi:memory-process`, `/unipi:memory-consolidate`, `/unipi:memory-search`, `/unipi:global-memory-search`, `/unipi:memory-forget`, `/unipi:global-memory-list`, plus `/unipi:memory status|recall|write|migrate` with arg completions.
|
|
169
|
+
- **memory: tools + UI.** `memory_store/search/list/delete` (+`global_*` aliases) with rail-framed cards (score bars, per-source labels like `pi`/`devin`/`zcode`), a session card with the wake-up summary folded under it, badge-rendered recall/save reminders, footer stats (recall/write/pending/migration), and `MEMORY_STORED`/`MEMORY_DELETED` events. `recallAtStart`/`write`/`wakeUp`/`autoStartDaemon`/`mempalaceAutoUpdate` switches in the settings hub.
|
|
170
|
+
|
|
171
|
+
|
|
9
172
|
### Added
|
|
10
173
|
|
|
11
174
|
- **kanboard: the v3 daemon and web UI** (`unipi-kanboard serve`). Single instance via `flock(daemon.lock)` (a second `serve` prints the running `daemon.json` and exits 0), binds `127.0.0.1` with `--port` or an OS-assigned port, writes `daemon.json` atomically, removes it on exit (SIGTERM/SIGINT/idle), and shuts down after `--idle-min` (default 10) with no SSE clients and no requests. A `notify` watcher on `projects/` bumps one revision per content change (access events ignored, bursts coalesced) and `GET /events?project=<slug>` streams it, so CLI and agent writes appear live. `status` reports the daemon + liveness, `stop` SIGTERMs it and waits ≤3s.
|
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ pi install npm:@pi-unipi/unipi
|
|
|
11
11
|
|
|
12
12
|
## Requirements
|
|
13
13
|
|
|
14
|
-
- **Pi (`@earendil-works/pi-coding-agent`) `^0.
|
|
14
|
+
- **Pi (`@earendil-works/pi-coding-agent`) `^0.87.1`** — Unipi 3.0.0-alpha tracks the Pi 0.87 SDK (extension boundary events, `SessionManager`-canonical context, `TranscriptContext` custom-provider inputs, native prompt-cache warming). Older Pi releases still load most extensions, but npm will flag the peer dependency mismatch; pin `@pi-unipi/*@<3.0.0` if you must stay on an older Pi.
|
|
15
15
|
|
|
16
16
|
## What You Get
|
|
17
17
|
|
|
@@ -19,9 +19,9 @@ pi install npm:@pi-unipi/unipi
|
|
|
19
19
|
|
|
20
20
|
**[Long-Horizon](./packages/long-horizon/)** — Mode-gated long-horizon execution: `/goal` (one objective until verifiably true, propose+verify), `/ralph` (task-file iteration loops), `/swarm` (independent fan-out + synthesis), `/graph` (dependent multi-step work). A TypeSafe jev prompt judge routes each turn; one automation owner per session with park/resume; runaway-guard steering; token/turn/stall budgets.
|
|
21
21
|
|
|
22
|
-
**[Memory](./packages/memory/README.md)** —
|
|
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)** —
|
|
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
|
|
|
@@ -33,7 +33,6 @@ pi install npm:@pi-unipi/unipi
|
|
|
33
33
|
|
|
34
34
|
**[Web API](./packages/web-api/README.md)** — Web search, page reading, content summarization. Defaults to [wigolo](https://github.com/KnockOutEZ/wigolo), a local-first engine with multi-engine search and on-device reranking — $0/query, no API key. Plus a smart-fetch engine with browser-grade TLS fingerprinting. Paid providers as fallbacks, and auto-selection falls through when a provider is unavailable.
|
|
35
35
|
|
|
36
|
-
**[Image](./packages/image/README.md)** — Generate images from a text prompt and analyze existing ones. 34 image models, plus vision analysis on any model that accepts image input, with a customizable system prompt.
|
|
37
36
|
|
|
38
37
|
**[MCP](./packages/mcp/README.md)** — Browse 7,800+ MCP servers, add them interactively. Tools from servers register automatically as Pi tools.
|
|
39
38
|
|
|
@@ -41,7 +40,7 @@ pi install npm:@pi-unipi/unipi
|
|
|
41
40
|
|
|
42
41
|
**[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
42
|
|
|
44
|
-
**[BTW](./packages/btw/README.md)** —
|
|
43
|
+
**[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
44
|
|
|
46
45
|
**[Ask User](./packages/ask-user/README.md)** — Structured input for decision gates. Single-select, multi-select, freeform. The agent asks instead of guessing.
|
|
47
46
|
|
|
@@ -92,11 +91,11 @@ Coexists triggers enhance behavior when packages are installed together. Workflo
|
|
|
92
91
|
| Kanboard | `/unipi:` | kanboard (board: capture, work runner, web UI) |
|
|
93
92
|
| Long-Horizon | `/unipi:goal`, `/unipi:ralph`, `/unipi:swarm`, `/unipi:graph` | <prompt>, start, stop, status, resume, clear |
|
|
94
93
|
| Memory | `/unipi:memory-` | process, search, consolidate, forget |
|
|
95
|
-
| Compactor | `/unipi:` |
|
|
94
|
+
| Compactor | `/unipi:` | compact-vcc, compact-by-llm, session-recall, compact-stats, compact-doctor, compact-help |
|
|
96
95
|
| Notify | `/unipi:notify-` | settings, test, set-tg, set-ntfy |
|
|
97
96
|
| MCP | `/unipi:mcp-` | add, settings, sync, status |
|
|
98
97
|
| Web | `/unipi:web-` | settings, cache-clear |
|
|
99
|
-
| BTW | `/unipi:btw` | question
|
|
98
|
+
| BTW | `/unipi:btw` | question |
|
|
100
99
|
| Utility | `/unipi:` | env, doctor, status, cleanup, badge-name |
|
|
101
100
|
| Kanboard | `/unipi:kanboard` | toggle, doctor |
|
|
102
101
|
| Footer | `/unipi:footer` | toggle, settings |
|
|
@@ -116,14 +115,12 @@ Coexists triggers enhance behavior when packages are installed together. Workflo
|
|
|
116
115
|
| `spawn_helper` / `get_helper_result` | subagents | Parallel agents |
|
|
117
116
|
| `memory_store` / `memory_search` / `memory_delete` | memory | Memory CRUD |
|
|
118
117
|
| `web_search` / `multi_web_content_read` / `web_llm_summarize` | web-api | Web research |
|
|
119
|
-
| `image_generate` / `image_recognize` |
|
|
118
|
+
| `image_generate` / `image_edit` / `image_recognize` | utility | Image generation, editing and vision (recognize hides while the session model has vision) |
|
|
120
119
|
| `notify_user` | notify | Push notifications |
|
|
121
120
|
| `sidekick` / `read_subagent` | fusion | Delegate to the persistent sidekick and collect its report |
|
|
122
121
|
| `bg_run` / `bg_status` / `bg_logs` / `bg_kill` / `bg_delegate` / `bg_result` | background-tasks | Long-running commands and background delegate agents |
|
|
123
122
|
| `ask_user` | ask-user | User input |
|
|
124
|
-
| `
|
|
125
|
-
| `ctx_env` | utility | Environment info |
|
|
126
|
-
| `set_session_name` | utility | Session name for badge |
|
|
123
|
+
| `session_recall` / `context_budget` | compactor | Context management |
|
|
127
124
|
|
|
128
125
|
## Development
|
|
129
126
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-unipi/unipi",
|
|
3
|
-
"version": "3.0.0-alpha.
|
|
3
|
+
"version": "3.0.0-alpha.10",
|
|
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": [
|
|
@@ -69,7 +70,6 @@
|
|
|
69
70
|
"packages/notify/skills",
|
|
70
71
|
"packages/kanboard/skills",
|
|
71
72
|
"packages/updater/skills",
|
|
72
|
-
"packages/image/skills",
|
|
73
73
|
"packages/subagents/skills"
|
|
74
74
|
],
|
|
75
75
|
"prompts": [
|
|
@@ -77,39 +77,38 @@
|
|
|
77
77
|
]
|
|
78
78
|
},
|
|
79
79
|
"peerDependencies": {
|
|
80
|
-
"@earendil-works/pi-ai": "^0.
|
|
81
|
-
"@earendil-works/pi-coding-agent": "^0.
|
|
82
|
-
"@earendil-works/pi-tui": "^0.
|
|
80
|
+
"@earendil-works/pi-ai": "^0.87.1",
|
|
81
|
+
"@earendil-works/pi-coding-agent": "^0.87.1",
|
|
82
|
+
"@earendil-works/pi-tui": "^0.87.1",
|
|
83
83
|
"typebox": "^1.1.38"
|
|
84
84
|
},
|
|
85
85
|
"dependencies": {
|
|
86
|
-
"@pi-unipi/ask-user": "3.0.0-alpha.
|
|
87
|
-
"@pi-unipi/background-tasks": "3.0.0-alpha.
|
|
88
|
-
"@pi-unipi/btw": "3.0.0-alpha.
|
|
89
|
-
"@pi-unipi/command-enchantment": "3.0.0-alpha.
|
|
90
|
-
"@pi-unipi/compactor": "3.0.0-alpha.
|
|
91
|
-
"@pi-unipi/core": "3.0.0-alpha.
|
|
92
|
-
"@pi-unipi/footer": "3.0.0-alpha.
|
|
93
|
-
"@pi-unipi/
|
|
94
|
-
"@pi-unipi/
|
|
95
|
-
"@pi-unipi/
|
|
96
|
-
"@pi-unipi/
|
|
97
|
-
"@pi-unipi/
|
|
98
|
-
"@pi-unipi/
|
|
99
|
-
"@pi-unipi/
|
|
100
|
-
"@pi-unipi/
|
|
101
|
-
"@pi-unipi/
|
|
102
|
-
"@pi-unipi/
|
|
103
|
-
"@pi-unipi/
|
|
104
|
-
"@pi-unipi/
|
|
105
|
-
"@pi-unipi/
|
|
106
|
-
"@pi-unipi/workflow": "3.0.0-alpha.0"
|
|
86
|
+
"@pi-unipi/ask-user": "3.0.0-alpha.10",
|
|
87
|
+
"@pi-unipi/background-tasks": "3.0.0-alpha.10",
|
|
88
|
+
"@pi-unipi/btw": "3.0.0-alpha.10",
|
|
89
|
+
"@pi-unipi/command-enchantment": "3.0.0-alpha.10",
|
|
90
|
+
"@pi-unipi/compactor": "3.0.0-alpha.10",
|
|
91
|
+
"@pi-unipi/core": "3.0.0-alpha.10",
|
|
92
|
+
"@pi-unipi/footer": "3.0.0-alpha.10",
|
|
93
|
+
"@pi-unipi/fusion": "3.0.0-alpha.10",
|
|
94
|
+
"@pi-unipi/info-screen": "3.0.0-alpha.10",
|
|
95
|
+
"@pi-unipi/input-shortcuts": "3.0.0-alpha.10",
|
|
96
|
+
"@pi-unipi/kanboard": "3.0.0-alpha.10",
|
|
97
|
+
"@pi-unipi/mcp": "3.0.0-alpha.10",
|
|
98
|
+
"@pi-unipi/memory": "3.0.0-alpha.10",
|
|
99
|
+
"@pi-unipi/notify": "3.0.0-alpha.10",
|
|
100
|
+
"@pi-unipi/skill-registry": "3.0.0-alpha.10",
|
|
101
|
+
"@pi-unipi/subagents": "3.0.0-alpha.10",
|
|
102
|
+
"@pi-unipi/updater": "3.0.0-alpha.10",
|
|
103
|
+
"@pi-unipi/utility": "3.0.0-alpha.10",
|
|
104
|
+
"@pi-unipi/web-api": "3.0.0-alpha.10",
|
|
105
|
+
"@pi-unipi/workflow": "3.0.0-alpha.10"
|
|
107
106
|
},
|
|
108
107
|
"devDependencies": {
|
|
109
|
-
"@earendil-works/pi-agent-core": "^0.
|
|
110
|
-
"@earendil-works/pi-ai": "^0.
|
|
111
|
-
"@earendil-works/pi-coding-agent": "^0.
|
|
112
|
-
"@earendil-works/pi-tui": "^0.
|
|
108
|
+
"@earendil-works/pi-agent-core": "^0.87.1",
|
|
109
|
+
"@earendil-works/pi-ai": "^0.87.1",
|
|
110
|
+
"@earendil-works/pi-coding-agent": "^0.87.1",
|
|
111
|
+
"@earendil-works/pi-tui": "^0.87.1",
|
|
113
112
|
"@types/better-sqlite3": "^9.6.0",
|
|
114
113
|
"@types/node": "^25.6.0",
|
|
115
114
|
"diff": "^7.0.0",
|
|
@@ -1,124 +1,72 @@
|
|
|
1
1
|
# @pi-unipi/ask-user
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
The `ask_user` tool (off by default — enable it in `/unipi:settings` → Ask User): when the agent needs a decision from you, it asks 1–4 multiple-choice questions in one dialog and waits. Modelled on Devin's question UI.
|
|
4
4
|
|
|
5
|
-
Three input modes: single-select (pick one), multi-select (toggle several), freeform (type your own). The agent presents the question, you answer, it continues.
|
|
6
|
-
|
|
7
|
-
## Commands
|
|
8
|
-
|
|
9
|
-
Ask-user has no user commands. It's an agent tool package — the agent calls it when it needs input.
|
|
10
|
-
|
|
11
|
-
## Special Triggers
|
|
12
|
-
|
|
13
|
-
All workflow skills detect ask-user and use it for decision gates. Instead of the agent deciding on its own, it presents options and waits for your input. This happens naturally during brainstorm, plan, work, and other skills when the agent faces ambiguity.
|
|
14
|
-
|
|
15
|
-
For workflow handoffs, options can use `action: "new_session"` with a `prefill`. Selecting one opens a launcher where **Compact & run** queues the prefill after compaction (or a short fallback) and **Run directly** queues it immediately. If automatic queuing fails, the prefill is placed in the editor for you to submit manually.
|
|
16
|
-
|
|
17
|
-
The bundled skill guides the agent to use `ask_user` for high-stakes decisions — architecture choices, database selection, naming decisions, anything with lasting impact.
|
|
18
|
-
|
|
19
|
-
## Agent Tool
|
|
20
|
-
|
|
21
|
-
| Tool | Description |
|
|
22
|
-
|------|-------------|
|
|
23
|
-
| `ask_user` | Structured user input with options |
|
|
24
|
-
|
|
25
|
-
### Parameters
|
|
26
|
-
|
|
27
|
-
| Parameter | Type | Default | Description |
|
|
28
|
-
|-----------|------|---------|-------------|
|
|
29
|
-
| `question` | string | required | The question to ask |
|
|
30
|
-
| `context` | string? | — | Additional context shown before question |
|
|
31
|
-
| `options` | array? | [] | Multiple-choice options |
|
|
32
|
-
| `allowMultiple` | boolean? | false | Enable multi-select mode |
|
|
33
|
-
| `allowFreeform` | boolean? | true | Allow freeform text input |
|
|
34
|
-
| `timeout` | number? | — | Auto-dismiss after N ms |
|
|
35
|
-
|
|
36
|
-
### Example
|
|
37
|
-
|
|
38
|
-
```typescript
|
|
39
|
-
ask_user({
|
|
40
|
-
question: "Which database should we use?",
|
|
41
|
-
options: [
|
|
42
|
-
{ label: "PostgreSQL", description: "Reliable, feature-rich" },
|
|
43
|
-
{ label: "SQLite", description: "Simple, serverless" },
|
|
44
|
-
],
|
|
45
|
-
})
|
|
46
5
|
```
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
action: "new_session",
|
|
58
|
-
prefill: "the implementation step specs:2026-05-06-feature-plan.md",
|
|
59
|
-
},
|
|
60
|
-
{ label: "Done for now", value: "done", action: "end_turn" },
|
|
61
|
-
],
|
|
62
|
-
allowFreeform: false,
|
|
63
|
-
})
|
|
6
|
+
── Planet ✓ · Foods 2 · Last book ─────────────────────────────────────
|
|
7
|
+
What was the last book you read?
|
|
8
|
+
Can't remember
|
|
9
|
+
Don't read books
|
|
10
|
+
❭ Other (type your own)
|
|
11
|
+
└ Dune, cover: [Image #1]
|
|
12
|
+
[Image #1] red-cube.png · 570 KB
|
|
13
|
+
───────────────────────────────────────────────────────────────────────
|
|
14
|
+
↑↓ navigate · ↵ select · ctrl+v image · ←→ switch question · esc cancel
|
|
15
|
+
? Not ready to answer, help me out!
|
|
64
16
|
```
|
|
65
17
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
| Launcher choice | Behavior |
|
|
69
|
-
|-----------------|----------|
|
|
70
|
-
| 🧹 Compact & run | Starts context compaction, returns immediately, then queues/submits the prefill as a follow-up message from the compaction callback or a short fallback timer |
|
|
71
|
-
| ▶ Run directly | Queues/submits the prefill immediately as a follow-up message |
|
|
72
|
-
| ✕ Cancel | Cancels the handoff; no message is queued |
|
|
73
|
-
|
|
74
|
-
The tool result is rendered as `queued compact → ...` or `queued direct → ...`. If automatic delivery fails, ask-user falls back to editor prefill and warns you to press Enter.
|
|
75
|
-
|
|
76
|
-
### History Expansion
|
|
18
|
+
## Answering
|
|
77
19
|
|
|
78
|
-
|
|
20
|
+
| Key | Action |
|
|
21
|
+
|-----|--------|
|
|
22
|
+
| `↑` `↓` | Move between options |
|
|
23
|
+
| `1`–`9` | Pick that option (single choice: picks and moves on; multi-select: toggles) |
|
|
24
|
+
| `space` | Toggle (multi-select) |
|
|
25
|
+
| `enter` | Select and go to the next question; on the last one, send everything |
|
|
26
|
+
| `←` `→`, `tab` | Switch question (in a non-empty "Other" they move the text cursor) |
|
|
27
|
+
| type | On "Other", just type — no Enter needed. The option numbers hide so digits are text |
|
|
28
|
+
| paste / drop / `ctrl+v` | In "Other": a pasted or dropped image/file path, or a clipboard image (Ctrl+V), becomes `[Image #N]` / `[File #N]`; images are sent to the model with your answer |
|
|
29
|
+
| `?` | Not ready to answer: the agent is told you want to clarify first |
|
|
30
|
+
| `esc` | Cancel and stop the agent's turn (or send what's answered — see Settings) |
|
|
79
31
|
|
|
80
|
-
|
|
32
|
+
Questions you leave unanswered are sent as **skipped** — skipping never blocks. The header chips show progress: `✓` answered, a number for multi-select picks.
|
|
81
33
|
|
|
82
|
-
|
|
83
|
-
|------|------|
|
|
84
|
-
| Single-select | Up/Down navigate, Enter select, Esc cancel |
|
|
85
|
-
| Multi-select | Up/Down navigate, Space toggle, Enter submit, Esc cancel |
|
|
86
|
-
| Freeform | Type text, Enter submit, Esc back |
|
|
34
|
+
In the transcript the answers stay as a short tree (`● Asked user 3 questions` / `│ Planet: Mars` / `└ Last book: Dune`).
|
|
87
35
|
|
|
88
|
-
|
|
36
|
+
## For the agent
|
|
89
37
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
**Multi-select:**
|
|
38
|
+
```ts
|
|
39
|
+
ask_user({
|
|
40
|
+
questions: [{
|
|
41
|
+
header: "Database", // ≤16 chars, shown as a chip
|
|
42
|
+
question: "Which database should the service use?",
|
|
43
|
+
options: [ // 2–4; "Other" is added automatically
|
|
44
|
+
{ label: "Postgres", description: "JSON columns, full-text search" },
|
|
45
|
+
{ label: "SQLite", description: "Zero setup; single writer" },
|
|
46
|
+
],
|
|
47
|
+
multi_select: false, // optional
|
|
48
|
+
other: true, // optional; false removes "Other"
|
|
49
|
+
}],
|
|
50
|
+
})
|
|
105
51
|
```
|
|
106
|
-
─────────────────────────────
|
|
107
|
-
Which features to enable?
|
|
108
|
-
─────────────────────────────
|
|
109
|
-
> [x] Logging
|
|
110
|
-
[ ] Metrics
|
|
111
|
-
[x] Tracing
|
|
112
|
-
[ ] Type something...
|
|
113
52
|
|
|
114
|
-
|
|
115
|
-
─────────────────────────────
|
|
116
|
-
```
|
|
53
|
+
The result is `User answered your questions:` followed by a JSON object keyed by question: `{ "selected": [...], "custom_text": "...", "skipped": false }`. Attached images follow as image content.
|
|
117
54
|
|
|
118
|
-
|
|
55
|
+
- Tool calls from one message run one at a time, so several `ask_user` calls can never hide each other (they used to: only the last dialog was answerable and the turn hung).
|
|
56
|
+
- Options can carry `action: "end_turn"` or `action: "new_session"` with a `prefill` — the workflow skills use these for handoffs; a launcher offers **Compact & run** or **Run directly**.
|
|
57
|
+
- The older single-question form (`question`, `context`, `options`, `allowMultiple`, `allowFreeform`) is still accepted; `timeout` is ignored — you answer in your own time.
|
|
58
|
+
- Inside a subagent the tool fails with instructions to report the question to the lead instead.
|
|
119
59
|
|
|
120
|
-
|
|
60
|
+
## Settings
|
|
121
61
|
|
|
122
|
-
|
|
62
|
+
`/unipi:settings` → Ask User (changes apply to the next question, no restart):
|
|
123
63
|
|
|
124
|
-
|
|
64
|
+
| Setting | Default | What it does |
|
|
65
|
+
|---------|---------|--------------|
|
|
66
|
+
| Enable ask_user | **off** | Give the agent the tool; when off, the agent is told to ask in its reply instead |
|
|
67
|
+
| Notify when asked | on | Send a notification while the agent waits for you |
|
|
68
|
+
| Questions per call | 4 | How many questions one dialog may hold (1–4; the tool description updates in new sessions) |
|
|
69
|
+
| Esc | stop the agent's turn | Or: send what's answered, the rest as skipped |
|
|
70
|
+
| Number keys move on | on | In a single-choice question, 1–9 also goes to the next question |
|
|
71
|
+
| "Other" choice | agent decides | Or: always / never offer "Other (type your own)", whatever the agent asked for |
|
|
72
|
+
| "Not ready" line | on | Show "? Not ready to answer, help me out!" (the `?` key works either way) |
|