pi-ui-extend 1.0.41 → 1.0.42
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 +10 -2
- package/dist/app/app.d.ts +3 -0
- package/dist/app/app.js +26 -0
- package/dist/app/commands/command-host.d.ts +1 -0
- package/dist/app/commands/command-model-actions.js +6 -1
- package/dist/app/commands/command-registry.js +1 -1
- package/dist/app/commands/command-session-actions.js +9 -3
- package/dist/app/commands/reload-context-inventory.d.ts +11 -0
- package/dist/app/commands/reload-context-inventory.js +59 -0
- package/dist/app/extensions/extension-actions-controller.d.ts +1 -0
- package/dist/app/extensions/extension-actions-controller.js +6 -0
- package/dist/app/extensions/subagent-catalog-state.d.ts +9 -0
- package/dist/app/extensions/subagent-catalog-state.js +23 -0
- package/dist/app/rendering/editor-panels.js +10 -4
- package/dist/app/session/session-lifecycle-controller.d.ts +1 -0
- package/dist/app/session/session-lifecycle-controller.js +6 -0
- package/dist/app/session/tabs-controller.d.ts +1 -0
- package/dist/app/session/tabs-controller.js +19 -1
- package/dist/app/subagents/subagents-files.js +60 -1
- package/dist/app/subagents/subagents-model.d.ts +1 -0
- package/dist/app/subagents/subagents-model.js +18 -2
- package/dist/app/types.d.ts +5 -0
- package/dist/default-pix-config.js +10 -0
- package/dist/schemas/index.d.ts +1 -0
- package/dist/schemas/index.js +1 -0
- package/dist/schemas/pi-tools-suite-schema.d.ts +80 -58
- package/dist/schemas/pi-tools-suite-schema.js +43 -78
- package/dist/schemas/pix-schema.d.ts +7 -0
- package/dist/schemas/pix-schema.js +14 -0
- package/dist/schemas/tasks-schema.d.ts +18 -0
- package/dist/schemas/tasks-schema.js +41 -0
- package/docs/concurrency.md +6 -0
- package/docs/desktop-mvp.md +12 -1
- package/docs/desktop-task-manager.md +93 -82
- package/external/pi-tools-suite/README.md +37 -50
- package/external/pi-tools-suite/docs/browser-qa-subagent.md +19 -0
- package/external/pi-tools-suite/docs/evals.md +1 -1
- package/external/pi-tools-suite/docs/session-recovery.md +40 -14
- package/external/pi-tools-suite/docs/subagent-model-pools.md +38 -27
- package/external/pi-tools-suite/src/async-subagents/agents/frontier-review.md +23 -0
- package/external/pi-tools-suite/src/async-subagents/agents/presets.jsonc +16 -0
- package/external/pi-tools-suite/src/async-subagents/agents/research.md +5 -3
- package/external/pi-tools-suite/src/async-subagents/commands.ts +14 -70
- package/external/pi-tools-suite/src/async-subagents/core/activity.ts +33 -0
- package/external/pi-tools-suite/src/async-subagents/core/agent-catalog.ts +5 -4
- package/external/pi-tools-suite/src/async-subagents/core/agent-strategy.ts +1 -1
- package/external/pi-tools-suite/src/async-subagents/core/agents-dir.ts +8 -3
- package/external/pi-tools-suite/src/async-subagents/core/config.ts +122 -312
- package/external/pi-tools-suite/src/async-subagents/core/routing.ts +15 -2
- package/external/pi-tools-suite/src/async-subagents/core/spawn.ts +6 -2
- package/external/pi-tools-suite/src/async-subagents/core/state.ts +40 -0
- package/external/pi-tools-suite/src/async-subagents/core/types.ts +7 -0
- package/external/pi-tools-suite/src/async-subagents/index.ts +69 -5
- package/external/pi-tools-suite/src/async-subagents/lib.ts +7 -8
- package/external/pi-tools-suite/src/async-subagents/tools/spawn.ts +8 -4
- package/external/pi-tools-suite/src/async-subagents/tools/subagents.ts +3 -2
- package/external/pi-tools-suite/src/async-subagents/types.ts +1 -0
- package/external/pi-tools-suite/src/config.ts +41 -1
- package/external/pi-tools-suite/src/context-gateway/config.ts +11 -2
- package/external/pi-tools-suite/src/context-gateway/enforcement.ts +102 -0
- package/external/pi-tools-suite/src/context-gateway/index.ts +73 -19
- package/external/pi-tools-suite/src/context-gateway/storeless-capabilities.ts +3 -3
- package/external/pi-tools-suite/src/context-gateway/telemetry.ts +101 -28
- package/external/pi-tools-suite/src/context-gateway/types.ts +9 -3
- package/external/pi-tools-suite/src/context-inventory.ts +99 -0
- package/external/pi-tools-suite/src/dcp/auto-compress.ts +96 -44
- package/external/pi-tools-suite/src/dcp/commands.ts +18 -0
- package/external/pi-tools-suite/src/dcp/compress-tool.ts +170 -45
- package/external/pi-tools-suite/src/dcp/compression-blocks.ts +6 -58
- package/external/pi-tools-suite/src/dcp/compression-preview.ts +9 -0
- package/external/pi-tools-suite/src/dcp/config.ts +56 -13
- package/external/pi-tools-suite/src/dcp/prompts.ts +83 -192
- package/external/pi-tools-suite/src/dcp/protected-continuity.ts +175 -0
- package/external/pi-tools-suite/src/dcp/pruner-candidates.ts +1 -1
- package/external/pi-tools-suite/src/dcp/pruner-message-ids.ts +6 -10
- package/external/pi-tools-suite/src/dcp/pruner-tools.ts +6 -3
- package/external/pi-tools-suite/src/default-pi-tools-suite-config.ts +13 -9
- package/external/pi-tools-suite/src/index.ts +7 -1
- package/external/pi-tools-suite/src/resource-registry/index.ts +2290 -0
- package/external/pi-tools-suite/src/shell-command-policy.ts +219 -0
- package/external/pi-tools-suite/src/tool-descriptions.ts +3 -4
- package/package.json +4 -2
- package/schemas/pi-tools-suite.json +427 -280
- package/schemas/pix.json +24 -0
- package/schemas/tasks.json +132 -0
- package/skills/spec-wiki/SKILL.md +55 -0
- package/skills/spec-wiki/evals/evals.json +132 -0
- package/skills/spec-wiki/evals/files/bootstrap/architecture/rfc-007.md +14 -0
- package/skills/spec-wiki/evals/files/bootstrap/docs/how-to-pay.md +4 -0
- package/skills/spec-wiki/evals/files/bootstrap/docs/overview.md +9 -0
- package/skills/spec-wiki/evals/files/bootstrap/requirements/payment-behavior.md +17 -0
- package/skills/spec-wiki/evals/files/bootstrap/src/payments.ts +12 -0
- package/skills/spec-wiki/evals/files/bootstrap/tests/payments.test.ts +11 -0
- package/skills/spec-wiki/evals/files/focused/src/session.ts +5 -0
- package/skills/spec-wiki/evals/files/focused/tests/session.test.ts +17 -0
- package/skills/spec-wiki/evals/files/maintenance/low-signal/incoming/capture.txt +2 -0
- package/skills/spec-wiki/evals/files/maintenance/low-signal/src/capture.ts +3 -0
- package/skills/spec-wiki/evals/files/maintenance/move/docs/old-job-contract.md +18 -0
- package/skills/spec-wiki/evals/files/maintenance/move/src/job.ts +5 -0
- package/skills/spec-wiki/evals/files/maintenance/new-relation/docs/session-refresh.md +24 -0
- package/skills/spec-wiki/evals/files/maintenance/new-relation/incoming/refresh-worker.ts +7 -0
- package/skills/spec-wiki/evals/files/maintenance/new-relation/src/session.ts +7 -0
- package/skills/spec-wiki/evals/files/maintenance/no-impact/docs/auth-contract.md +17 -0
- package/skills/spec-wiki/evals/files/maintenance/no-impact/incoming/telemetry-format.ts +3 -0
- package/skills/spec-wiki/evals/files/maintenance/no-impact/src/auth.ts +3 -0
- package/skills/spec-wiki/evals/files/query/docs/how-to-run-jobs.md +4 -0
- package/skills/spec-wiki/evals/files/query/docs/spec-overview.md +9 -0
- package/skills/spec-wiki/evals/files/query/features/jobs/cancellation-contract.md +15 -0
- package/skills/spec-wiki/evals/files/query/features/jobs/retry-spec.md +6 -0
- package/skills/spec-wiki/evals/maintenance_regression.py +311 -0
- package/skills/spec-wiki/evals/retrieval-eval.md +37 -0
- package/skills/spec-wiki/evals/retrieval-evals.json +37 -0
- package/skills/spec-wiki/evals/trigger-evals.json +94 -0
- package/skills/spec-wiki/references/bootstrap.md +100 -0
- package/skills/spec-wiki/references/focused-spec.md +117 -0
- package/skills/spec-wiki/references/index-schema.md +330 -0
- package/skills/spec-wiki/references/maintenance.md +134 -0
- package/skills/spec-wiki/references/query.md +74 -0
- package/skills/spec-wiki/scripts/spec_wiki.py +2076 -0
- package/docs/desktop-markdown-media.md +0 -77
- package/external/pi-tools-suite/docs/dcp-emergency-current-turn.md +0 -102
- package/external/pi-tools-suite/src/async-subagents/async-subagents.sample.jsonc +0 -54
- package/external/pi-tools-suite/src/skill-installer/index.ts +0 -333
- package/skills/spec-lite/SKILL.md +0 -140
|
@@ -2,123 +2,134 @@
|
|
|
2
2
|
|
|
3
3
|
## Type
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
As-is
|
|
6
|
+
|
|
7
|
+
## Lifecycle
|
|
8
|
+
|
|
9
|
+
Active current contract.
|
|
6
10
|
|
|
7
11
|
## Goal
|
|
8
12
|
|
|
9
|
-
|
|
10
|
-
|
|
13
|
+
Provide a project-scoped task list in Pix Desktop and let a saved task start or
|
|
14
|
+
reopen work in a Desktop session without conflating project tasks with the
|
|
15
|
+
agent's session-local todo list.
|
|
11
16
|
|
|
12
17
|
## Scope
|
|
13
18
|
|
|
14
19
|
- A collapsible, resizable left sidebar with `Tasks` and `Project` tabs.
|
|
15
|
-
-
|
|
16
|
-
|
|
17
|
-
- Task type (`bug`, `feature`, `improvement`)
|
|
18
|
-
`in-progress`, `done`)
|
|
19
|
-
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
-
|
|
20
|
+
- Create, edit, delete, manual status changes, drag reordering, and moving tasks
|
|
21
|
+
between type groups.
|
|
22
|
+
- Task type (`bug`, `feature`, `improvement`) and status (`backlog`, `todo`,
|
|
23
|
+
`in-progress`, `done`).
|
|
24
|
+
- Persisted priority (`low`, `medium`, `high`, `urgent`). New tasks currently
|
|
25
|
+
receive `medium`; priority is not exposed by the current task editor or rows.
|
|
26
|
+
- Project-local persistence in `.pi/tasks.jsonc` with a versioned schema.
|
|
27
|
+
- One-time migration from the legacy strict-JSON `.pi/tasks.json` file.
|
|
28
|
+
- Starting an unlinked task in a new ACP session and reopening an already-linked
|
|
29
|
+
session instead of creating a duplicate.
|
|
30
|
+
- Task descriptions can contain attachment markers; those attachments are
|
|
31
|
+
resolved when the task prompt is built.
|
|
23
32
|
|
|
24
33
|
## Non-goals
|
|
25
34
|
|
|
26
|
-
- Kanban
|
|
27
|
-
|
|
35
|
+
- Kanban columns, subtasks, dependencies, assignees, due dates, comments, or
|
|
36
|
+
task history.
|
|
37
|
+
- Task filtering controls in the current sidebar UI.
|
|
38
|
+
- Editing or displaying priority in the current sidebar UI.
|
|
28
39
|
- Automatic transition to `done` when an agent turn finishes.
|
|
29
|
-
- Synchronizing
|
|
40
|
+
- Synchronizing `.pi/tasks.jsonc` with the agent's session-local todo list.
|
|
30
41
|
- Concurrent multi-window file merging.
|
|
31
42
|
|
|
32
43
|
## Behavior
|
|
33
44
|
|
|
34
|
-
1. The sidebar
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
6.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
45
|
+
1. The sidebar starts on `Tasks`, remembers its width/collapsed state locally,
|
|
46
|
+
and keeps a compact tab rail available while collapsed.
|
|
47
|
+
2. Tasks are grouped by type. Dragging a task reorders it; dropping it into a
|
|
48
|
+
different group also changes its type and updates `updatedAt`.
|
|
49
|
+
3. Task rows show title, status, session/run action, edit, and delete controls.
|
|
50
|
+
Status uses icon, text, and color rather than color alone.
|
|
51
|
+
4. Creating a task requires a non-empty title, starts with status `todo` and
|
|
52
|
+
priority `medium`, and may include description text and attachments.
|
|
53
|
+
5. Editing changes title, description, and type. Status is changed separately.
|
|
54
|
+
Existing persisted priority is preserved.
|
|
55
|
+
6. `.pi/tasks.jsonc` is authoritative. Missing `.pi`/task storage produces an
|
|
56
|
+
empty version-1 document. JSONC comments and trailing commas are accepted.
|
|
57
|
+
7. If `.pi/tasks.jsonc` is absent and legacy `.pi/tasks.json` exists, Pix reads
|
|
58
|
+
and validates the legacy document, adds the schema reference when absent,
|
|
59
|
+
writes `.pi/tasks.jsonc`, deletes the legacy file, and returns the migrated
|
|
60
|
+
document. If JSONC already exists, it wins and the legacy file is ignored.
|
|
61
|
+
8. Starting an unlinked task creates/selects a new ACP session, persists its
|
|
62
|
+
session id, changes any non-`done` task to `in-progress`, preserves `done`,
|
|
63
|
+
appends the generated task prompt, and sends it immediately.
|
|
64
|
+
9. Starting a linked task opens that session. A stale/missing linked session is
|
|
65
|
+
a recoverable error and does not silently create another session.
|
|
66
|
+
10. Task completion remains manual.
|
|
50
67
|
|
|
51
68
|
## Contracts
|
|
52
69
|
|
|
53
|
-
- Project file: `.pi/tasks.
|
|
54
|
-
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
70
|
+
- Project file: `.pi/tasks.jsonc`.
|
|
71
|
+
- Document shape: optional `$schema`, `version: 1`, and `tasks`.
|
|
72
|
+
- Each task has a unique id, title, type, status, priority, `createdAt`, and
|
|
73
|
+
`updatedAt`; description and `sessionId` are optional.
|
|
74
|
+
- Unknown fields, duplicate ids, unsupported enum values, empty titles,
|
|
75
|
+
malformed timestamps, unsupported versions, and oversized documents are
|
|
76
|
+
rejected.
|
|
77
|
+
- The Tauri backend confines task paths to the active workspace, rejects escape
|
|
78
|
+
through `.pi` symlinks, and caps the document at 1 MB.
|
|
79
|
+
- Writes validate the complete document, write a same-directory temporary file,
|
|
80
|
+
and replace the target to avoid partial JSONC files.
|
|
60
81
|
|
|
61
82
|
## Invariants
|
|
62
83
|
|
|
63
|
-
-
|
|
64
|
-
-
|
|
65
|
-
|
|
66
|
-
-
|
|
67
|
-
|
|
68
|
-
-
|
|
69
|
-
persisted.
|
|
84
|
+
- Failed validation never replaces the task file.
|
|
85
|
+
- Failed persistence restores the previous in-memory task document.
|
|
86
|
+
- A task is linked to at most one session.
|
|
87
|
+
- Running/reordering/editing is disabled while conflicting task/session work is
|
|
88
|
+
active.
|
|
89
|
+
- Dragging between groups changes only ordering/type; other task fields survive.
|
|
70
90
|
|
|
71
91
|
## Edge cases
|
|
72
92
|
|
|
73
|
-
- Switching workspaces discards the previous
|
|
74
|
-
|
|
75
|
-
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
-
|
|
79
|
-
|
|
93
|
+
- Switching workspaces discards the previous in-memory task view and loads the
|
|
94
|
+
new project's task document.
|
|
95
|
+
- Missing storage means no tasks; malformed or empty JSON/JSONC is an error.
|
|
96
|
+
- A legacy task file is migrated at most once because successful migration
|
|
97
|
+
removes `.pi/tasks.json`.
|
|
98
|
+
- Save, session creation, attachment preparation, and prompt failures remain
|
|
99
|
+
visible and retryable.
|
|
80
100
|
|
|
81
101
|
## Related files
|
|
82
102
|
|
|
83
103
|
- `desktop/src/App.svelte`
|
|
84
|
-
- `desktop/src/components
|
|
85
|
-
- `desktop/src/lib
|
|
86
|
-
- `desktop/src/
|
|
104
|
+
- `desktop/src/components/WorkspaceSidebar.svelte`
|
|
105
|
+
- `desktop/src/lib/project-tasks.ts`
|
|
106
|
+
- `desktop/src/lib/project-tasks.test.ts`
|
|
87
107
|
- `desktop/src-tauri/src/lib.rs`
|
|
108
|
+
- `src/schemas/tasks-schema.ts`
|
|
88
109
|
|
|
89
110
|
## Verification
|
|
90
111
|
|
|
91
|
-
-
|
|
92
|
-
|
|
93
|
-
- Rust tests
|
|
94
|
-
|
|
95
|
-
- `npm --prefix desktop run check
|
|
96
|
-
|
|
97
|
-
- `cargo test --manifest-path desktop/src-tauri/Cargo.toml`
|
|
112
|
+
- `desktop/src/lib/project-tasks.test.ts` covers parsing, prompt generation, and
|
|
113
|
+
drag/reorder semantics.
|
|
114
|
+
- Rust tests in `desktop/src-tauri/src/lib.rs` cover missing/read/write/malformed
|
|
115
|
+
JSONC, validation, workspace confinement, and legacy JSON migration.
|
|
116
|
+
- Run `npm --prefix desktop test`, `npm --prefix desktop run check`, and
|
|
117
|
+
`cargo test --manifest-path desktop/src-tauri/Cargo.toml`.
|
|
98
118
|
|
|
99
119
|
## Risks / unknowns
|
|
100
120
|
|
|
101
|
-
- Whole-document writes assume one active
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
121
|
+
- Whole-document writes assume one active writer per project; multi-window merge
|
|
122
|
+
semantics remain out of scope.
|
|
123
|
+
- A linked session can be removed outside Pix Desktop and remains linked until
|
|
124
|
+
the user repairs or edits the task.
|
|
125
|
+
- Priority remains part of the persisted schema although the current UI does not
|
|
126
|
+
expose priority editing.
|
|
106
127
|
|
|
107
128
|
## Evidence
|
|
108
129
|
|
|
109
|
-
- Confirmed by code: desktop
|
|
110
|
-
|
|
111
|
-
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
- Confirmed by docs: `DESIGN.md` specifies a compact persistent sidebar,
|
|
116
|
-
semantic theme roles, Lucide icons, and non-color status cues.
|
|
117
|
-
- Implemented: `.pi/tasks.json` now has an explicit version-1 contract and
|
|
118
|
-
rejects unsupported versions rather than guessing a migration.
|
|
119
|
-
- Verified by tests: all 82 desktop Vitest tests and all 8 Rust tests pass;
|
|
120
|
-
Svelte/TypeScript checks report no errors or warnings.
|
|
121
|
-
- Verified visually: browser QA covered clean preference state, resize/collapse,
|
|
122
|
-
tabs, filters, and semantic colors in light/dark themes.
|
|
123
|
-
- Verified natively: actual Tauri UI/backend CRUD, Run, persisted linkage,
|
|
124
|
-
Open session without duplication, and delete cleanup all passed.
|
|
130
|
+
- Confirmed by code: `desktop/src/App.svelte`,
|
|
131
|
+
`desktop/src/components/WorkspaceSidebar.svelte`, and
|
|
132
|
+
`desktop/src/lib/project-tasks.ts` implement the current task lifecycle.
|
|
133
|
+
- Confirmed by code: `desktop/src-tauri/src/lib.rs` owns JSONC persistence,
|
|
134
|
+
validation, confinement, atomic replacement, and legacy migration.
|
|
135
|
+
- Confirmed by tests: project-task unit tests and Tauri task persistence tests.
|
|
@@ -7,7 +7,7 @@ This package keeps shared Pi tools as ordinary source folders under `src/` and r
|
|
|
7
7
|
- `src/coding-discipline` — injects a deduplicated silent-mode and quality-discipline block at the very top of the main-session per-turn system prompt for GLM main-session models only (`isGlmModel`) immediately before the LLM request; text-only GLM models get the `lookup` bridge while vision-capable `zai/glm-5.3-flash` inspects images directly; non-GLM models are left untouched; disabled for async sub-agents
|
|
8
8
|
- `src/credential-firewall` — opt-in secret firewall for high-confidence outbound/session credential redaction; disabled by default
|
|
9
9
|
- `src/ast-grep` — `ast_grep` / `ast_apply`
|
|
10
|
-
- `src/async-subagents` — `subagents` tool and sub-agent slash commands, including oh-my-openagent-style `/ultrawork` (`/ulw`) and `/hyperplan` orchestration prompts
|
|
10
|
+
- `src/async-subagents` — `subagents` tool and sub-agent slash commands, including oh-my-openagent-style `/ultrawork` (`/ulw`) and `/hyperplan` orchestration prompts; agent roles are Markdown files under `src/async-subagents/agents/*.md` plus project `.pi/agents/*.md`, while `/subagent-preset` selects model-pool presets from the bundled/project `agents/presets.jsonc`; includes the `oracle` profile for strong second opinions; enforces a 30-minute per-agent execution timeout, project-wide concurrency queueing, optional per-agent retry/backoff, and `result.json` structured metadata/chaining fields next to raw `result.md`; stores project-local run files and a registry under `.pi/subagents/` so result/status collection can recover after compaction or reload while the main session remains alive
|
|
11
11
|
- `src/lsp` — shared LSP diagnostics hook/library that enriches mutating tool results with diagnostics and shuts down language servers on session shutdown
|
|
12
12
|
- `src/comment-checker` — AI-slop comment guard that listens to the `tool_result` event for `write` / `edit` / `apply_patch` mutations, extracts net-new code comment lines, classifies them (filler phrasing, restating code, decorative separators, generic paraphrasing, or — under aggressive strictness — any non-valuable comment), and appends a short nudge to the tool result so the agent removes unnecessary comments on its next turn; TODO/FIXME, license headers, docstrings, pragmas, linter directives, shebangs, and decorators are never flagged; language-agnostic across `//` / `/* */` / `#` / `--` / `<!-- -->` / triple-quote comment styles; per-session deduplication (at most one nudge per 30 s) prevents fix/remark loops; configured via the `commentChecker` section (`enabled`, `strictness`: `conservative` | `balanced` | `aggressive`, default `balanced`) or `PI_COMMENT_CHECKER_ENABLED` / `PI_COMMENT_CHECKER_STRICTNESS`
|
|
13
13
|
- `src/session-name` — `session_name` tool for reading or setting the current session title directly from tool calls, without relying on slash-command parsing
|
|
@@ -21,11 +21,11 @@ This package keeps shared Pi tools as ordinary source folders under `src/` and r
|
|
|
21
21
|
- `src/web-search` — `web_search` and `web_fetch` tools migrated from `@ollama/pi-web-search`; uses local Ollama by default or the official Ollama cloud API when an API key is configured, supports Tavily Search/Extract fallback, provides `/web-credentials` for secure user-level key storage, honors `OLLAMA_HOST`, supports request timeouts via `timeout_ms` / `PI_WEB_SEARCH_TIMEOUT_MS`, and reports provider-specific errors
|
|
22
22
|
- `src/dcp` — headless Dynamic Context Pruning ported from `opencode-dynamic-context-pruning` for the Pi SDK: explicit `compress` tool with range and message modes, `/dcp` commands (context, stats, sweep, manual, decompress, recompress, compress), same-call overlap validation, recoverable compressed-block rollups, grouped message-mode skip diagnostics, stable raw-message anchors when available, protected user/tool preservation, deduplication, error purging, and context nudges; visualization is left to `compress` tool responses and the renderer-owned context-percent click dialog
|
|
23
23
|
- `src/prompt-commands` — user slash-command builder: `/prompt-commands` opens a CRUD menu for saved prompt-backed slash commands, stores them under `promptCommands` in `~/.config/pi/pi-tools-suite.jsonc`, reloads after edits, and runs each saved prompt as a normal user message
|
|
24
|
-
- `src/
|
|
24
|
+
- `src/resource-registry` — `/registry` manages one private Git registry with global reusable `skills/` and `agents/` plus project-scoped `projects/<project-key>/tasks.jsonc`, `projects/<project-key>/plans/`, and `projects/<project-key>/TODO.md`; skills install into `.pi/skills/<name>/`, agents into `.pi/agents/<name>.md`, while `push tasks|plans|todo|project` and `pull tasks|plans|todo|project` synchronize `.pi/tasks.jsonc`, `.pi/plans/`, and `.pi/TODO.md` only for the current project; the project key is normally derived from Git `origin` (SSH and HTTPS forms normalize to the same key) and can be overridden per project with `/registry project-key <key>` in `.pi/pi-tools-suite.jsonc`; `status` fetches and groups skills, agents, tasks, plans, and TODO by state (up to date, updates, conflicts, local-only, remote-only, and so on) using `.pi/registry.json` provenance; reusable `install`, `update`, `push`, remote-only `remove`, and local-only `uninstall` support TUI flows and bulk `all` forms, `delete`/`rm` alias remote `remove`, `remove-local`/`local-remove` alias `uninstall`, destructive bulk operations require interactive confirmation, and every successful skill/agent mutation reloads resources once; `/registry configure <git-url> [branch]` stores the registry remote in the user config; Git authentication is delegated to the user's normal Git/SSH credential setup and the local clone is only a disposable cache
|
|
25
25
|
|
|
26
26
|
`index.ts` is intentionally only a thin auto-discovery shim that re-exports `src/index.ts`. There is no `pi.extensions` manifest here, so local Pi auto-discovery loads the suite once via `~/.pi/agent/extensions/pi-tools-suite/index.ts` and does not double-register tools.
|
|
27
27
|
|
|
28
|
-
Registration order is preserved in `src/index.ts`: coding-discipline, ast-grep, async-subagents, lsp, comment-checker, session-name, session-recovery, repo-discovery command/tool gate, antigravity-auth provider, OpenCode import, todo, model-tools, usage, web-search, dcp, prompt-commands,
|
|
28
|
+
Registration order is preserved in `src/index.ts`: coding-discipline, ast-grep, async-subagents, lsp, comment-checker, session-name, session-recovery, repo-discovery command/tool gate, antigravity-auth provider, OpenCode import, todo, model-tools, usage, web-search, dcp, prompt-commands, resource-registry, credential-firewall, then codex-reasoning-fix. Tool metadata and active model-specific tool sets have two modes: standard and repo-aware. When `.indexer-cli` enables `repo_*`, those tools stay active ahead of overlapping lower-level aliases so the indexed discovery surface has priority.
|
|
29
29
|
|
|
30
30
|
## Session recovery
|
|
31
31
|
|
|
@@ -523,7 +523,7 @@ AGENTS.md before approving anything; cite file paths first.
|
|
|
523
523
|
- Frontmatter keys: `name` (must match the filename), `description`, `icon`, `models`, `thinking`, `tools`, `isolatedSkills`, `extraArgs`, `promptAppend`, `promptOverride`, `retry`, `maxResultBytes`, `timeoutMs`. Legacy `model`, `fallbackModels`, and `modelByParent` still load. Unknown keys are rejected with an error naming the file.
|
|
524
524
|
- Array fields accept block lists (`- item`), inline arrays (`[a, b]`), or comma-separated strings (`tools: read, grep, bash`). The frontmatter YAML subset is intentionally small: scalars, quoted strings, numbers, comments, lists, and nested maps for `modelByParent`/`retry`. Tabs, block scalars (`|`/`>`), anchors/aliases, and flow maps are hard errors naming file and line.
|
|
525
525
|
- The markdown body becomes `promptAppend`: it is appended after the standard generated prompt (parent objective + task + output format), so the agent still receives its task in the usual structure. Use frontmatter `promptOverride` for full prompt replacement.
|
|
526
|
-
- Precedence:
|
|
526
|
+
- Precedence: bundled Markdown defines the built-ins, then the nearest project `.pi/agents/*.md` file overrides the same-named built-in field-by-field. Markdown is the only source of agent role/profile definitions. The removed `asyncSubagents` section and old standalone config-path variables are not read.
|
|
527
527
|
- Files without frontmatter are skipped (a `README.md` there is fine). Definition loading is uncached: edits apply on the next config read/spawn without a restart, and the effective system-prompt catalog is rebuilt at parent-agent start.
|
|
528
528
|
- Bundled roles use the same format internally under `src/async-subagents/agents/*.md`; built-in and project-local profiles therefore share one parser and normalization path instead of maintaining a second role-description schema in TypeScript.
|
|
529
529
|
- `icon` names an agent glyph for UIs that render sub-agent widgets (pix TUI panel, Pix Desktop subagents panel): `agent` (neutral default), `search`, `code`, `flask`, `globe`, `sparkles`, `brain`, `wrench`, `terminal`, `bug`, `book`, `eye`, `zap`, `rocket`. The value is passed through opaquely; unknown names render as the neutral agent icon, and status stays color-coded next to it.
|
|
@@ -546,9 +546,9 @@ and skill flags in `extraArgs` cannot bypass that isolation. Explicitly
|
|
|
546
546
|
configured `isolatedSkills` remain supported as optional additions; no built-in
|
|
547
547
|
QA `--skill` is injected. Other roles retain their normal discovery behavior.
|
|
548
548
|
|
|
549
|
-
Model/thinking/tool-only
|
|
550
|
-
|
|
551
|
-
field-level merge rules; custom QA instructions must preserve the runner-only,
|
|
549
|
+
Model/thinking/tool-only overrides in a project `browser-qa.md` inherit the
|
|
550
|
+
bundled Markdown workflow. A project Markdown body replaces the inherited
|
|
551
|
+
`promptAppend` under the usual field-level merge rules; custom QA instructions must preserve the runner-only,
|
|
552
552
|
credential, target, and evidence contracts. Runner-enforced isolation and
|
|
553
553
|
credential handling remain in code, not in the prompt.
|
|
554
554
|
|
|
@@ -621,7 +621,7 @@ so screenshots and assertions remain state-focused.
|
|
|
621
621
|
|
|
622
622
|
Async-subagents also injects a lightweight oh-my-openagent-style system-prompt strategy by model: non-GPT parents get `parallel-first`, an orchestration-first hint that favors ultrawork/subagents for broad work, while GPT-like parents get `deep-work`, a direct deep-worker hint that uses subagents only when clearly useful. Explicit custom system prompts (`--system-prompt`, `SYSTEM.md`, custom templates) are respected and skip this injection by default. Disable it with `PI_AGENT_STRATEGY=off`; force a strategy with `PI_AGENT_STRATEGY=parallel-first` or `PI_AGENT_STRATEGY=deep-work`; set `PI_AGENT_STRATEGY_WITH_CUSTOM_PROMPT=1` to append it even when a custom prompt is present.
|
|
623
623
|
|
|
624
|
-
For blind-model screenshot/image inspection, use the main-session `coding-discipline` lookup tool; the bundled default uses vision-capable `zai/glm-5.3-flash`. Async-subagents still supports `imagePaths` on tasks when a broader delegated track genuinely needs images, but it no longer ships a dedicated `vision` role.
|
|
624
|
+
For blind-model screenshot/image inspection, use the main-session `coding-discipline` lookup tool; the bundled default uses vision-capable `zai/glm-5.3-flash`. Async-subagents still supports `imagePaths` on tasks when a broader delegated track genuinely needs images, but it no longer ships a dedicated `vision` role. Provider image metadata is supplemented by an internal compatibility list for known blind models so the parent does not falsely claim visual access; this is runtime capability policy, not agent configuration.
|
|
625
625
|
|
|
626
626
|
When `subagentType` is omitted, the lightweight role router classifies the task
|
|
627
627
|
using the descriptions. Explicit types bypass it. Unknown types or failed
|
|
@@ -653,39 +653,28 @@ Explicit task/CLI model overrides and `FORCE_CURRENT_MODEL` remain deliberate
|
|
|
653
653
|
escape hatches and disable automatic model fallback for that task. They do not
|
|
654
654
|
bypass the image-capability check.
|
|
655
655
|
|
|
656
|
-
|
|
657
|
-
|
|
656
|
+
Bundled pools live in `src/async-subagents/agents/presets.jsonc`. Add or override
|
|
657
|
+
project pools in the nearest `.pi/agents/presets.jsonc`. Select a saved pool
|
|
658
|
+
with `/subagent-preset`; use `AGENTS_PRESET=<name>` or
|
|
658
659
|
`/subagent-preset session <name>` for a process-only override and
|
|
659
660
|
`/subagent-preset session-clear` to remove it. The saved selection lives in
|
|
660
|
-
`~/.pi/agent/subagent-preset-selection.json`. `/subagent-preset
|
|
661
|
-
|
|
661
|
+
`~/.pi/agent/subagent-preset-selection.json`. `/subagent-preset path` shows the
|
|
662
|
+
bundled and project preset paths. The shipped pools are `cheap` (GLM), `gpt`,
|
|
662
663
|
and `deep` (the retained legacy name for the mixed pool, not worker escalation).
|
|
663
|
-
|
|
664
|
-
|
|
664
|
+
Agent descriptions, instructions, model order, thinking, tools, retry, and
|
|
665
|
+
timeouts remain in agent Markdown; selecting a pool never changes them.
|
|
665
666
|
|
|
666
|
-
Example
|
|
667
|
+
Example project `.pi/agents/presets.jsonc`:
|
|
667
668
|
|
|
668
669
|
```jsonc
|
|
669
670
|
{
|
|
670
|
-
"
|
|
671
|
-
"
|
|
672
|
-
"
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
"presets": {
|
|
678
|
-
"cheap": {
|
|
679
|
-
"description": "GLM workers with a strong oracle candidate.",
|
|
680
|
-
"models": ["zai/glm-5-turbo", "zai/glm-5.3-flash", "zai/glm-5.3"]
|
|
681
|
-
}
|
|
682
|
-
},
|
|
683
|
-
"types": {
|
|
684
|
-
"research": {
|
|
685
|
-
"models": ["zai/glm-5-turbo", "openai-codex/gpt-5.6-luna"],
|
|
686
|
-
"thinking": "low"
|
|
687
|
-
}
|
|
688
|
-
}
|
|
671
|
+
"cheap": {
|
|
672
|
+
"description": "GLM workers with a strong oracle candidate.",
|
|
673
|
+
"models": ["zai/glm-5-turbo", "zai/glm-5.3-flash", "zai/glm-5.3"]
|
|
674
|
+
},
|
|
675
|
+
"project-gpt": {
|
|
676
|
+
"description": "GPT models approved for this project.",
|
|
677
|
+
"models": ["openai-codex/gpt-5.6-luna", "openai-codex/gpt-5.6-terra"]
|
|
689
678
|
}
|
|
690
679
|
}
|
|
691
680
|
```
|
|
@@ -694,21 +683,19 @@ Example shared async-subagents config section:
|
|
|
694
683
|
|
|
695
684
|
Old built-in role names are no longer implicit aliases. `quick`, `scan`,
|
|
696
685
|
`review`, `deep`, `docs`, `frontend`, and `tests` are valid only when explicitly
|
|
697
|
-
defined as ordinary
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
Runtime retry structures and the separate role router continue to use the
|
|
711
|
-
term `fallbackModels` for actual fallback-only lists, not agent candidates.
|
|
686
|
+
defined as ordinary project `.pi/agents/<name>.md` files.
|
|
687
|
+
|
|
688
|
+
Within an agent Markdown file, legacy `model` plus `fallbackModels` and
|
|
689
|
+
`modelByParent` remain readable. `models` is a complete replacement list: it
|
|
690
|
+
clears inherited legacy model/fallback/parent routing. New built-ins use ordered
|
|
691
|
+
`models` lists and contain no parent-tier escalation maps.
|
|
692
|
+
|
|
693
|
+
The removed `asyncSubagents` section is not part of the public schema or generated
|
|
694
|
+
user config and is no longer read at runtime. Existing files can remain on disk
|
|
695
|
+
without being rewritten, but they have no effect: migrate role definitions to
|
|
696
|
+
`.pi/agents/*.md` and custom model pools to `.pi/agents/presets.jsonc`. Runtime
|
|
697
|
+
retry structures and the separate role router continue to use the term
|
|
698
|
+
`fallbackModels` for actual fallback-only lists, not agent candidates.
|
|
712
699
|
|
|
713
700
|
Sub-agents run with `--no-session` by default to avoid writing duplicate Pi session JSONL files for fire-and-forget background work. Set `ASYNC_SUBAGENTS_ENABLE_SESSIONS=1` to restore persisted per-agent sessions under each agent's `sessions/` directory; this also registers the session-navigation slash commands (`/sub-open`, `/sub-back`, `/sub-where`) needed for switching and deeper post-mortem navigation.
|
|
714
701
|
|
|
@@ -716,7 +703,7 @@ Sub-agent runs are stored in the current project's `.pi/subagents/` directory wh
|
|
|
716
703
|
|
|
717
704
|
Runtime logs are minimized by default: successful agents do not keep `events.jsonl`, and `stderr.log` is discarded unless the agent fails. Set `ASYNC_SUBAGENTS_DEBUG_LOGS=1` / `PI_SUBAGENTS_DEBUG_LOGS=1` to keep diagnostic logs for successful agents too; debug event logs store a compact RPC event summary instead of the full streaming transcript. Defaults are 0 bytes for `events.jsonl` without debug, 32 MiB for debug `events.jsonl`, 8 MiB for retained `stderr.log`, and 8 MiB for a single RPC JSON line; override with `ASYNC_SUBAGENTS_MAX_EVENTS_BYTES` / `PI_SUBAGENTS_MAX_EVENTS_BYTES`, `ASYNC_SUBAGENTS_MAX_STDERR_BYTES` / `PI_SUBAGENTS_MAX_STDERR_BYTES`, and `ASYNC_SUBAGENTS_MAX_RPC_LINE_CHARS` / `PI_SUBAGENTS_MAX_RPC_LINE_CHARS`.
|
|
718
705
|
|
|
719
|
-
|
|
706
|
+
Runtime concurrency defaults to 5 agents per project and the global result summary bound defaults to 100000 bytes. These are internal engine defaults rather than normal user configuration. Per-agent `retry`, `maxResultBytes`, and `timeoutMs` belong in agent Markdown; spawn calls and individual task objects can pass `timeoutSeconds` to shorten the watchdog for synthetic tests or bounded probes. Stop requests mark running, queued planned, and retry-pending agents as `stopped` so queued work is not launched later. Completed agents write `result.json` with status/duration/model/retry metadata plus best-effort `summary`, `findings`, `files`, `risks`, `nextActions`, and `confidence` fields for parent-agent chaining.
|
|
720
707
|
|
|
721
708
|
## OpenCode credential import
|
|
722
709
|
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Browser QA sub-agent specification
|
|
2
2
|
|
|
3
|
+
## Type
|
|
4
|
+
|
|
5
|
+
As-is
|
|
6
|
+
|
|
7
|
+
## Lifecycle
|
|
8
|
+
|
|
9
|
+
Active implemented contract.
|
|
10
|
+
|
|
3
11
|
## Goal
|
|
4
12
|
|
|
5
13
|
Provide a cheap, fast `browser-qa` async-subagent that reproduces browser bugs
|
|
@@ -129,6 +137,17 @@ confirmed runtime image support.
|
|
|
129
137
|
failure the runner snapshots and kills only its own descendants before it
|
|
130
138
|
exits, covering that detached browser tree without touching a user's browser.
|
|
131
139
|
|
|
140
|
+
## Related files
|
|
141
|
+
|
|
142
|
+
- `external/pi-tools-suite/src/async-subagents/agents/browser-qa.md`
|
|
143
|
+
- `external/pi-tools-suite/src/async-subagents/core/browser-qa.ts`
|
|
144
|
+
- `external/pi-tools-suite/src/async-subagents/core/spawn.ts`
|
|
145
|
+
- `external/pi-tools-suite/src/async-subagents/agents/browser-qa/scripts/browser-qa-runner.mjs`
|
|
146
|
+
- `external/pi-tools-suite/test/async-subagents/core.test.ts`
|
|
147
|
+
- `external/pi-tools-suite/test/async-subagents/browser-qa-runner.test.ts`
|
|
148
|
+
- `external/pi-tools-suite/test/async-subagents/browser-qa-runner.e2e.test.ts`
|
|
149
|
+
- `external/pi-tools-suite/test/async-subagents/selection-e2e.test.ts`
|
|
150
|
+
|
|
132
151
|
## Acceptance criteria
|
|
133
152
|
|
|
134
153
|
1. `browser-qa` resolves to the intended model/fallback and its inline Markdown
|
|
@@ -137,7 +137,7 @@ The current extension registry covers all 19 modules:
|
|
|
137
137
|
| `web-search` | web-search tests | deterministic only |
|
|
138
138
|
| `dcp` | DCP prompt/pruning/state tests | existing prompt evals |
|
|
139
139
|
| `prompt-commands` | eval extension contracts | deterministic only |
|
|
140
|
-
| `
|
|
140
|
+
| `resource-registry` | resource-registry integration + eval extension contracts | deterministic only |
|
|
141
141
|
| `credential-firewall` | firewall tests | deterministic only |
|
|
142
142
|
| `codex-reasoning-fix` | reasoning-fix tests | deterministic only |
|
|
143
143
|
|
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
Status: implemented MVP contract (semantic search is intentionally deferred).
|
|
4
4
|
|
|
5
|
+
## Type
|
|
6
|
+
|
|
7
|
+
As-is
|
|
8
|
+
|
|
9
|
+
## Lifecycle
|
|
10
|
+
|
|
11
|
+
Active implemented contract.
|
|
12
|
+
|
|
5
13
|
## Goal
|
|
6
14
|
|
|
7
15
|
Let an agent recover the task, recent instructions, file activity, and useful raw
|
|
@@ -28,19 +36,29 @@ active model context by compaction remains discoverable.
|
|
|
28
36
|
|
|
29
37
|
A section starts at the first selected entry, a user message, a compaction, or a
|
|
30
38
|
branch summary. Its stable ID is derived from the start entry ID. The overview
|
|
31
|
-
reports bounded
|
|
32
|
-
role/tool/error/file statistics.
|
|
39
|
+
reports bounded section pages with entry ranges, counts, and compact
|
|
40
|
+
role/tool/error/file statistics. When more sections exist it returns an opaque
|
|
41
|
+
`nextCursor`; continuing with that cursor resumes after the last delivered
|
|
42
|
+
section. Labels are previews, not inferred decisions.
|
|
33
43
|
|
|
34
44
|
### Reading and search
|
|
35
45
|
|
|
36
|
-
`session_read_section`
|
|
37
|
-
|
|
46
|
+
`session_read_section` accepts either a section ID produced for the same scope or
|
|
47
|
+
one exact raw `entry_id`. Direct entry reads avoid scanning from the start of a
|
|
48
|
+
section and are useful when overview/search already identified the exact entry.
|
|
49
|
+
Without a continuation cursor, callers must pass exactly one of `section_id` or
|
|
50
|
+
`entry_id`.
|
|
51
|
+
|
|
52
|
+
The reader renders message roles/text, tool calls/arguments, tool results,
|
|
38
53
|
compaction summaries, and branch summaries with per-entry and total output
|
|
39
|
-
limits.
|
|
54
|
+
limits. Long entry bodies and multi-entry pages return an opaque `nextCursor`;
|
|
55
|
+
passing that cursor continues at the exact entry/body offset and must use the
|
|
56
|
+
same scope.
|
|
40
57
|
|
|
41
58
|
`session_search` is case-insensitive by default and searches message text, tool
|
|
42
59
|
arguments/results, custom-message content, and compaction or branch summaries.
|
|
43
|
-
It returns entry and section IDs plus bounded snippets.
|
|
60
|
+
It returns entry and section IDs plus bounded snippets. Search pages use an
|
|
61
|
+
opaque cursor bound to scope, query, and case-sensitivity. Regex and semantic
|
|
44
62
|
search are out of scope for the MVP.
|
|
45
63
|
|
|
46
64
|
### Recovery context
|
|
@@ -60,6 +78,8 @@ tools are not guessed to be mutations.
|
|
|
60
78
|
|
|
61
79
|
- Results use small defaults and hard caps for result count, entry body size,
|
|
62
80
|
and total text size.
|
|
81
|
+
- Overview, read, and search pagination use opaque validated cursors; a cursor
|
|
82
|
+
from another scope/query or a stale section is rejected rather than guessed.
|
|
63
83
|
- Empty or in-memory sessions return a normal explanatory result.
|
|
64
84
|
- Unknown or partially shaped entries are ignored or rendered conservatively.
|
|
65
85
|
- Concurrent sibling tool results might not yet be visible when recovery runs.
|
|
@@ -68,17 +88,23 @@ tools are not guessed to be mutations.
|
|
|
68
88
|
- Parent-session metadata is reported when Pi exposes it; parent files are not
|
|
69
89
|
traversed.
|
|
70
90
|
|
|
91
|
+
## Related files
|
|
92
|
+
|
|
93
|
+
- `external/pi-tools-suite/src/session-recovery/index.ts`
|
|
94
|
+
- `external/pi-tools-suite/src/tool-descriptions.ts`
|
|
95
|
+
- `external/pi-tools-suite/test/session-recovery.test.ts`
|
|
96
|
+
|
|
71
97
|
## Verification
|
|
72
98
|
|
|
73
99
|
Deterministic tests cover active versus all branches, raw pre-compaction search,
|
|
74
|
-
stable section IDs,
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
100
|
+
stable section IDs, overview/search pagination, direct late-entry reads,
|
|
101
|
+
continued long bodies, Unicode case-insensitive search, bounded output, empty
|
|
102
|
+
sessions, DCP-control filtering, current-call exclusion, recent errors, file
|
|
103
|
+
carry-forward details, and conservative handling of unknown entries. Release
|
|
104
|
+
verification runs the suite typecheck/tests/smoke gate and host checks.
|
|
79
105
|
|
|
80
106
|
## Evidence
|
|
81
107
|
|
|
82
|
-
Evidence is recorded by
|
|
83
|
-
`test/session-recovery.test.ts` and the
|
|
84
|
-
|
|
108
|
+
Evidence is recorded by
|
|
109
|
+
`external/pi-tools-suite/test/session-recovery.test.ts` and the implementation
|
|
110
|
+
in `external/pi-tools-suite/src/session-recovery/index.ts`.
|