@aeondave/pi-persona 1.17.3 → 1.17.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/AGENTS.md +57 -36
  2. package/CHANGELOG.md +106 -1
  3. package/README.md +32 -16
  4. package/docs/ARCHITECTURE.md +199 -48
  5. package/docs/COLLABORATION.md +110 -0
  6. package/docs/EXPERIENCE.md +33 -8
  7. package/docs/README.md +12 -0
  8. package/docs/REFERENCE.md +65 -14
  9. package/docs/STRATEGIES.md +6 -0
  10. package/package.json +12 -6
  11. package/src/agents/agent.ts +6 -0
  12. package/src/bridge.ts +33 -23
  13. package/src/bus/broker/client.ts +151 -30
  14. package/src/bus/broker/host.ts +130 -11
  15. package/src/bus/broker/messages.ts +35 -5
  16. package/src/bus/contact-transport.ts +8 -0
  17. package/src/bus/contact.ts +118 -40
  18. package/src/bus/peers.ts +23 -6
  19. package/src/bus/result-reader.ts +88 -0
  20. package/src/core/brief.ts +14 -4
  21. package/src/core/capabilities.ts +1 -1
  22. package/src/core/companion.ts +64 -0
  23. package/src/core/leg-thinking.ts +57 -0
  24. package/src/core/ownership.ts +1 -2
  25. package/src/core/pi-compat.ts +5 -12
  26. package/src/core/session-runs.ts +1 -1
  27. package/src/core/types.ts +1 -1
  28. package/src/engine/adapter.ts +100 -20
  29. package/src/engine/async.ts +53 -11
  30. package/src/engine/child.ts +11 -2
  31. package/src/engine/inproc.ts +98 -47
  32. package/src/engine/result-grant.ts +62 -0
  33. package/src/engine/session-tools.ts +6 -0
  34. package/src/engine/stream.ts +6 -0
  35. package/src/engine/worktree.ts +17 -7
  36. package/src/exocom/collaboration-delivery.ts +29 -0
  37. package/src/exocom/collaboration.ts +148 -0
  38. package/src/exocom/envelope.ts +43 -4
  39. package/src/exocom/gate.ts +7 -2
  40. package/src/exocom/install.ts +45 -17
  41. package/src/exocom/ledger.ts +58 -8
  42. package/src/exocom/plane.ts +32 -1
  43. package/src/exocom/profile.ts +40 -0
  44. package/src/exocom/registry.ts +5 -0
  45. package/src/exocom/status.ts +11 -1
  46. package/src/exocom/write-guard.ts +7 -0
  47. package/src/extension/broker-host.ts +61 -9
  48. package/src/extension/companion.ts +38 -0
  49. package/src/extension/engine.ts +40 -29
  50. package/src/extension/hooks.ts +954 -931
  51. package/src/extension/identity.ts +41 -75
  52. package/src/extension/memory-owner.ts +54 -0
  53. package/src/extension/mind-worker.ts +129 -0
  54. package/src/extension/results.ts +138 -0
  55. package/src/extension/shared.ts +17 -0
  56. package/src/extension.ts +2922 -2849
  57. package/src/loader.ts +11 -3
  58. package/src/orchestration/agent-attempt.ts +15 -0
  59. package/src/orchestration/flow-journal.ts +7 -1
  60. package/src/orchestration/flow-run.ts +125 -19
  61. package/src/orchestration/flow.ts +11 -0
  62. package/src/orchestration/roster.ts +71 -23
  63. package/src/orchestration/sdk.ts +61 -19
  64. package/src/orchestration/types.ts +10 -0
  65. package/src/persona/model-participants.ts +20 -7
  66. package/src/persona/orchestrate.ts +6 -7
  67. package/src/persona/persona.ts +1 -1
  68. package/src/results/archive.ts +281 -0
  69. package/src/results/record.ts +166 -0
  70. package/src/results/retrieval.ts +142 -0
  71. package/src/results/types.ts +128 -0
  72. package/src/telemetry/contract.ts +1 -1
  73. package/src/tools/council.ts +40 -23
  74. package/src/tools/delegate-tool.ts +50 -14
  75. package/src/tools/delegate.ts +13 -6
  76. package/src/tools/exocom-collaboration-input.ts +168 -0
  77. package/src/tools/exocom-collaboration.ts +315 -0
  78. package/src/tools/exocom-profile.ts +102 -0
  79. package/src/tools/exocom.ts +20 -3
  80. package/src/tools/flow.ts +24 -8
  81. package/src/tools/intercom-tool.ts +98 -14
  82. package/src/tools/models.ts +15 -0
  83. package/src/tools/monitor.ts +20 -1
  84. package/src/tools/read-result.ts +52 -0
  85. package/src/tools/timer.ts +23 -2
  86. package/src/ui/activity-rows.ts +34 -0
  87. package/src/ui/agent-overlay.ts +23 -13
  88. package/src/ui/agent-tree.ts +67 -6
  89. package/src/ui/literal-tool-result.ts +1 -1
  90. package/src/ui/model-picker.ts +1 -1
  91. package/src/ui/orchestration-launch.ts +49 -0
  92. package/src/ui/session-cards.ts +191 -14
  93. package/src/ui/strategy-leg.ts +40 -0
package/AGENTS.md CHANGED
@@ -37,8 +37,13 @@ the shared behavioral prompt layer: [`docs/SPINE.md`](docs/SPINE.md).
37
37
  `@earendil-works/pi-*`; never bundle copies.
38
38
  - npm publishes as `@aeondave/pi-persona`. Pi supplies the four `@earendil-works/pi-*` packages
39
39
  and `typebox`: keep them as `peerDependencies: "*"` with development-only copies, never runtime
40
- dependencies. The supported host floor is Pi ≥ 1.0.0 (`MIN_PI_VERSION` and the README); Node.js
41
- must be ≥ 22.19 to match that host. Keep the npm
40
+ dependencies. Target the latest stable Pi only (currently 1.4.0, aligned with `MIN_PI_VERSION`,
41
+ the four development pins and README); do not maintain historical-host compatibility branches.
42
+ **No legacy or deferred cleanup:** remove dead code, obsolete options, superseded implementations
43
+ and compatibility-only aliases with their replacement. Update every caller, fixture and document
44
+ in the same change. A completed feature must not leave temporary scaffolding or cleanup debt.
45
+ Keep a path only when it serves the current host/runtime or a demonstrated current data contract.
46
+ Node.js must be ≥ 22.19 to match that host. Keep the npm
42
47
  `files` allowlist explicit for docs/artwork, inspect `npm pack --dry-run`, and never publish drafts.
43
48
  - Supply-chain controls: pin every GitHub Action to a verified full commit SHA; keep top-level
44
49
  token permissions read-only, grant write permissions only to the reporting job that needs them,
@@ -175,7 +180,7 @@ the shared behavioral prompt layer: [`docs/SPINE.md`](docs/SPINE.md).
175
180
  a live, capability-filtered roster (agents, teams and flows, with descriptions and gated flows tagged in
176
181
  headless sessions) + a hand-off default (with one decision-class → method line, checked against the
177
182
  registry) to the system-prompt TAIL every turn — discovery that survives context burn.
178
- - **Sibling peer comm (in-process)**: a strategy can opt a run into direct sibling messaging
183
+ - **Sibling peer comm**: a strategy can opt a run into direct sibling messaging
179
184
  (`AgentRunSpec.peers` — the `debate` strategy does). The child gets a `contact_peer` tool
180
185
  (`bus/peers.ts`): `list`/`send`, ONE-WAY only (blocking stays supervisor-only, so peers can
181
186
  never deadlock), peer list scoped per engine instance (never the whole bus), send budget 20,
@@ -183,7 +188,11 @@ the shared behavioral prompt layer: [`docs/SPINE.md`](docs/SPINE.md).
183
188
  Delivery: the in-process engine's bridge steers incoming bus messages into the child session,
184
189
  fenced with the sender attributed OUTSIDE the fence — the same bridge delivers the supervisor's
185
190
  `intercom send` (previously a dead letter). Gated by `EffectiveCapabilities.canUseBus` (OFF iff
186
- the persona explicitly denies `intercom`). The child engine ignores `peers`.
191
+ the persona explicitly denies `intercom`). Child-process legs use the broker's engine-scoped
192
+ peer roster; `contact_peer` is installed only when that run opts in and the bus is allowed.
193
+ Granted communication tools join a nonempty child tool allowlist; explicit empty lists and
194
+ tool exclusions still win. In-process supervisor contact additionally requires `coaching`;
195
+ broker-connected children expose it when the bus is allowed.
187
196
  Design: [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md#the-comm-plane-in-practice) + [`docs/STRATEGIES.md`](docs/STRATEGIES.md).
188
197
  On the peer plane: `debate` and `pair` always; `map`/`synthesize` opt-in via `params.peers`.
189
198
  `magi`/`judge`/`fanout` stay peer-less BY DESIGN — independence is their bias guard
@@ -191,38 +200,37 @@ the shared behavioral prompt layer: [`docs/SPINE.md`](docs/SPINE.md).
191
200
  this. `compete` runs its competitors with `isolation: worktree` (REQUIRES a clean git repo; missing
192
201
  repo/dirty checkout/worktree failure fails closed and never falls back to the real tree) and returns
193
202
  the winning diff for the SUPERVISOR to apply.
194
- - **exocom** (`src/exocom/*`, `src/tools/exocom*.ts`; opt-in `PI_PERSONA_EXOCOM=1` / `--exocom`,
195
- capability-gated): a plane apart from everything above — those are all INTERNAL to one supervisor's
196
- own run (hierarchical, session-keyed children); exocom is FLAT and EXTERNAL, between independent
197
- top-level pi instances sharing one selected scope, no parent/child relationship. Bare `--exocom`
198
- keeps the current workspace scope; exact `--exocom=Ab0T` joins that existing workspace's scope from
199
- another cwd through a persistent, collision-aware, case-sensitive four-character Base62 alias.
200
- The scope selects registry/transport/ledger/artifacts, while every peer advertises its actual home
201
- workspace id/code/safe label so external file sets are explicit. A foreign peer is advisory for
202
- writes: it can inspect its own files and use postcards/ask/answer/wait/progress/release, but
203
- `exocom_claim` is inactive and rejected because the ledger's paths are repository-relative to the
204
- scope workspace. The code is a same-host/same-agent-dir join reference, not authentication.
205
- Postcards remain one-way and non-blocking: `exocom_list`/`exocom_send`
206
- plus `exocom_name` (a reply is a send with `in_reply_to` set). The separate shared JSONL work
207
- ledger adds `claim`/`ask`/`answer`/`decline`/non-blocking `wait`/`progress`/`release`: overlapping
208
- open write sets NACK atomically, and a pending targeted ask gates that participant to answer/decline,
209
- read-only tools, and `exocom_name` identity metadata. Semantic frames are signed immediate-wake signals; the ledger is authoritative
210
- if delivery is deferred. This is cooperative runtime coordination, not OS authorization. All ten
211
- tools remain in `EXOCOM_TOOL_NAMES` (with `claim` withheld for a foreign member), targeted denies win independently, and joining requires
212
- `canUseBus` plus at least one callable closer (`answer` or `decline`) so a published peer cannot be
213
- wedged by an obligation it has no way to settle. If `exocom_name` is permitted, an unnamed top-level
214
- Pi is prompted to invent a task-derived call-sign on its first user or inbound peer turn
215
- (no catalog or extra model call). Naming is metadata permitted during pending asks, without
216
- settling them; a targeted deny suppresses the prompt. Session identity is shared with standalone
217
- `agent_name` and persisted across resume/persona changes. Until a handle is chosen, its actionable
218
- naming bootstrap is delivered through the `context` hook because custom Exocom wakes can bypass
219
- `before_agent_start`; after selection the hook stays silent. The session-hash suffix of a qualified target survives renames and telemetry resolves the
220
- same canonical session.
221
- Reuses the broker's wire framing
222
- (`bus/broker/framing.ts`) and the
223
- core fence (`fenceUntrusted`/`attributeInbound`) — no new trust-sensitive code path; inbound
224
- attribution is resolved from the registry, never the envelope's self-reported `from_name`.
225
- Design: [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md#exocom--the-external-plane).
203
+ - **Exocom** (`src/exocom/*`, `src/tools/exocom*.ts`; opt-in `PI_PERSONA_EXOCOM=1` / `--exocom`;
204
+ see [the collaboration guide](docs/COLLABORATION.md)): a flat external plane between independent,
205
+ top-level Pi sessions, separate from one supervisor's internal workers. Bare `--exocom` selects the
206
+ current workspace; exact `--exocom=Ab0T` joins that existing scope from another cwd through a
207
+ persistent, case-sensitive four-character Base62 alias. The scope selects registry, transport,
208
+ ledger and artifacts; each member still advertises its actual home workspace. The code is a
209
+ same-host/same-agent-dir join reference, not authentication.
210
+ `EXOCOM_TOOL_NAMES` contains 15 call-time-gated tools: `exocom_list`, `exocom_send`, `exocom_name`,
211
+ `exocom_claim`, `exocom_ask`, `exocom_answer`, `exocom_decline`, `exocom_wait`, `exocom_release`,
212
+ `exocom_progress`, `exocom_status`, `exocom_task`, `exocom_offer`, `exocom_publish`, and
213
+ `exocom_profile`. A joined foreign-workspace peer cannot use `exocom_claim`; write-set task create
214
+ and pickup also require local scope and callable claim permission. Ledger paths are advisory
215
+ coordination, never filesystem authorization.
216
+ `exocom_task create` declares a voluntary task but does not start work or reserve files. The
217
+ immutable `task_id` is the creation frame's `msg_id`; carry it with `work_key` for take, progress,
218
+ finish, offer and publish so a reused work key cannot select another generation. Write-set pickup
219
+ and its claim are one locked ledger transaction; read-only tasks may be taken from a foreign scope.
220
+ An optional `exocom_offer` expires in at most 24 hours (one hour by default) and creates no answer
221
+ obligation. Use `exocom_ask` for an explicit blocking question. `exocom_publish` shares a bounded,
222
+ explicitly written excerpt, not another session's terminal-result archive. Peer prose is fenced and
223
+ attributed using the registry identity.
224
+ Tasks, offers and evidence are each capped at 64 records and 128 KiB aggregate. Terminal or stale
225
+ task facts and expired offers are retained for up to one hour; evidence is retained for up to one
226
+ hour. `exocom_profile` reports self-described capabilities (up to 8 tags, 48 characters each) and
227
+ optional `available`/`busy`/`away` status; absent status is unknown, and profiles confer no access.
228
+ During a pending ask, only settlement, `exocom_name`, status, explicit collaboration reads and
229
+ read-only filesystem tools remain available: profile `get` is allowed, but `set` and `clear` are not.
230
+ Naming remains metadata and does not answer the ask. Joining requires `canUseBus` plus at least one
231
+ callable ask closer (`exocom_answer` or `exocom_decline`) and is rechecked on persona changes.
232
+ Design: [architecture](docs/ARCHITECTURE.md#exocom--the-external-plane) and
233
+ [collaboration guide](docs/COLLABORATION.md).
226
234
 
227
235
  ## Testing
228
236
 
@@ -260,6 +268,19 @@ the shared behavioral prompt layer: [`docs/SPINE.md`](docs/SPINE.md).
260
268
  option (a terminal event is observed before the permission gate). A countdown replaces the stall clock; `x`
261
269
  cancels one via the stop registry; `X`, the `N agents` count and telemetry exclude them.
262
270
 
271
+ - Loaded companions: `core/companion.ts` defines the public local presence, live memory-owner and
272
+ activity contracts; `extension/{companion,memory-owner}.ts` bind them to the current native owner.
273
+ Mind requires a compatible loaded partner, never a settings-file inference. Actual selection is
274
+ authoritative with persistence off; both engines freeze it for delegated legs (private per-child
275
+ factory in-process, spawn-local environment for child processes). `ui/activity-rows.ts` projects
276
+ bounded local Mind work without agent counts, controls, wakes, model usage or agent telemetry.
277
+ Automatic semantic review instead uses `pi-persona:mind-worker:v1`: one real tracked Mind worker,
278
+ with the current session model/effort, no tools/fallback/bus, normal shared concurrency and F9
279
+ controls, a 180s deadline, and a terminal archive. Memory/delegate/target permissions still apply.
280
+ Its completion belongs to Mind; it never wakes the supervisor. See the companion architecture contract.
281
+ These cooperative contracts are not authentication; see the loaded-companion section
282
+ in `docs/ARCHITECTURE.md`.
283
+
263
284
  - `src/core/` — pure kernel: frontmatter, permissions, contract (+`parseContract`), config, discovery, fence (`fenceUntrusted`), brief (`buildDelegationBrief` — the per-turn roster + standing hand-off default; `buildExocomBrief` — the per-turn exocom peer roster, the peer-vs-sub-agent split, and the relevance bound on a peer exchange), timer (`TimerScheduler` — the alarm engine behind the `timer` tool), session-runs (pure restore-notice helper: what a reload/resume lost + the run-id counter), types.
264
285
  - `src/engine/` — `child.ts`, `inproc.ts` (default), `adapter.ts`, `async.ts` (async tracker/peek), `worktree.ts` (git-worktree isolation), `stream.ts` (event→state).
265
286
  - `src/orchestration/` — `sdk.ts` (`agent`/`parallel`/`reduce`), `strategy.ts` (registry), `strategies/*.ts`, `voting.ts`, `flow*.ts` (DAG + JSONL journal + checkpoint gates), `roster.ts` (teams + `rosterSpec`: a roster member is a bare name OR an inline `{ agent, role, model, skills }` that specialises one agent — every strategy runs members through `rosterSpec`).
package/CHANGELOG.md CHANGED
@@ -4,7 +4,112 @@ All notable changes to this project are documented here. The format follows
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this project follows the version scheme
5
5
  used in its [GitHub releases](https://github.com/AeonDave/pi-persona/releases).
6
6
 
7
- ## [Unreleased]
7
+ ## [1.17.5](https://github.com/AeonDave/pi-persona/releases/tag/v1.17.5) - 2026-10-25
8
+
9
+ ### Added
10
+
11
+ - A visible asynchronous Mind maintenance worker, pinned to the current session model and effort.
12
+ It shares normal concurrency, F9 controls and result archival, has no tools or model fallback,
13
+ and returns its completion to Mind without starting another supervisor turn.
14
+ - Loaded-companion presence, live memory ownership and bounded `Mind` activity rows. Mind can
15
+ require the actual loaded Persona partner and follow persona changes even with persistence off;
16
+ both engines freeze that owner for delegated legs. Activity stays separate from agents, controls,
17
+ wakes and model usage. These paired contracts require the updated Mind and Persona together.
18
+
19
+ ### Fixed
20
+
21
+ - Council, MAGI, auxiliary actors and flow legs keep their own model and effort in the live
22
+ tree and F9 when abbreviated roles collide or identical roles use different inline pins.
23
+ Runtime callbacks carry exact attempt identity; retries clear stale observations and terminal
24
+ rows use the engine's observed model. Saved model assignments remain keyed by the full role.
25
+ - Terminal-result capture survives reactivation of the same extension and tracker. Shutdown
26
+ revokes the old archive owner without removing the capture observers or changing their order
27
+ before completion notifications; late results cannot enter another session's archive.
28
+ - Child broker contacts confirm one-way delivery only after admission to the host bus.
29
+ Full inboxes, disconnects, cancellation and missing receipts no longer report `delivered: true`.
30
+ Receipts are bounded and never count as a supervisor answer or authorization.
31
+ Unconfirmed sends and errors after admission no longer claim that the message was dropped;
32
+ the supervisor may already have received it.
33
+ - Reference-flow diagnostics fence worker excerpts even on the defensive missing-reference path.
34
+ - A worker-provided patch remains usable after worktree capture fails, with an explicit warning
35
+ that the patch was not verified against the final worktree state.
36
+
37
+ ## [1.17.4](https://github.com/AeonDave/pi-persona/releases/tag/v1.17.4) - 2026-10-25
38
+
39
+ ### Added
40
+
41
+ - Voluntary Exocom collaboration: generation-bound shared tasks with atomic pickup/write claims,
42
+ expiring optional invitations, bounded attributed evidence publication and self-reported profiles.
43
+ Stale ownership remains visible without automatic takeover; task/evidence reads are paginated.
44
+ See [the collaboration guide](docs/COLLABORATION.md) for the authority and retention contracts.
45
+ - Uniform operator views across every pi-persona surface: tool cards and commands use compact
46
+ purpose lines with shared-literal expansion (monitor, timer, models, read_result, agent_name,
47
+ contact_supervisor, contact_peer); session cards share the delegate-family frame (`Event · datum`
48
+ titles, indented clipped lines, boilerplate-free compact with drift-guarded projections, full
49
+ payload on expansion); the agent tree and F9 overlay show each leg's effort sigla (`mn l m h xh mx`,
50
+ off renders nothing) with honest requested→observed divergence, and delegate launch cards show the
51
+ full effort level next to the model.
52
+ - Audited all operator notifications: bounded and sanitized toasts, single-surface settlement
53
+ announcements (done/stopped announce once via the follow-up card; failures keep their immediate
54
+ durable surface).
55
+ - Installed-tarball qualification harness (`scripts/qualify-package.mjs`): packs and inspects the
56
+ artifact, installs it into isolated temporary hosts, and exercises real delegation, stop and
57
+ shutdown on both engines with a faux provider, network tripwires and empty credential stores.
58
+ Current policy: latest stable Pi only (1.4.0); historical host versions are rejected.
59
+ - Per-leg thinking/effort: a typed `thinking` level on agents, delegate single/batch calls, roster
60
+ and council members, and auxiliary actors. Precedence is explicit leg/member > agent definition >
61
+ the existing configured/inherited child setting; malformed values fail before launch. Both engines
62
+ report requested and observed Pi effort separately (an observation is Pi's requested effort, never
63
+ a claim about provider cognition); the child engine passes a separate `--thinking` argument and the
64
+ model-suffix synthesis is gone.
65
+ - Bounded durable terminal results: settled delegate/council/flow outcomes are saved as versioned
66
+ session entries with immutable `result:<UUID>` references (count/byte budgets, honest truncation
67
+ and storage receipts). `intercom results` lists them and `intercom result { ref, offset, limit }`
68
+ reads pages after reload — read-only: no respawn, no rebilling, no extra wake. The restore notice
69
+ now distinguishes vanished runtime work from retained terminal reports.
70
+
71
+ ### Fixed
72
+
73
+ - Show every council/flow participant's launch model and requested effort, including auxiliary
74
+ judges and repeated roles with distinct inline selections. Persist the receipt for history;
75
+ pending model setup remains explicit. Role hints omit code and technical identifiers rather than
76
+ turning environment-variable names or Git refs into reviewer labels.
77
+ - Treat failed model-availability reads as unavailable rather than advertising the whole catalog.
78
+ Session identity failures remain explicit and cannot reuse a previous owner or synthesize a
79
+ process-based identity; branch recovery restores the persisted name.
80
+ - Admit granted bridge communication tools through Pi 1.4's plain tool allowlist, so a read-only
81
+ worker can still contact its supervisor. Empty grants, explicit exclusions and semantic bus denial
82
+ remain restrictive; sibling contact requires peer opt-in.
83
+ - Refuse incompatible reference-flow journal versions and non-successful archived phases without
84
+ respawning completed work, including unapproved saved checkpoints. Retain truncation provenance
85
+ in resumed previews and final reports.
86
+ - Label compact status usage as cumulative input/output tokens, distinct from context occupancy.
87
+ - Preserve observed model identity after recovery in terminal results and completion views, while
88
+ launch cards retain the original selection. Requested and observed values remain distinguishable.
89
+ - Announce a successful or stopped async run ONCE: the completion follow-up card is the single
90
+ settlement surface (the tree row already settles immediately); the duplicate info toast is gone.
91
+ Failures keep their immediate durable card/sanitized toast.
92
+ - Pin isolated worktree exports to the starting commit, preserving worker commits together with later
93
+ uncommitted changes and new files in the returned patch.
94
+ - Keep unanswered supervisor decisions/interviews unresolved instead of suggesting implicit approval.
95
+ Expose explicit outcomes and suppress bus activity for already-cancelled calls.
96
+
97
+ ### Removed
98
+
99
+ - Remove the `/persona none` alias; use `/persona off` to deactivate the current persona.
100
+ - Remove obsolete host API facades, the CJS-only Pi resolver fallback, unused session/notifier
101
+ options, unemitted identity-message aliases and redundant internal re-exports. Callers and test
102
+ fixtures now use the current Pi contracts directly.
103
+
104
+ ### Changed
105
+
106
+ - Clarify and regression-test `/persona restore`: overwrite all bundled defaults without pruning
107
+ additional custom personas, agents or resources. Settings, credentials and sessions are not reset.
108
+ - Target the latest stable Pi only (currently 1.4.0): development pins, `MIN_PI_VERSION`, docs and
109
+ the package-qualification gate move together, and historical host versions are rejected. A scoped
110
+ development override pins `undici` past known advisories inside the Pi 1.4.0 host dependency tree.
111
+ - Align source SDK smoke checks with the canonical settings store and the current interactive vs
112
+ headless execution contract; settings qualification also rejects historical host versions.
8
113
 
9
114
  ## [1.17.3](https://github.com/AeonDave/pi-persona/tree/v1.17.3) - 2026-10-23
10
115
 
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # pi-persona
2
2
 
3
3
  <p align="center">
4
- <img src="assets/banner.png" alt="pi-persona — supervised multi-agent orchestration for Pi">
4
+ <img src="https://raw.githubusercontent.com/AeonDave/pi-persona/v1.17.5/assets/banner.png" alt="pi-persona — supervised multi-agent orchestration for Pi">
5
5
  </p>
6
6
 
7
7
  [![CI](https://github.com/AeonDave/pi-persona/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/AeonDave/pi-persona/actions/workflows/test.yml) [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/AeonDave/pi-persona/badge)](https://scorecard.dev/viewer/?uri=github.com/AeonDave/pi-persona) [![npm version](https://img.shields.io/npm/v/@aeondave/pi-persona?logo=npm)](https://www.npmjs.com/package/@aeondave/pi-persona) [![License](https://img.shields.io/github/license/AeonDave/pi-persona)](LICENSE)
@@ -17,7 +17,8 @@ you can inspect workers, redirect them, or stop a run while it is in progress.
17
17
 
18
18
  ## Install
19
19
 
20
- Requires **Pi ≥ 1.0.0**, **Node.js ≥ 22.19**, and **Git**. Configure a model provider in Pi first.
20
+ Requires **the latest stable Pi (currently 1.4.0)**, **Node.js ≥ 22.19**, and **Git**.
21
+ Update Pi together with this plugin; historical Pi releases are not maintained. Configure a model provider in Pi first.
21
22
 
22
23
  Run in your terminal:
23
24
 
@@ -39,9 +40,9 @@ your customizations.
39
40
  | Install option | Command |
40
41
  |---|---|
41
42
  | This project only | `pi install -l npm:@aeondave/pi-persona` |
42
- | Pin this release | `pi install npm:@aeondave/pi-persona@1.17.3` |
43
+ | Pin this release | `pi install npm:@aeondave/pi-persona@1.17.5` |
43
44
  | Update an unpinned install | `pi update npm:@aeondave/pi-persona` |
44
- | Git tag 1.17.3 | `pi install git:github.com/AeonDave/pi-persona@v1.17.3` |
45
+ | Git tag 1.17.5 | `pi install git:github.com/AeonDave/pi-persona@v1.17.5` |
45
46
 
46
47
  Restart Pi after updating. For a pinned install, install the new version or tag explicitly.
47
48
  If switching from a Git install, remove that source first with
@@ -52,7 +53,8 @@ then install the npm package. Keep only one source configured to avoid loading t
52
53
 
53
54
  | Capability | What you get |
54
55
  |---|---|
55
- | **Async workers** | Specialists with their own roles, skills, and models; results return while the supervisor continues other work |
56
+ | **Async workers** | Specialists with their own roles, skills, models, and thinking levels; results return while the supervisor continues other work |
57
+ | **Retained results** | Bounded reports remain available after reload and can be read in pages without restarting workers |
56
58
  | **Live steering** | Inspect a worker, send guidance, or stop a run from the agent panel |
57
59
  | **Cross-session collaboration** | Exocom connects independent Pi sessions to exchange findings and coordinate work |
58
60
  | **Councils and flows** | Compare perspectives, run repair-and-check loops, or organize work into stages |
@@ -119,8 +121,9 @@ To enable Exocom, open two terminals in the same workspace and start each with:
119
121
  pi --exocom --persona dev
120
122
  ```
121
123
 
122
- Then ask one session to consult the other or agree who handles which files.
123
- Use `/exocom` to inspect the connection and workspace code.
124
+ Use `/exocom` to inspect the connection and workspace code. Sessions can exchange one-way messages,
125
+ record a voluntary task, or share a bounded evidence excerpt. Creating a task does not start work in
126
+ the other session; a peer chooses whether to take it.
124
127
 
125
128
  A session in another workspace can join using that exact, case-sensitive code:
126
129
 
@@ -129,10 +132,11 @@ pi --exocom=Ab0T --persona researcher
129
132
  ```
130
133
 
131
134
  Replace `Ab0T` with the code shown by `/exocom`. Both sessions must run on the same machine and
132
- share a Pi agent directory. A peer joining from another workspace can advise and exchange results;
133
- it cannot claim files in the joined workspace.
135
+ share a Pi agent directory. A peer joining from another workspace can advise, exchange results, and
136
+ take read-only tasks; it cannot claim or take tasks that declare write paths in the joined workspace.
134
137
 
135
- See the [collaboration guide](docs/EXPERIENCE.md#work-with-another-pi-through-exocom) for day-to-day use.
138
+ See the [cross-session collaboration guide](docs/COLLABORATION.md) for the task, invitation, ask and
139
+ evidence workflows.
136
140
 
137
141
  ## Choose a persona
138
142
 
@@ -170,10 +174,11 @@ See [the reference](docs/REFERENCE.md) for an inline council example and recover
170
174
  Edit installed personas and agents in `~/.pi/agent/persona/agents/`, or add project-specific
171
175
  overrides in `.pi/agents/`. Run `/persona reload` after editing.
172
176
 
173
- `/persona seed` preserves existing files. **`/persona restore` replaces bundled defaults**, so use it
174
- only when you intend to discard customizations to those files.
175
-
176
- For optional long-term memory, add [pi-persona-mind](https://github.com/AeonDave/pi-persona-mind).
177
+ `/persona seed` preserves existing files. **`/persona restore` overwrites all bundled defaults**
178
+ (personas, agents, teams, flows, contracts, presets and shared prompts), discarding customizations
179
+ to those files. It does not delete additional custom files: a persona `pippo.md` or an agent
180
+ `pluto.md` remains untouched. A custom file using the same destination as a bundled default is
181
+ replaced. Settings, credentials, sessions and project-local overrides are not reset.
177
182
 
178
183
  `/persona-settings` is separate from Pi's `/settings`: it edits pi-persona preferences and saved
179
184
  persona model assignments, not native Pi or compaction settings. In the TUI, `/` filters settings,
@@ -181,11 +186,20 @@ persona model assignments, not native Pi or compaction settings. In the TUI, `/`
181
186
  changes apply after restarting Pi or Pi's native `/reload`, not `/new`; `/persona reload` only
182
187
  refreshes persona definitions. Model changes apply to future runs. See [configuration and settings](docs/REFERENCE.md#configuration-and-data).
183
188
 
189
+ ## Optional memory companion
190
+
191
+ [pi-persona-mind 0.8.4](https://github.com/AeonDave/pi-persona-mind/releases/tag/v0.8.4) adds durable
192
+ project/persona memory, session notes and a visible automatic consolidation worker. It requires
193
+ pi-persona 1.17.5 or later. Install it with `pi install npm:@aeondave/pi-persona-mind`, then restart
194
+ Pi or run `/reload`. See its [README](https://github.com/AeonDave/pi-persona-mind#readme) for scope,
195
+ automatic-review limits and undo.
196
+
184
197
  ## Documentation
185
198
 
186
199
  | Guide | What's inside |
187
200
  |---|---|
188
201
  | [Everyday use](docs/EXPERIENCE.md) | Choosing a persona, following work, and reading results |
202
+ | [Cross-session collaboration](docs/COLLABORATION.md) | Voluntary tasks, optional offers, asks, evidence and presence between Pi sessions |
189
203
  | [Customization reference](docs/REFERENCE.md) | Tool APIs, configuration, and copyable recipes |
190
204
  | [Strategies](docs/STRATEGIES.md) | Teams, councils, flows, and orchestration options |
191
205
  | [Timers and monitors](docs/MONITORS.md) | Reminders and programs that wake the supervisor |
@@ -205,8 +219,10 @@ npm test
205
219
  ```
206
220
 
207
221
  Pi loads the TypeScript extension directly; there is no build step.
208
- To qualify a separately installed Pi 1.3.0 host without cloud calls or your profile, run
209
- `node --import tsx scripts/qualify-host.mjs <absolute-path-to-pi-coding-agent-package>`.
222
+ Qualify the installed tarball on the current host without provider traffic or your profile with
223
+ `node scripts/qualify-package.mjs --host <absolute-path-to-pi-coding-agent-package>`.
224
+ The narrower source-SDK contract check is
225
+ `node --import tsx scripts/qualify-host.mjs <absolute-path-to-pi-coding-agent-package>`; both reject historical host versions.
210
226
  The [CI workflow](https://github.com/AeonDave/pi-persona/actions/workflows/test.yml) runs strict
211
227
  typechecking, dependency auditing and the test suite on Linux and Windows. The OpenSSF badge links to the project's
212
228
  scored supply-chain checks; it is not a certification that the code is free of vulnerabilities.