gentle-pi 3.2.1 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +63 -59
- package/assets/orchestrator-delegation.md +1 -1
- package/docs/assets/brand/gentle-shell-banner.gif +0 -0
- package/docs/assets/diagrams/odd-workflow.svg +74 -0
- package/docs/assets/features/agents-view.png +0 -0
- package/docs/assets/features/changes-view.png +0 -0
- package/docs/assets/features/command-palette.png +0 -0
- package/docs/assets/features/profiles-routing.png +0 -0
- package/docs/gentle-shell.md +52 -15
- package/docs/readme-reference.md +67 -7
- package/docs/review-integration.md +22 -17
- package/extensions/ask-user-question.ts +210 -0
- package/extensions/gentle-agents.ts +93 -18
- package/extensions/gentle-ai.ts +180 -37
- package/extensions/gentle-shell.ts +476 -39
- package/extensions/gentle-todo.ts +19 -1
- package/extensions/quiet-tools.ts +28 -5
- package/extensions/startup-banner.ts +25 -10
- package/lib/agents-view.ts +41 -14
- package/lib/agents-widget.ts +84 -13
- package/lib/animation-policy.ts +52 -0
- package/lib/background-cache-warming.ts +38 -0
- package/lib/command-palette-catalog.ts +2 -0
- package/lib/double-esc-cancel-policy.ts +138 -0
- package/lib/inprocess-reviewer.ts +297 -0
- package/lib/native-review-cli.ts +50 -10
- package/lib/odd-runtime-delegation-gate.ts +88 -0
- package/lib/questionnaire/questionnaire-view.ts +603 -0
- package/lib/questionnaire/schema.ts +82 -0
- package/lib/questionnaire/validate.ts +141 -0
- package/lib/review-candidate-view-owner.ts +20 -5
- package/lib/review-candidate-view.ts +9 -2
- package/lib/review-host-relay.ts +256 -171
- package/lib/review-integration-v2.ts +114 -27
- package/lib/shell-bar.ts +163 -75
- package/lib/shell-card.ts +19 -9
- package/lib/shell-changes-view.ts +43 -5
- package/lib/shell-changes.ts +92 -5
- package/lib/shell-hover.ts +39 -0
- package/lib/shell-prompt.ts +10 -1
- package/lib/shell-sidebar-layout.ts +118 -16
- package/lib/shell-sidebar.ts +16 -0
- package/lib/shell-todo.ts +7 -1
- package/lib/shell-usage-view.ts +103 -12
- package/lib/shell-usage.ts +120 -6
- package/package.json +1 -1
- package/runtime/native-review-cli.mjs +49 -9
- package/runtime/review-integration-v2.mjs +114 -27
- package/scripts/gentle-ai-installer.mjs +10 -10
- package/scripts/maintainer/provider-relay-matrix.mjs +118 -47
- package/scripts/verify-package-files.mjs +3 -4
- package/tests/agents-grouping.test.ts +75 -18
- package/tests/agents-view.test.ts +28 -18
- package/tests/agents-widget.test.ts +100 -12
- package/tests/animation-policy.test.ts +42 -0
- package/tests/ask-user-question.test.ts +435 -0
- package/tests/background-cache-warming.test.ts +60 -0
- package/tests/background-subagents.test.ts +68 -0
- package/tests/command-palette.test.ts +10 -0
- package/tests/devbinary/pi-host-relay.devtest.ts +176 -138
- package/tests/double-esc-cancel-policy.test.ts +194 -0
- package/tests/gentle-agents.test.ts +599 -7
- package/tests/gentle-ai-binary.test.ts +1 -1
- package/tests/gentle-ai-installer.test.ts +47 -47
- package/tests/gentle-ai.test.ts +125 -9
- package/tests/gentle-shell.test.ts +1149 -24
- package/tests/gentle-todo.test.ts +17 -4
- package/tests/inprocess-reviewer.test.ts +460 -0
- package/tests/maintainer/provider-relay.maintest.ts +101 -143
- package/tests/native-review-capability-contract.test.ts +34 -1
- package/tests/native-review-parity.test.ts +19 -0
- package/tests/odd-runtime-delegation-gate.test.ts +212 -0
- package/tests/orchestrator-rdd-ownership.test.ts +3 -3
- package/tests/package-manifest.test.ts +6 -17
- package/tests/questionnaire-schema.test.ts +274 -0
- package/tests/questionnaire-view.test.ts +446 -0
- package/tests/rdd-status-line.test.ts +21 -4
- package/tests/review-candidate-owner-retry.test.ts +63 -0
- package/tests/review-candidate-view.test.ts +15 -0
- package/tests/review-controller-native-routing.test.ts +86 -0
- package/tests/review-host-relay-routing.test.ts +77 -0
- package/tests/review-host-relay.test.ts +297 -299
- package/tests/review-integration-v2-forward.test.ts +61 -0
- package/tests/review-integration-v2.test.ts +146 -1
- package/tests/review-ledger-contract.test.ts +1 -2
- package/tests/review-relay-transport-agent.test.ts +129 -26
- package/tests/review-risk-assessment.test.ts +104 -0
- package/tests/runtime-harness.mjs +11 -0
- package/tests/session-changes-shell.test.ts +27 -0
- package/tests/session-worktree-registry.test.ts +41 -0
- package/tests/shell-bar.test.ts +200 -124
- package/tests/shell-card.test.ts +5 -3
- package/tests/shell-changes-view.test.ts +47 -0
- package/tests/shell-changes.test.ts +177 -0
- package/tests/shell-hover.test.ts +19 -0
- package/tests/shell-prompt.test.ts +20 -0
- package/tests/shell-sidebar-fullscreen.test.ts +59 -0
- package/tests/shell-sidebar-layout.test.ts +301 -8
- package/tests/shell-sidebar.test.ts +25 -1
- package/tests/shell-todo.test.ts +36 -0
- package/tests/shell-usage-view.test.ts +120 -1
- package/tests/shell-usage.test.ts +129 -0
- package/tests/skill-collision-prefixes.test.ts +1 -1
- package/tests/startup-banner.test.ts +93 -2
- package/docs/assets/brand/gentle-pi-banner.png +0 -0
- package/lib/opaque-pi-reviewer-adapter.ts +0 -404
- package/skills/release/SKILL.md +0 -137
- package/tests/opaque-pi-reviewer-adapter.test.ts +0 -410
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<a id="top"></a>
|
|
2
2
|
|
|
3
3
|
<div align="center">
|
|
4
|
-
<img src="docs/assets/brand/gentle-
|
|
4
|
+
<img src="docs/assets/brand/gentle-shell-banner.gif" width="1200" alt="gentle-shell — Ecosystem, Agent, One shell">
|
|
5
5
|
</div>
|
|
6
6
|
|
|
7
7
|
<h1 align="center">gentle-shell™</h1>
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
|
|
35
35
|
<p align="center"><sub>One workspace. A coding agent you direct. A workflow you can inspect.</sub></p>
|
|
36
36
|
|
|
37
|
-
<p align="center"><strong>BUILT FOR PI</strong> · Coding-agent workspace · Focused agents · ODD
|
|
37
|
+
<p align="center"><strong>BUILT FOR PI</strong> · Coding-agent workspace · Focused agents · ODD</p>
|
|
38
38
|
|
|
39
39
|
<p align="center">
|
|
40
40
|
<a href="https://github.com/Gentleman-Programming/gentle-pi/stargazers"><strong>★ Star gentle-shell on GitHub</strong></a>
|
|
@@ -74,122 +74,126 @@
|
|
|
74
74
|
|
|
75
75
|
### gentle-shell — Your coding agent, in the workspace you lead
|
|
76
76
|
|
|
77
|
-
<
|
|
78
|
-
<img src="docs/assets/features/gentle-shell.png" width="1200" alt="gentle-shell showing an SDD agent task, todo list, changes summary, status bar, and usage footer in Pi">
|
|
79
|
-
</p>
|
|
80
|
-
|
|
81
|
-
<strong>A complete workspace for the agent you direct.</strong> gentle-shell is your coding agent, built for Pi, with native workspace features for agent orchestration, usage monitoring for supported provider accounts, and built-in diff views—all in one integrated layout.
|
|
77
|
+
<img width="100%" src="https://github.com/user-attachments/assets/5d9eefc2-7b2a-48f8-b212-1439834ce195" alt="gentle-shell running a live agent session: a header row with branch, model, and context gauge above the transcript, with status, changes, and todo cards in the right rail">
|
|
82
78
|
|
|
83
|
-
|
|
79
|
+
A bare terminal answers "what is the agent doing?" only with scrollback. gentle-shell turns your Pi session into a workspace: agent orchestration, live changes and runtime status, usage monitoring for supported provider accounts, and built-in diff views — so you lead the work instead of chasing it.
|
|
84
80
|
|
|
85
81
|
<p align="center"><sub>gentle-shell in action. Screenshot from <a href="https://raw.githubusercontent.com/Gentleman-Programming/gentle-ai/main/docs/assets/features/gentle-shell.png">Gentle-AI</a>.</sub></p>
|
|
86
82
|
|
|
87
|
-
**[→
|
|
83
|
+
**[Docs →](docs/gentle-shell.md)**
|
|
88
84
|
|
|
89
85
|
---
|
|
90
86
|
|
|
91
87
|
### el Gentleman — Think before you build
|
|
92
88
|
|
|
93
|
-
<
|
|
94
|
-
<img src="docs/assets/diagrams/gentleman-workflow.svg" width="1200" alt="Diagram of el Gentleman turning human intent into clarified scope, a smallest workflow choice, evidence, and a human delivery decision">
|
|
95
|
-
</p>
|
|
96
|
-
|
|
97
|
-
Say what you need once, then keep moving. el Gentleman helps turn intent into clear scope, a sensible next step, and evidence people can review—without making every task feel like a process meeting.
|
|
89
|
+
<img width="100%" src="docs/assets/diagrams/gentleman-workflow.svg" alt="Diagram of el Gentleman turning human intent into clarified scope, a smallest workflow choice, evidence, and a human delivery decision">
|
|
98
90
|
|
|
99
|
-
|
|
91
|
+
Say what you need once, then keep moving. el Gentleman helps turn intent into clear scope, a sensible next step, and evidence people can review — without making every task feel like a process meeting.
|
|
100
92
|
|
|
101
|
-
**[→
|
|
93
|
+
**[Docs →](docs/readme-reference.md#organic-driven-development)**
|
|
102
94
|
|
|
103
95
|
---
|
|
104
96
|
|
|
105
97
|
### Focused agents — Context with a return path
|
|
106
98
|
|
|
107
|
-
<
|
|
108
|
-
<img src="docs/assets/diagrams/agent-orchestration.svg" width="1200" alt="Diagram of one parent session directing bounded map, implementation, and verification work and receiving evidence back">
|
|
109
|
-
</p>
|
|
99
|
+
<img width="100%" src="docs/assets/diagrams/agent-orchestration.svg" alt="Diagram of one parent session directing bounded map, implementation, and verification work and receiving evidence back">
|
|
110
100
|
|
|
111
101
|
Bring in help without losing the thread. Focused package-owned Pi agents can map a codebase, implement a bounded change, or verify it, while one parent stays accountable for the scope, the decisions, and the final summary.
|
|
112
102
|
|
|
113
|
-
**[→
|
|
114
|
-
|
|
115
|
-
- `orchestrator_session_id`, `orchestrator_list`, and `orchestrator_send_message` provide local-profile session notifications. List results advertise IDs only and reachability remains unknown. Sending selects the sole advertised peer or asks the user to choose; a successful ACK means the peer accepted the notification for delivery, not that it read or completed work. This is notification-and-ACK transport only: it has no cross-session queries, offline queue, retries, broadcasts, or read/completion guarantees. On Unix, presence records remain in the profile's private transport directory while socket endpoints use a private, profile-hashed directory below the canonical system temporary directory, keeping endpoint length independent of the profile path and at most 100 encoded bytes. The shared system temporary parent is only validated (current-user-owned without group/other write, or root/current-user-owned, world-writable, and sticky); it is never claimed, permissioned, or cleaned up by gentle-pi. On Windows, the transport selects a package-local PowerShell helper for a Windows named pipe; availability and delivery depend on the helper's bounded startup and pipe checks.
|
|
103
|
+
**[Docs →](docs/readme-reference.md#how-the-harness-decides-what-to-do)**
|
|
116
104
|
|
|
117
105
|
---
|
|
118
106
|
|
|
119
107
|
### ODD — The everyday workflow
|
|
120
108
|
|
|
121
|
-
|
|
109
|
+
<img width="100%" src="docs/assets/diagrams/odd-workflow.svg" alt="Organic Driven Development as seven numbered steps: Authorize, Explore, Resolve uncertainty, and Classify across the top row; Classify forks, so small understood work stays light while substantial work gets step five, Track, with one feature document; both paths converge on Implement task by task and then Close, above a dashed band marking that one feature document mirrored in Engram lets work resume across sessions">
|
|
110
|
+
|
|
111
|
+
**Organic Driven Development (ODD)** is the everyday path: the agent explores before changing anything, clarifies only real decisions, and keeps small understood work small. Substantial, authorized work gets one recoverable feature document — mirrored in memory when available — so progress, evidence, and the next step survive an interruption; checks follow the configured TDD mode.
|
|
112
|
+
|
|
113
|
+
**[Docs →](docs/readme-reference.md#organic-driven-development)**
|
|
122
114
|
|
|
123
|
-
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
### Native review — Review the exact change
|
|
124
118
|
|
|
125
|
-
|
|
119
|
+
<img width="100%" src="docs/assets/diagrams/native-review.svg" alt="Diagram showing one frozen candidate passing through risk-scoped native review to an outcome, while human delivery choices stay separate">
|
|
126
120
|
|
|
127
|
-
|
|
121
|
+
Review the exact change, not a moving target. Native review keeps one candidate in view, returns risk-scoped evidence, and can surface a bounded correction path. You still decide what happens next in your repository.
|
|
128
122
|
|
|
129
|
-
**[→
|
|
123
|
+
**[Docs →](docs/review-integration.md)**
|
|
130
124
|
|
|
131
125
|
---
|
|
132
126
|
|
|
133
|
-
###
|
|
127
|
+
### Gentle Changes — Every edit, attributed and reviewable
|
|
134
128
|
|
|
135
|
-
<
|
|
136
|
-
<img src="docs/assets/diagrams/sdd-cycle.svg" width="1200" alt="Diagram of an optional specification-driven development cycle from explore through archive, with TDD evidence attached to apply when available">
|
|
137
|
-
</p>
|
|
129
|
+
<img width="100%" src="docs/assets/features/changes-view.png" alt="Gentle Changes viewer: worktree accordion with per-file status on the left, the captured diff with line counts on the right, and a keyboard hint row">
|
|
138
130
|
|
|
139
|
-
|
|
131
|
+
You should not have to run `git status` to find out what your agent did. Gentle Changes captures the successful write and edit tool calls from the current session and its owned subagents — no repository scans, no background polling — and shows them in a two-pane viewer with per-file line counts and an honest **diff unavailable** when an external edit breaks continuity. Coverage stops at those tools, so shell commands and failed runs leave no row, and a missing entry never proves a clean tree. `alt+g` opens it; `o` drops the real file into your editor.
|
|
140
132
|
|
|
141
|
-
**[→
|
|
133
|
+
**[Docs →](docs/gentle-shell.md#browse-captured-diffs)**
|
|
142
134
|
|
|
143
135
|
---
|
|
144
136
|
|
|
145
|
-
###
|
|
137
|
+
### Gentle Agents — Parallel work with a live view
|
|
146
138
|
|
|
147
|
-
<
|
|
148
|
-
<img src="docs/assets/diagrams/native-review.svg" width="1200" alt="Diagram showing one frozen candidate passing through risk-scoped native review to an outcome, while human delivery choices stay separate">
|
|
149
|
-
</p>
|
|
139
|
+
<img width="100%" src="docs/assets/features/agents-view.png" alt="Gentle Agents overlay showing a completed subagent thread with model, tokens, and elapsed columns, and the structured handoff it returned">
|
|
150
140
|
|
|
151
|
-
|
|
141
|
+
Delegating work should not mean losing it. Every subagent runs as its own process with a live card above the editor — model, tokens, cost, elapsed — and `alt+a` opens the full view with retained threads, stop controls, and history restored on resume. A child can ask you a question as an ordinary dialog, and background results come back as cards that start a new turn — nothing polls.
|
|
152
142
|
|
|
153
|
-
**[→
|
|
143
|
+
**[Docs →](docs/gentle-shell.md#gentle-agents)**
|
|
154
144
|
|
|
155
145
|
---
|
|
156
146
|
|
|
157
|
-
###
|
|
147
|
+
### Profiles and model routing — One deliberate decision per knob
|
|
158
148
|
|
|
159
|
-
|
|
149
|
+
<img width="100%" src="docs/assets/features/profiles-routing.png" alt="Profiles view: profile list on the left, orchestrator model and effort on the right, with per-role profile routing and effective current routing">
|
|
160
150
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
151
|
+
Model, effort, and who does what should be choices, not accidents. Named profiles route the orchestrator atomically and independently from packaged and review roles; a repository can pin its profile so its subagents stop following the globally active one, and the panel always shows the routing the runtime actually uses.
|
|
152
|
+
|
|
153
|
+
**[Docs →](docs/readme-reference.md#agent-model-profiles)**
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
### Command palette — Every command, one keystroke away
|
|
158
|
+
|
|
159
|
+
<img width="100%" src="docs/assets/features/command-palette.png" alt="Command palette with a search field and grouped entries: Configuration, Session, Diagnostics, SDD, and Skills">
|
|
160
|
+
|
|
161
|
+
Extension commands are only useful if you can find them. `alt+k` opens a curated, grouped palette — Configuration, Session, Diagnostics, SDD, and Skills — searchable by label, command name, or description, showing entries only when they are actually registered.
|
|
162
|
+
|
|
163
|
+
**[Docs →](docs/gentle-shell.md#command-palette)**
|
|
164
164
|
|
|
165
165
|
---
|
|
166
166
|
|
|
167
167
|
### Also in the box
|
|
168
168
|
|
|
169
|
-
|
|
|
170
|
-
|
|
|
169
|
+
| Component | What it does |
|
|
170
|
+
| :--- | :--- |
|
|
171
171
|
| Startup and runtime panel | A configurable gentle-shell entry point and visible runtime state for Pi. |
|
|
172
172
|
| Skills and delivery guidance | Package skills for documentation, issue work, PRs, reviews, and reviewable work units. |
|
|
173
173
|
| Model, effort, persona, and profile controls | Explicit knobs for how Pi routes and presents work. |
|
|
174
174
|
| Safety boundaries | Guards around destructive operations and sensitive-path handling. |
|
|
175
175
|
| Optional companion packages | Extra capabilities you may choose to add; persistent memory is **not** bundled with `gentle-pi`. |
|
|
176
|
+
| Fullscreen workspace layout | Header row plus a scrolling Status → Changes → TODO rail on wide terminals. |
|
|
177
|
+
| Live status bar and prompt petal | One-line gauge, cost, and statuses; the petal shows `working` and `queued`. |
|
|
178
|
+
| Parent ↔ subagent communication | Delegate, steer, reply, and cross-session notification within your local profile. |
|
|
179
|
+
| Native interactive tools | Built-in questions, choices, and review captures — no third-party dependency. |
|
|
180
|
+
| Gentle Todo | A plan card that turns amber when the model lets it go stale. |
|
|
181
|
+
| Subscription usage | Per-window meters and resets for supported provider accounts. |
|
|
182
|
+
| Gentle notices | Gentle AI calls and review reminders as cards in the transcript. |
|
|
176
183
|
|
|
177
|
-
|
|
178
|
-
<summary><strong>Optional companions, when they fit your setup</strong></summary>
|
|
184
|
+
> **Every component, skill and preset: [Full breakdown →](docs/gentle-shell.md)**
|
|
179
185
|
|
|
180
|
-
|
|
186
|
+
---
|
|
181
187
|
|
|
182
|
-
|
|
183
|
-
| --- | --- |
|
|
184
|
-
| `pi-intercom` | Cross-session communication where your Pi setup supports it. |
|
|
185
|
-
| `gentle-engram` | Persistent memory, separately installed and configured. |
|
|
186
|
-
| `pi-web-access` | Web access when a task needs it and your policy allows it. |
|
|
187
|
-
| `pi-lens` | Additional inspection surfaces. |
|
|
188
|
-
| `@juicesharp/rpiv-ask-user-question` | Interactive choice support. |
|
|
188
|
+
### What's new in v2.6.0
|
|
189
189
|
|
|
190
|
-
|
|
190
|
+
The [v2.6.0 release](https://github.com/Gentleman-Programming/gentle-pi/releases/tag/v2.6.0) brings a more persistent, inspectable Pi workspace:
|
|
191
191
|
|
|
192
|
-
|
|
192
|
+
- **Shell:** `/gentle:changes` groups captured write/edit changes from the current agent session and its subagents, without startup repository scans; fullscreen navigation, sidebars, and mouse support stay available. See the [capture limits and shell-command coverage](docs/gentle-shell.md#what-appears-in-changes).
|
|
193
|
+
- **Agents and profiles:** the Agents view shows orchestrator/session hierarchy, retained completion, abort, and lost-exit history, parent-child handoff, and model, effort, and usage observability. Named `/gentle:profiles` atomically route the orchestrator independently from packaged and review roles; applying one replaces the routing of every agent, a repository can be pinned to a profile with `p` so its subagent launches stop following the globally active profile, and the panel shows the routing the runtime actually uses even when `models.json` is sparse.
|
|
194
|
+
- **Control and recovery:** native SDD requires parent-confirmed preflight; native review supports intended-untracked selection, consent, and provider continuations. Subsystems install with explicit recovery guidance when npm lifecycle scripts were skipped; Pi Git installs are recognized globally; custom ask responses are opt-in. Windows keeps child consoles hidden and fixes ownership mode; Gentle Todo keeps the next pending task visible when collapsed.
|
|
195
|
+
|
|
196
|
+
---
|
|
193
197
|
|
|
194
198
|
<p align="right"><a href="#top">Back to top ↑</a></p>
|
|
195
199
|
|
|
@@ -225,7 +229,7 @@ See the [v2.6.0 release notes](https://github.com/Gentleman-Programming/gentle-p
|
|
|
225
229
|
|
|
226
230
|
> **Fullscreen installation note:** a recognized global installation persists Pi’s `"tuiMode": "fullscreen"` setting. Project-local and other install paths do not receive that change.
|
|
227
231
|
|
|
228
|
-
For prerequisites, source-checkout instructions, full install behavior, and release policy, use the **[installation reference](docs/readme-reference.md#install)**. For everyday work, describe the outcome and follow [ODD](#odd--the-everyday-workflow).
|
|
232
|
+
For prerequisites, source-checkout instructions, full install behavior, and release policy, use the **[installation reference](docs/readme-reference.md#install)**. For everyday work, describe the outcome and follow [ODD](#odd--the-everyday-workflow).
|
|
229
233
|
|
|
230
234
|
<p align="right"><a href="#top">Back to top ↑</a></p>
|
|
231
235
|
|
|
@@ -203,7 +203,7 @@ When the policy is on and `subagent_run` is available:
|
|
|
203
203
|
|
|
204
204
|
- The runtime already defaults `subagent_run` to `mode: "background"` under this policy in interactive and RPC sessions, so omit `mode` for ordinary delegation. It returns a task id at once; the terminal stays free and the human keeps typing. Pass a `label` of three to six words naming the work.
|
|
205
205
|
- A child `agent_end` retains its latest answer but is not completion: Pi may still retry, compact, or run a queued follow-up. Treat the task as finished only at `agent_settled`; only then release its queue slot, publish its background result, or terminate it. If it exits first, report failure with its retained answer as diagnostics.
|
|
206
|
-
- When a background task settles, its result arrives as a message in this session (custom type `gentle-agents.result`, one per task) and starts a new turn if you are idle. Wait for it: end the turn once launches and any non-overlapping work are done. Never
|
|
206
|
+
- When a background task settles, its result arrives as a message in this session (custom type `gentle-agents.result`, one per task) and starts a new turn if you are idle. Wait for it: end the turn once launches and any non-overlapping work are done. Never sleep or periodically poll `subagent_status`/`subagent_result` for completion or cache maintenance. Retain the task ID. Use `subagent_status` only at a real orchestration decision boundary: user-requested inspection, relevant scope change, input request, or suspected abnormal behavior. Never relaunch equivalent work merely because it is queued or running. Cache warming belongs to Pi's native runtime, never to model-driven maintenance turns.
|
|
207
207
|
- Do not claim an implementation ready or RDD-ready while its required verification or correction follow-up remains queued. Run the required focused verification before that claim, and retain legitimate post-correction verification. This does not invent a universal full-suite requirement or make a receipt a delivery gate.
|
|
208
208
|
- Use `mode: "task"` only when the subagent must ask the human something mid-flight (task-mode dialogs reach the human; background dialogs are dismissed) or when the human asked to wait.
|
|
209
209
|
- Launch as many independent tasks as the work has; the runner queues beyond `max_concurrency`. Do not duplicate launches or work, and do not overlap files or topics. Never run parallel writers in one worktree.
|
|
Binary file
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="960" height="760" viewBox="0 0 960 760" role="img" aria-labelledby="odd-title odd-desc">
|
|
2
|
+
<title id="odd-title">Organic Driven Development workflow</title>
|
|
3
|
+
<desc id="odd-desc">One feature moves through the seven ODD protocol steps. Authorize, explore, resolve uncertainty, then classify: small understood work stays light with no durable artifacts, while substantial work is tracked in one feature document before the first write. Both paths implement task by task and close with verified proof. The same feature document carries progress across sessions so work resumes instead of restarting.</desc>
|
|
4
|
+
<defs>
|
|
5
|
+
<linearGradient id="odd-bg" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#100c15"/><stop offset="1" stop-color="#21101f"/></linearGradient>
|
|
6
|
+
<marker id="odd-arrow" markerUnits="userSpaceOnUse" markerWidth="10" markerHeight="10" viewBox="0 0 10 10" refX="10" refY="5" orient="auto"><path d="M0 0 10 5 0 10z" fill="#f095c8"/></marker>
|
|
7
|
+
</defs>
|
|
8
|
+
<rect width="960" height="760" rx="20" fill="url(#odd-bg)"/>
|
|
9
|
+
<text x="40" y="65" fill="#fff7f1" font-family="Arial, Helvetica, sans-serif" font-size="44" font-weight="700">Explore, track, implement.</text>
|
|
10
|
+
<text x="40" y="120" fill="#d7a0b8" font-family="Arial, Helvetica, sans-serif" font-size="44" font-weight="700">Resume without ceremony.</text>
|
|
11
|
+
<g fill="#1c1420" stroke="#d7a0b8" stroke-width="2">
|
|
12
|
+
<rect x="40" y="170" width="196" height="120" rx="16"/>
|
|
13
|
+
<rect x="268" y="170" width="196" height="120" rx="16"/>
|
|
14
|
+
<rect x="496" y="170" width="196" height="120" rx="16"/>
|
|
15
|
+
<rect x="724" y="170" width="196" height="120" rx="16"/>
|
|
16
|
+
<rect x="724" y="330" width="196" height="120" rx="16" fill="#2a1426" stroke="#f095c8" stroke-width="3"/>
|
|
17
|
+
<rect x="610" y="490" width="196" height="120" rx="16"/>
|
|
18
|
+
<rect x="268" y="490" width="196" height="120" rx="16"/>
|
|
19
|
+
</g>
|
|
20
|
+
<rect x="496" y="330" width="196" height="120" rx="16" fill="#18121b" stroke="#d7a0b8" stroke-width="2" stroke-dasharray="6 6"/>
|
|
21
|
+
<g fill="none" stroke="#f095c8" stroke-width="3" stroke-linecap="round" marker-end="url(#odd-arrow)">
|
|
22
|
+
<path d="M236 230H268"/>
|
|
23
|
+
<path d="M464 230H496"/>
|
|
24
|
+
<path d="M692 230H724"/>
|
|
25
|
+
<path d="M822 290V330"/>
|
|
26
|
+
<path d="M822 290V310H594V330"/>
|
|
27
|
+
<path d="M708 470V490"/>
|
|
28
|
+
<path d="M610 550H464"/>
|
|
29
|
+
</g>
|
|
30
|
+
<g fill="none" stroke="#f095c8" stroke-width="3" stroke-linecap="round">
|
|
31
|
+
<path d="M594 450V470H708"/>
|
|
32
|
+
<path d="M822 450V470H708"/>
|
|
33
|
+
</g>
|
|
34
|
+
<g font-family="Arial, Helvetica, sans-serif" font-size="20" fill="#d7a0b8" opacity="0.85">
|
|
35
|
+
<text x="56" y="198">01</text>
|
|
36
|
+
<text x="284" y="198">02</text>
|
|
37
|
+
<text x="512" y="198">03</text>
|
|
38
|
+
<text x="740" y="198">04</text>
|
|
39
|
+
<text x="740" y="358">05</text>
|
|
40
|
+
<text x="626" y="518">06</text>
|
|
41
|
+
<text x="284" y="518">07</text>
|
|
42
|
+
</g>
|
|
43
|
+
<g font-family="Arial, Helvetica, sans-serif" text-anchor="middle">
|
|
44
|
+
<g fill="#fff7f1" font-size="30" font-weight="700">
|
|
45
|
+
<text x="138" y="222">Authorize</text>
|
|
46
|
+
<text x="366" y="222">Explore</text>
|
|
47
|
+
<text x="594" y="222">Resolve</text>
|
|
48
|
+
<text x="822" y="222">Classify</text>
|
|
49
|
+
<text x="822" y="382">Track</text>
|
|
50
|
+
<text x="594" y="382">Stay light</text>
|
|
51
|
+
<text x="708" y="542">Implement</text>
|
|
52
|
+
<text x="366" y="542">Close</text>
|
|
53
|
+
</g>
|
|
54
|
+
<g fill="#d7a0b8" font-size="22">
|
|
55
|
+
<text x="138" y="262">read-only</text>
|
|
56
|
+
<text x="366" y="262">code and needs</text>
|
|
57
|
+
<text x="594" y="262">uncertainty</text>
|
|
58
|
+
<text x="822" y="262">substantial?</text>
|
|
59
|
+
<text x="822" y="422">one document</text>
|
|
60
|
+
<text x="594" y="422">small work</text>
|
|
61
|
+
<text x="708" y="582">task by task</text>
|
|
62
|
+
<text x="366" y="582">verified proof</text>
|
|
63
|
+
</g>
|
|
64
|
+
</g>
|
|
65
|
+
<g font-family="Arial, Helvetica, sans-serif" font-size="22" fill="#d7a0b8">
|
|
66
|
+
<text x="708" y="302" text-anchor="middle">small</text>
|
|
67
|
+
<text x="838" y="316" text-anchor="start">substantial</text>
|
|
68
|
+
</g>
|
|
69
|
+
<rect x="40" y="650" width="880" height="90" rx="16" fill="#18121b" stroke="#d7a0b8" stroke-width="2" stroke-dasharray="8 7"/>
|
|
70
|
+
<g font-family="Arial, Helvetica, sans-serif" text-anchor="middle">
|
|
71
|
+
<text x="480" y="686" fill="#fff7f1" font-size="34" font-weight="700">Resume where you stopped</text>
|
|
72
|
+
<text x="480" y="722" fill="#d7a0b8" font-size="26">One feature document, mirrored in Engram across sessions.</text>
|
|
73
|
+
</g>
|
|
74
|
+
</svg>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/docs/gentle-shell.md
CHANGED
|
@@ -15,19 +15,28 @@ The [v2.6.0 release](https://github.com/Gentleman-Programming/gentle-pi/releases
|
|
|
15
15
|
- The Agents List and Details views preserve the orchestrator/session hierarchy and completion, abort, and lost-exit history. Parent-child queries and notifications have an explicit handoff path, while model, effort, and usage stay observable per task.
|
|
16
16
|
- Named `/gentle:profiles` atomically route the orchestrator separately from packaged and review roles; see the [technical reference](readme-reference.md#agent-model-profiles) for the profile model.
|
|
17
17
|
|
|
18
|
-
The source checkout currently prepares `gentle-pi` `3.
|
|
18
|
+
The source checkout currently prepares `gentle-pi` `3.4.0` with a package-local Gentle AI `v3.5.0` pin; this is not a claim that `3.4.0` is published.
|
|
19
19
|
|
|
20
20
|
## Shell interactions and runtime behavior
|
|
21
21
|
|
|
22
|
-
Gentle Shell is the Pi workspace experience provided by the `gentle-pi` package. It follows the Gentle themes: one border language,
|
|
22
|
+
Gentle Shell is the Pi workspace experience provided by the `gentle-pi` package. It follows the Gentle themes: one border language, rose for whatever is alive.
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
### Fullscreen layout
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
At 140 columns or wider, fullscreen splits into a live header row over a transcript-and-rail split, both driven by [`lib/shell-sidebar-layout.ts`](../lib/shell-sidebar-layout.ts):
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
```text
|
|
29
|
+
✿ Gentle Shell ⟡ ~/work/gentle-pi main ⟡ gpt-5.5 · medium · team ctx ▰▰▰▰▱▱▱▱ 45% ⟡ $9.49 sub
|
|
30
|
+
```
|
|
29
31
|
|
|
30
|
-
The
|
|
32
|
+
- The header is one row, always visible, and carries only what changes every frame: session identity on the left (brand, cwd, branch, dirty count, model · effort · profile) and the two live counters right-aligned (the context gauge and session cost). It never shows the working/thinking state or extension statuses — those stay in the prompt title and the compact bar. When the terminal is too narrow for everything, segments give way in a fixed order — profile, then effort, then the whole cwd/branch/dirty group — before the counters are touched; below that, only the brand survives, and below that the header renders nothing.
|
|
33
|
+
- The right rail scrolls **Status → Changes → TODO**, each an event-driven card that only repaints when its own state changes: a model switch or a cost tick refreshes the header, not the rail. Every card (sidebar or not) paints the same rose frame — the rounded border in the theme's plain border role, the title in the accent role — the look every `CARD_TONE.INFO` card in Gentle Shell uses (warning/error/success cards keep their own tone colors).
|
|
34
|
+
- The Status card carries only what an explicit event refreshes: Project (cwd, branch, session name, active profile), Changes, and Integrations (other extensions' statuses). Model, effort, context, cost, and the per-model usage table live in the header instead — the header ticks every frame, so duplicating them in a card would just make that card repaint every frame too.
|
|
35
|
+
- Gentle Agents is not part of the rail in any mode: its one card stays above the editor, where it already lived, with fixed right-aligned columns for `model · effort`, tokens, cost, and elapsed, each sized to the widest value among the shown tasks — so the numbers line up vertically even when one row's values are much shorter than another's. A queued task fills only the elapsed column with the word `queued`, leaving the other columns blank rather than overwriting the row.
|
|
36
|
+
- The sidebar reuses its last frame until something it paints changes, so silent frames stay cheap; a per-section cache means one card's changing digest (or the header's) never forces an unrelated card to redraw.
|
|
37
|
+
- Narrow terminals and regular mode keep the compact bottom bar and the above-editor Agents widget, with no header row and no sidebar.
|
|
38
|
+
|
|
39
|
+
Below 140 columns, or in regular mode, the compact bottom bar replaces pi's three-line footer with a single line of segments instead:
|
|
31
40
|
|
|
32
41
|
```text
|
|
33
42
|
✿ gentle shell ⟡ ~/work/gentle-pi main ⟡ gpt-5.5 · medium ⟡ ctx ▰▰▰▰▱▱▱▱ 45% ⟡ $9.49 sub ⟡ MCP: 3 servers enabled Release notes
|
|
@@ -63,6 +72,8 @@ Changes shows **captured write/edit operations from this agent session and its o
|
|
|
63
72
|
- Diffs compare the content observed before the agent's first captured operation with its latest captured result, not with HEAD. Consecutive agent edits combine; an agent revert removes its net change.
|
|
64
73
|
- Edits from your editor or other sessions do not update these captured diffs. If an external or unobserved edit breaks continuity before the next agent operation on the same file, the file is marked **diff unavailable**, rather than mixing ownership.
|
|
65
74
|
- Only worktrees in the coordinating session's Git clone are accepted. Child evidence is accepted only from an owned task with paired successful write/edit events and a matching target.
|
|
75
|
+
- A changed file's worktree is resolved from its own directory upward (`git rev-parse --show-toplevel` starting there, never from an ancestor's cwd), so a repository nested inside another — a project scaffolded inside a personal workspace clone, say — is always attributed to its own, inner repository, never the outer one.
|
|
76
|
+
- When changes span more than one worktree, each tree header shows that root's own branch name, `no commits yet` for an unborn branch, or `detached` only for a real detached HEAD. The label is read from Git's HEAD once per root while the overlay is open (`symbolic-ref` and `rev-parse --verify`); the overlay still never runs `status`, `diff` or a worktree scan on your behalf.
|
|
66
77
|
- **Coverage is deliberately limited to write/edit tools.** Shell commands, custom mutation tools, failed/interrupted outcomes and children without the capture extension provide no attributed diff. A missing row does not mean the repository is clean or that no other changes occurred.
|
|
67
78
|
|
|
68
79
|
### Bounds and session lifetime
|
|
@@ -78,7 +89,7 @@ The separate `session_worktree_register` tool still registers canonical same-clo
|
|
|
78
89
|
`/gentle:changes` or `alt+g` opens the two-pane viewer. Worktrees are accordion groups on the left; selecting a file displays its captured diff on the right.
|
|
79
90
|
|
|
80
91
|
- `j`/`k` or arrows navigate. On a group, Enter, Space or Right expands it; Left returns to its parent or collapses it. `ctrl+j/k` or Page Up/Down scroll the diff; Escape or `q` closes.
|
|
81
|
-
- Fullscreen left-click selects files; mouse wheels scroll the file list and diff independently.
|
|
92
|
+
- Fullscreen left-click selects files; mouse wheels scroll the file list and diff independently. Hovering an unselected row (worktree or file, in either pane's list) paints it in the same shared hover role every clickable surface in the shell uses; it never opens or selects the file, and never overrides the already-selected row's own role.
|
|
82
93
|
- Opening, pressing `r`, and the overlay's refresh cadence consult only the captured session model. They never rescan Git or load the current file contents. Same-line-count edits invalidate the diff preview by content revision.
|
|
83
94
|
- On a file, `o` or Enter opens the actual current file in `$VISUAL` or `$EDITOR`, with its worktree as cwd. Edits made there are external and are not attributed to the agent.
|
|
84
95
|
- `GENTLE_PI_SHELL_CHANGES_KEY` rebinds the shortcut; `off` disables it. `GENTLE_PI_SHELL_CHANGES_POLL_MS` controls only the open overlay's in-memory refresh. `GENTLE_PI_SHELL_CHANGES_WATCH_MS` no longer enables filesystem polling.
|
|
@@ -90,7 +101,7 @@ The separate `session_worktree_register` tool still registers canonical same-clo
|
|
|
90
101
|
|
|
91
102
|
To use `ctrl+p` like OpenCode, rebind Pi's `app.model.cycleForward` in `~/.pi/agent/keybindings.json` (Pi reserves that action, so an extension cannot take `ctrl+p` while it holds it) and set `GENTLE_PI_COMMANDS_KEY=ctrl+p`.
|
|
92
103
|
|
|
93
|
-
Subscription usage shows in the bar after the cost, and `/gentle:usage` opens a panel with one row per window of every provider: the limit name, its meter, its percentage and, when that window reports one, its reset, all on one line. Codex, Claude and NaN all read the same way
|
|
104
|
+
Subscription usage shows in the bar after the cost, and `/gentle:usage` opens a panel with one row per window of every provider: the limit name, its meter, its percentage and, when that window reports one, its reset, all on one line. Codex, Claude and NaN all read the same way. In fullscreen mode, clicking the header's `usage` segment opens this same panel. The panel's own footer hints (`r refresh`, `esc close`) are clickable too, not just keyboard shortcuts, and hovering either one paints it in the shell's shared hover role while a refresh already in flight ignores a repeated click.
|
|
94
105
|
|
|
95
106
|
```text
|
|
96
107
|
✿ gentle shell ⟡ … ⟡ $9.49 sub ⟡ codex 5h ▰▰▰▰▰▱▱▱ 62% · week 31%
|
|
@@ -107,12 +118,26 @@ The panel rows a provider reports its windows with:
|
|
|
107
118
|
- For Codex, usage comes from the same account usage endpoint the Codex CLI reads, using the OAuth token pi already holds. It is fetched at session start, at most every 5 minutes after a turn, and on `r` in the panel. Rate-limit headers on SSE responses are picked up too.
|
|
108
119
|
- For Claude Pro/Max, usage arrives in the rate-limit headers of every response, so the 5h and weekly windows appear after the first turn.
|
|
109
120
|
- For NaN Cloud, usage comes from the quota endpoint the official dashboard reads, with the same API key pi already holds. Each metered model reports one allowance for the billing period, and that window carries no label: the model id names it in the bar and the reset text says what it is in the panel. A model that also reports a rolling window shows that one labeled next to it (`4h`), which today's payload does not send; percentages are tokens used over the allowance, exactly as the dashboard draws them, and the allowance is the full-period cap (`fullCap`) whenever the model reports a positive one, because `cap` alone is the prorated allowance of the period in progress. It is fetched under the same 5-minute rule as Codex, counted per provider so a switch fetches the provider it switched to, refuses redirects so the bearer cannot be replayed to another origin, and keeps no cached copy. The endpoint sits outside NaN's published OpenAPI, so the parser reads it defensively: a model that reports no allowance is skipped, as the dashboard skips it, while a metered model whose usage cannot be read fails the whole read, so a partial payload never replaces a complete snapshot with a cheaper-looking one. A session that already has a snapshot keeps the last valid one through a malformed payload or a failed fetch, and the pending note appears only while there is nothing to draw.
|
|
121
|
+
- Extensions can register a usage source for their own provider: gentle-shell has no built-in knowledge of it, but treats it exactly like Codex or NaN once registered. Emit `gentle-pi:usage-source/v1` on `pi.events` with `{ schema: "gentle-pi.usage-source/v1", provider, pendingNote?, fetch(apiKey, fetchFn, now) }`, where `fetch` resolves a `ProviderUsage` the same shape the built-in providers produce, or `undefined` when there is nothing to show yet. A malformed payload, a `fetch` that isn't a function, a provider id outside the safe id pattern, or a `fetch` call that throws or rejects is ignored rather than crashing the shell. Re-registering the same provider replaces its source, so emitting again at every `session_start` is safe and keeps load order irrelevant. Once registered, the provider shows `pendingNote` (or the same "no usage yet · r to fetch" default the built-ins use) until its first fetch, and a registration that arrives after the session already started, for the provider currently active, triggers one immediate refresh instead of waiting for the next turn or the 5-minute window. Example, using a neutral provider id:
|
|
122
|
+
|
|
123
|
+
```ts
|
|
124
|
+
pi.events.emit("gentle-pi:usage-source/v1", {
|
|
125
|
+
schema: "gentle-pi.usage-source/v1",
|
|
126
|
+
provider: "acme-cloud",
|
|
127
|
+
fetch: async (apiKey, fetchFn, now) => {
|
|
128
|
+
if (!apiKey) return undefined;
|
|
129
|
+
const response = await fetchFn("https://acme.example/usage", { headers: { Authorization: `Bearer ${apiKey}` } });
|
|
130
|
+
if (!response.ok) return undefined;
|
|
131
|
+
return { provider: "acme-cloud", plan: "Acme · 42 credits", limits: [], fetchedAt: now };
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
```
|
|
110
135
|
- The bar names the subscription it shows (`codex`, `claude`, a NaN model) and always follows the active model. A provider with per-model allowances draws the session model's own meter, falling back to its family and then to the account total, never to whichever model the payload happens to list first — and that holds for a payload that reports a single metered model too, because one allowance is still per-model data rather than a reason to echo the first entry. The panel puts the active provider first, marked with the petal, and says why it has no data when it does not: API-key providers have no subscription windows, Claude reports after the first response, Codex and NaN wait for a fetch. A provider without per-model allowances keeps its single aggregate line in the sidebar, unchanged.
|
|
111
136
|
- A provider with per-model allowances is ordered by family on both surfaces: a family stays together, the family that consumes most comes first, and the models inside it follow the same rule, most used first. There are no `total` rows anywhere — an aggregate nobody can act on only costs space — so the account and family totals survive only as the bar's fallback name when the session model holds no allowance of its own (`nan total`). An allowance row leaves the window label empty and prints `name meter percent`, while a labeled sub-window (`4h`) keeps its column, and the reset a window reports rides that same line after a `·`; a window without one ends at its percentage, never on a dangling separator. The sidebar's Usage group prints those same rows in that same order, so the breakdown does not require opening the panel, and stops at the percentage: the reset dates stay in the panel. A row whose windows all round to `0%` is dropped from that group — an allowance nobody has touched yet tells the reader nothing the missing row does not — and the same rule retires the aggregate line of a provider without raw allowances once every window it shows sits at `0%`; the bar and the panel keep printing it, so a zeroed subscription is still verifiable there.
|
|
112
137
|
- Only the plan name and the windows are kept; account details in the payload are discarded.
|
|
113
138
|
- Gauges turn amber at 80% and red at 95%, like the context gauge.
|
|
114
139
|
|
|
115
|
-
Gentle notices are drawn as cards: the same rounded frame as the prompt
|
|
140
|
+
Gentle notices are drawn as cards: the same rounded frame as the prompt. An informational card paints the rounded frame in the theme's plain border role and its title in the accent role — the rose look every sidebar card, the review preflight reminder, and a quiet Agents card share. A warning, error, or success card paints its frame and title in its own tone color instead.
|
|
116
141
|
|
|
117
142
|
```text
|
|
118
143
|
╭─ ✿ Gentle AI · review preflight ─────────────────────────────────────╮
|
|
@@ -125,6 +150,16 @@ Gentle notices are drawn as cards: the same rounded frame as the prompt, with th
|
|
|
125
150
|
- An active dev-binary override shows above the editor at startup, in amber, naming the binary and its digest, and leaves with the first prompt; an invalid override shows in red with the reason.
|
|
126
151
|
- Subagents draw their own card; see Gentle Agents below.
|
|
127
152
|
|
|
153
|
+
### Native interactive tools
|
|
154
|
+
|
|
155
|
+
Gentle Shell ships its own interactive tools instead of depending on third-party extensions; the built-ins replace `npm:pi-subagents-j0k3r` and `npm:@juicesharp/rpiv-todo` (see Gentle Agents and Gentle Todo below for the removal steps).
|
|
156
|
+
|
|
157
|
+
- **`ask_user_question`** — one to four structured questions in a single questionnaire, each with two to four options, multi-select, per-option descriptions and previews — rendered as real TUI dialogs, usable in the live session.
|
|
158
|
+
- **`ask_user_choice`** — one exactly representable single-select question, with an opt-in free-text response.
|
|
159
|
+
- **`todo`** — plan tracking with the Gentle Todo card (see Gentle Todo below).
|
|
160
|
+
- **`gentle_review` / capture tools** — the native review surface for receipt-driven development.
|
|
161
|
+
- **Optional companions** (separately installed, never bundled): `gentle-engram` for persistent memory, `pi-web-access` for web access when a task needs it and your policy allows it, `pi-lens` for additional inspection surfaces, `pi-intercom` for cross-session communication where your Pi setup supports it, and `@juicesharp/rpiv-ask-user-question` for interactive choice support where a separately installed extension fits your setup. These are companions, not hidden prerequisites or a claim that every Pi installation has every capability; persistent memory is **not** bundled with `gentle-pi`.
|
|
162
|
+
|
|
128
163
|
### Gentle Agents
|
|
129
164
|
|
|
130
165
|
The current package requires Pi 0.85.1 or newer (development tests pin 0.85.1). Use the latest Pi release; gentle-pi does not update your installed Pi automatically. Children, including any `GENTLE_PI_AGENTS_PI` override, must emit `agent_settled`: `agent_end` records a run's output but is not completion because retries or queued continuations may follow.
|
|
@@ -135,15 +170,17 @@ Agent paths follow `GENTLE_PI_AGENT_HOME`, then `PI_CODING_AGENT_DIR`, then `~/.
|
|
|
135
170
|
|
|
136
171
|
```text
|
|
137
172
|
╭─ ❀ Agents · 1 active · 1 done ─────────────────────────────── 1m24s ╮
|
|
138
|
-
│ ✓ sdd-explore map footer data sources
|
|
139
|
-
│ ◐ sdd-apply write gentle-shell footer
|
|
140
|
-
|
|
173
|
+
│ ✓ sdd-explore map footer data sources gpt-5.6-terra · 34k · $0.27 · 25s │
|
|
174
|
+
│ ◐ sdd-apply write gentle-shell footer gpt-5.6-terra · 120k · $12.50 · 41s │
|
|
175
|
+
╰──────────────────────────────────────────────────────────────────────────────────╯
|
|
141
176
|
```
|
|
142
177
|
|
|
178
|
+
The card is above the editor in every mode, including fullscreen — it is not one of the sidebar's cards. Each metadata field (`model · effort`, tokens, cost, elapsed) gets its own fixed, right-aligned column sized to the widest value among the shown tasks, so the numbers line up vertically even when one row's values are much shorter than another's; a queued task fills only the elapsed column with the word `queued`, leaving the rest of the row blank rather than overwriting it. When the card is too narrow for every column, it degrades one column at a time and the same way for every row: the task text goes first, then the `model · effort` label, then tokens, then cost; elapsed is the last column standing, since it is the one value the reader cannot rebuild from anything else on screen.
|
|
179
|
+
|
|
143
180
|
Every subagent is its own `pi --mode rpc` child process, so the terminal never runs subagent work: the host reads JSON lines, applies each one as a small delta to a bounded per-task thread, and notifies only the listeners of that task. A task-mode child's question (`ctx.ui.select`, `confirm`, `input`, `editor`) reaches you as an ordinary pi dialog; a background child's question is dismissed. Subagents have no automatic total execution timeout: a long-running child remains live while it continues emitting RPC events. A silent child still times out through the configurable `stall_timeout_ms` watchdog (default four minutes). An announced tool call that is still running is live work, not silence, so it is bounded by `tool_stall_timeout_ms` instead (default 30 minutes, never below `stall_timeout_ms`). Closing pi stops the children that are still running.
|
|
144
181
|
|
|
145
182
|
- `subagent_list_agents`, `subagent_run` (`agent`, `task`, `label?`, `context?`, `workspace_root?`, `mode?` task or background), `subagent_status`, `subagent_result`, `subagent_list_tasks`, `subagent_reply` (one current-session reply to a live child query), `subagent_cancel`, `subagent_send_message` (steer a running child), `subagent_continue` (resume a finished task in its own session).
|
|
146
|
-
- `orchestrator_session_id`, `orchestrator_list`, and `orchestrator_send_message` provide local-profile session notifications. List results advertise IDs only and reachability remains unknown. Sending selects the sole advertised peer or asks the user to choose; a successful ACK means the peer accepted the notification for delivery, not that it read or completed work. This is notification-and-ACK transport only: it has no cross-session queries, offline queue, retries, broadcasts, or read/completion guarantees. On Unix, presence records remain in the profile's private transport directory while socket endpoints use a private, profile-hashed directory below the canonical system temporary directory, keeping endpoint length independent of the profile path and at most 100 encoded bytes. The shared system temporary parent is only validated (current-user-owned without group/other write, or root/current-user-owned, world-writable, and sticky); it is never claimed, permissioned, or cleaned up by gentle-pi. On POSIX, the transport uses private Unix-domain sockets; on Windows, it uses private named pipes scoped by the current account SID. Notification and ACK limits remain bounded across platforms.
|
|
183
|
+
- `orchestrator_session_id`, `orchestrator_list`, and `orchestrator_send_message` provide local-profile session notifications. List results advertise IDs only and reachability remains unknown. Sending selects the sole advertised peer or asks the user to choose; a successful ACK means the peer accepted the notification for delivery, not that it read or completed work. This is notification-and-ACK transport only: it has no cross-session queries, offline queue, retries, broadcasts, or read/completion guarantees. On Unix, presence records remain in the profile's private transport directory while socket endpoints use a private, profile-hashed directory below the canonical system temporary directory, keeping endpoint length independent of the profile path and at most 100 encoded bytes. The shared system temporary parent is only validated (current-user-owned without group/other write, or root/current-user-owned, world-writable, and sticky); it is never claimed, permissioned, or cleaned up by gentle-pi. On POSIX, the transport uses private Unix-domain sockets; on Windows, it uses private named pipes scoped by the current account SID, served by a package-local PowerShell helper (`runtime/windows-session-transport.ps1`): the transport selects that fixed helper, and availability and delivery depend on the helper's bounded startup and pipe checks. Notification and ACK limits remain bounded across platforms.
|
|
147
184
|
- `subagent_run.workspace_root` selects an existing worktree in the session's Git clone. Validation happens before queueing; the child runs at that canonical root. Successful OS spawn registers the root in the originating parent session, including delayed queued launches, even without an active shell listener. Failed spawns do not register. `subagent_continue` retains the previous task's cwd; status and task details expose it.
|
|
148
185
|
- Background work requires a live interactive/RPC parent. Both `subagent_run` and `subagent_continue` reject background mode in `pi -p` before creating or spawning a task: the parent exits before it can receive a later result. Use task mode for bounded print-mode work.
|
|
149
186
|
- A background task's result comes back to the model as a `gentle-agents.result` message, drawn as a rose card, and starts a new turn when the agent is idle; the model never polls.
|
|
@@ -153,10 +190,10 @@ Every subagent is its own `pi --mode rpc` child process, so the terminal never r
|
|
|
153
190
|
- Mouse controls take priority over keyboard hints: **Follow** (`f`), **Open session** (`o`), **Stop** (`s`, legacy `c`, owned active tasks only), and **Scope** (`a`). A compact footer's `>` cycles through actions. Scope switches between this session's direct active children and all open orchestrators, including idle ones. Open writes a markdown transcript for `$EDITOR`, not a resumed child session. `j`/`k` move through lists or scroll an expanded thread; `ctrl+j`/`ctrl+k` and Page Down/Up page the thread. In Pi fullscreen mode, the wheel scrolls the viewport under the pointer; regular terminal mode does not capture mouse input. Below 12 columns or three rows, only a bounded Close cell remains; zero-sized terminals render nothing.
|
|
154
191
|
- The thread displays all retained Text, Thinking, Note, and Tool content without an additional presentation cap; existing store limits and truncation markers still apply. Only the selected task is subscribed while the overlay is open.
|
|
155
192
|
- Thread entries are presented as labeled Text, Thinking, Note, or Tool blocks; tool blocks show their status and nonempty output.
|
|
156
|
-
- Current scope has no orchestrator wrapper
|
|
193
|
+
- Current scope has no orchestrator wrapper. Its own session's finished subagents stay listed as history after the active ones — newest ended first — with their terminal glyph, elapsed frozen at completion, and their thread inspectable; a finished row is never cancellable. The header reads `N active · M finished`. History is capped at 200 finished tasks per session (oldest dropped); resuming a session (`session_start` with reason `resume`) restores that session's own finished tasks from disk automatically, a brand-new session starts empty, and All sessions discovers open Pi instances sharing the same agent profile, even across repositories — it does not infer open sessions from retained tasks and stays presence-only (no cross-session history browsing). Directory headings support left/right and mouse expansion, and cannot stop or open a task. Peer children and their retained threads are read-only: no local stop, editor-open, or continuation routing, and no import into the local task store.
|
|
157
194
|
- Presence refresh is paged while the overlay is open. Graceful shutdown withdraws an instance; after abrupt closure its last heartbeat may remain visible for up to 15 seconds plus the time to complete the next directory refresh. A recent heartbeat is a heuristic, not proof that a process is alive. Same-profile, same-user processes share retained activity text; this is not an authorization channel.
|
|
158
195
|
- `alt+s` confirms stopping the current active or queued subagents owned by the current process. `GENTLE_PI_AGENTS_STOP_KEY` rebinds it; `off` disables it.
|
|
159
|
-
- Finished tasks are written to `~/.pi/agent/gentle-agents/tasks/` (one JSON per task, newest `history_max_tasks` kept, default 200) and come back on demand for `subagent_result` and `subagent_continue
|
|
196
|
+
- Finished tasks are written to `~/.pi/agent/gentle-agents/tasks/` (one JSON per task, newest `history_max_tasks` kept, default 200) and come back on demand for `subagent_result` and `subagent_continue`; an id looked up this way from an unrelated session never enters the overlay or becomes cancellable. Child sessions live under `~/.pi/agent/gentle-agents/sessions/`.
|
|
160
197
|
- `ctrl+shift+a` collapses the card to its first row (`GENTLE_PI_AGENTS_KEY`), `GENTLE_PI_AGENTS_VIEW_KEY` rebinds the overlay, `GENTLE_PI_AGENTS_PI` overrides the pi command used for children, and `GENTLE_PI_AGENTS=0` disables the tools and the card.
|
|
161
198
|
|
|
162
199
|
### Gentle Todo
|