pi-ui-extend 1.0.42 → 1.0.45
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 +41 -12
- package/dist/app/app.d.ts +10 -0
- package/dist/app/app.js +132 -8
- package/dist/app/cli/install.js +2 -2
- package/dist/app/commands/command-controller.d.ts +4 -0
- package/dist/app/commands/command-controller.js +11 -0
- package/dist/app/commands/command-git-actions.d.ts +25 -0
- package/dist/app/commands/command-git-actions.js +381 -0
- package/dist/app/commands/command-host.d.ts +3 -0
- package/dist/app/commands/command-host.js +5 -2
- package/dist/app/commands/command-model-actions.d.ts +1 -0
- package/dist/app/commands/command-model-actions.js +51 -34
- package/dist/app/commands/command-navigation-actions.d.ts +1 -0
- package/dist/app/commands/command-navigation-actions.js +16 -3
- package/dist/app/commands/command-registry.d.ts +2 -0
- package/dist/app/commands/command-registry.js +14 -0
- package/dist/app/commands/reload-context-inventory.js +12 -1
- package/dist/app/input/autocomplete-controller.js +61 -34
- package/dist/app/input/input-action-controller.d.ts +2 -0
- package/dist/app/input/input-action-controller.js +8 -1
- package/dist/app/input/input-controller.d.ts +2 -1
- package/dist/app/input/input-controller.js +7 -2
- package/dist/app/input/prompt-enhancer-controller.js +53 -35
- package/dist/app/input/voice-controller.d.ts +41 -45
- package/dist/app/input/voice-controller.js +351 -419
- package/dist/app/model/model-usage-controller.js +17 -7
- package/dist/app/model/model-usage-status.d.ts +4 -1
- package/dist/app/model/model-usage-status.js +270 -46
- package/dist/app/popup/menu-items-controller.d.ts +13 -3
- package/dist/app/popup/menu-items-controller.js +37 -21
- package/dist/app/popup/popup-action-controller.d.ts +12 -2
- package/dist/app/popup/popup-action-controller.js +77 -24
- package/dist/app/popup/popup-menu-controller.d.ts +36 -14
- package/dist/app/popup/popup-menu-controller.js +239 -69
- package/dist/app/rendering/dcp-stats.d.ts +9 -4
- package/dist/app/rendering/dcp-stats.js +40 -425
- package/dist/app/rendering/popup-menu-renderer.d.ts +3 -5
- package/dist/app/rendering/popup-menu-renderer.js +42 -37
- package/dist/app/rendering/render-controller.js +23 -2
- package/dist/app/rendering/status-line-renderer.d.ts +5 -0
- package/dist/app/rendering/status-line-renderer.js +41 -5
- package/dist/app/rendering/tab-line-renderer.js +26 -20
- package/dist/app/runtime.d.ts +12 -1
- package/dist/app/runtime.js +120 -12
- package/dist/app/screen/mouse-controller.d.ts +2 -0
- package/dist/app/screen/mouse-controller.js +17 -7
- package/dist/app/screen/status-controller.d.ts +4 -0
- package/dist/app/screen/status-controller.js +5 -0
- package/dist/app/session/lazy-session-manager.js +34 -0
- package/dist/app/session/session-event-controller.d.ts +1 -0
- package/dist/app/session/session-event-controller.js +10 -1
- package/dist/app/session/session-history.d.ts +1 -0
- package/dist/app/session/session-history.js +12 -1
- package/dist/app/session/session-lifecycle-controller.d.ts +6 -1
- package/dist/app/session/session-lifecycle-controller.js +10 -1
- package/dist/app/session/tabs-controller.d.ts +25 -1
- package/dist/app/session/tabs-controller.js +442 -153
- package/dist/app/subagents/subagents-widget-controller.d.ts +1 -0
- package/dist/app/subagents/subagents-widget-controller.js +6 -0
- package/dist/app/types.d.ts +11 -1
- package/dist/app/workspace/workspace-actions-controller.js +10 -2
- package/dist/app/workspace/workspace-undo.d.ts +1 -0
- package/dist/app/workspace/workspace-undo.js +1 -0
- package/dist/bundled-extensions/question/index.js +9 -1
- package/dist/bundled-extensions/question/remote.d.ts +4 -0
- package/dist/bundled-extensions/question/remote.js +33 -0
- package/dist/bundled-extensions/telegram-connector/bot.d.ts +43 -0
- package/dist/bundled-extensions/telegram-connector/bot.js +166 -0
- package/dist/bundled-extensions/telegram-connector/config.d.ts +8 -0
- package/dist/bundled-extensions/telegram-connector/config.js +87 -0
- package/dist/bundled-extensions/telegram-connector/coordinator.d.ts +66 -0
- package/dist/bundled-extensions/telegram-connector/coordinator.js +413 -0
- package/dist/bundled-extensions/telegram-connector/index.d.ts +3 -0
- package/dist/bundled-extensions/telegram-connector/index.js +195 -0
- package/dist/bundled-extensions/terminal-bell/index.d.ts +0 -8
- package/dist/bundled-extensions/terminal-bell/index.js +0 -76
- package/dist/bundled-extensions/workspace-undo/index.d.ts +26 -0
- package/dist/bundled-extensions/workspace-undo/index.js +191 -0
- package/dist/config.d.ts +21 -2
- package/dist/config.js +159 -32
- package/dist/default-pix-config.js +20 -10
- package/dist/schemas/pi-tools-suite-schema.d.ts +8 -4
- package/dist/schemas/pi-tools-suite-schema.js +11 -5
- package/dist/schemas/pix-schema.d.ts +12 -2
- package/dist/schemas/pix-schema.js +37 -9
- package/dist/schemas/tasks-schema.js +1 -1
- package/docs/concurrency.md +3 -1
- package/docs/desktop-mvp.md +10 -5
- package/docs/desktop-task-manager.md +81 -28
- package/docs/release.md +30 -6
- package/external/pi-tools-suite/README.md +165 -39
- package/external/pi-tools-suite/docs/session-recovery.md +7 -0
- package/external/pi-tools-suite/docs/subagent-model-pools.md +12 -5
- package/external/pi-tools-suite/docs/ui-qa-subagent.md +440 -0
- package/external/pi-tools-suite/package.json +6 -1
- package/external/pi-tools-suite/src/antigravity-auth/auth-store.ts +2 -1
- package/external/pi-tools-suite/src/antigravity-auth/constants.ts +9 -3
- package/external/pi-tools-suite/src/antigravity-auth/headers.ts +41 -3
- package/external/pi-tools-suite/src/antigravity-auth/models.ts +94 -21
- package/external/pi-tools-suite/src/antigravity-auth/oauth.ts +5 -17
- package/external/pi-tools-suite/src/antigravity-auth/payload.ts +72 -7
- package/external/pi-tools-suite/src/antigravity-auth/stream.ts +13 -1
- package/external/pi-tools-suite/src/async-subagents/agents/implement.md +1 -1
- package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/backends/browser.mjs +346 -0
- package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/backends/desktop.mjs +1038 -0
- package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/backends/tui.mjs +759 -0
- package/external/pi-tools-suite/src/async-subagents/agents/{browser-qa → ui-qa/browser}/scripts/browser-qa-runner.mjs +32 -23
- package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/drivers/chrome-devtools/chrome-devtools-provider.mjs +895 -0
- package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/drivers/linux/linux-atspi.py +494 -0
- package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/drivers/macos/macos-accessibility.swift +1085 -0
- package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/drivers/native-terminal/bridge-client.mjs +50 -0
- package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/drivers/native-terminal/native-terminal-host.mjs +501 -0
- package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/drivers/windows/windows-uia.ps1 +454 -0
- package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/guides/browser-auth.md +114 -0
- package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/guides/browser-chrome-devtools.md +91 -0
- package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/guides/browser-playwright.md +145 -0
- package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/guides/browser.md +82 -0
- package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/guides/desktop-linux.md +26 -0
- package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/guides/desktop-macos.md +29 -0
- package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/guides/desktop-windows.md +23 -0
- package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/guides/desktop.md +54 -0
- package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/guides/tui-native-terminal.md +59 -0
- package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/guides/tui-pty.md +37 -0
- package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/guides/tui.md +60 -0
- package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/scripts/ui-qa-runner.mjs +535 -0
- package/external/pi-tools-suite/src/async-subagents/agents/ui-qa.md +75 -0
- package/external/pi-tools-suite/src/async-subagents/commands.ts +1 -1
- 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 +0 -2
- package/external/pi-tools-suite/src/async-subagents/core/browser-qa.ts +16 -2
- package/external/pi-tools-suite/src/async-subagents/core/config.ts +40 -17
- package/external/pi-tools-suite/src/async-subagents/core/model-selection.ts +2 -1
- package/external/pi-tools-suite/src/async-subagents/core/registry.ts +158 -33
- package/external/pi-tools-suite/src/async-subagents/core/routing.ts +7 -4
- package/external/pi-tools-suite/src/async-subagents/core/spawn.ts +34 -24
- package/external/pi-tools-suite/src/async-subagents/core/ultrawork-auto.ts +51 -45
- package/external/pi-tools-suite/src/async-subagents/lib.ts +9 -1
- package/external/pi-tools-suite/src/async-subagents/tools/spawn.ts +0 -1
- package/external/pi-tools-suite/src/async-subagents/tools/subagents.ts +2 -2
- package/external/pi-tools-suite/src/coding-discipline/index.ts +90 -59
- package/external/pi-tools-suite/src/config.ts +14 -0
- package/external/pi-tools-suite/src/context-gateway/accounting-log.ts +282 -0
- package/external/pi-tools-suite/src/context-gateway/config.ts +66 -1
- package/external/pi-tools-suite/src/context-gateway/efficiency.ts +414 -0
- package/external/pi-tools-suite/src/context-gateway/enforcement.ts +123 -3
- package/external/pi-tools-suite/src/context-gateway/index.ts +137 -4
- package/external/pi-tools-suite/src/context-gateway/storeless-capabilities.ts +5 -5
- package/external/pi-tools-suite/src/context-gateway/telemetry.ts +2 -2
- package/external/pi-tools-suite/src/context-gateway/types.ts +8 -1
- package/external/pi-tools-suite/src/dcp/auto-compress-budget.ts +39 -4
- package/external/pi-tools-suite/src/dcp/auto-compress.ts +41 -14
- package/external/pi-tools-suite/src/dcp/commands.ts +14 -156
- package/external/pi-tools-suite/src/dcp/compress-tool.ts +8 -2
- package/external/pi-tools-suite/src/dcp/compression-progress.ts +22 -0
- package/external/pi-tools-suite/src/dcp/config.ts +58 -4
- package/external/pi-tools-suite/src/dcp/conversation-index.ts +36 -9
- package/external/pi-tools-suite/src/dcp/diagnostics.ts +41 -0
- package/external/pi-tools-suite/src/dcp/fresh-tool-results.ts +38 -0
- package/external/pi-tools-suite/src/dcp/index.ts +338 -66
- package/external/pi-tools-suite/src/dcp/journal.ts +126 -4
- package/external/pi-tools-suite/src/dcp/progress-controller.ts +2 -1
- package/external/pi-tools-suite/src/dcp/pruner-candidates.ts +92 -2
- package/external/pi-tools-suite/src/dcp/pruner-nudge.ts +36 -33
- package/external/pi-tools-suite/src/dcp/pruner.ts +1 -0
- package/external/pi-tools-suite/src/dcp/routine-pressure.ts +86 -0
- package/external/pi-tools-suite/src/dcp/state.ts +9 -0
- package/external/pi-tools-suite/src/dcp/statistics.d.ts +8 -0
- package/external/pi-tools-suite/src/dcp/statistics.js +156 -0
- package/external/pi-tools-suite/src/default-pi-tools-suite-config.ts +68 -16
- package/external/pi-tools-suite/src/lib/project.ts +36 -1
- package/external/pi-tools-suite/src/model-tools/index.ts +10 -7
- package/external/pi-tools-suite/src/repo-discovery/index.ts +304 -4
- package/external/pi-tools-suite/src/resource-registry/index.ts +282 -21
- package/external/pi-tools-suite/src/session-recovery/index.ts +17 -0
- package/external/pi-tools-suite/src/todo/index.ts +21 -0
- package/external/pi-tools-suite/src/todo/todo.ts +19 -1
- package/external/pi-tools-suite/src/tool-descriptions.ts +44 -15
- package/package.json +7 -8
- package/schemas/pi-tools-suite.json +44 -12
- package/schemas/pix.json +109 -15
- package/schemas/tasks.json +1 -2
- package/skills/simplify/SKILL.md +33 -5
- package/external/pi-tools-suite/docs/browser-qa-subagent.md +0 -196
- package/external/pi-tools-suite/src/async-subagents/agents/browser-qa.md +0 -598
- package/skills/playwright-cli/SKILL.md +0 -420
- package/skills/playwright-cli/references/element-attributes.md +0 -23
- package/skills/playwright-cli/references/playwright-tests.md +0 -50
- package/skills/playwright-cli/references/request-mocking.md +0 -87
- package/skills/playwright-cli/references/running-code.md +0 -241
- package/skills/playwright-cli/references/session-management.md +0 -273
- package/skills/playwright-cli/references/spec-driven-testing.md +0 -311
- package/skills/playwright-cli/references/storage-state.md +0 -290
- package/skills/playwright-cli/references/test-generation.md +0 -142
- package/skills/playwright-cli/references/tracing.md +0 -154
- package/skills/playwright-cli/references/video-recording.md +0 -147
- package/skills/spec-wiki/SKILL.md +0 -55
- package/skills/spec-wiki/evals/evals.json +0 -132
- package/skills/spec-wiki/evals/files/bootstrap/architecture/rfc-007.md +0 -14
- package/skills/spec-wiki/evals/files/bootstrap/docs/how-to-pay.md +0 -4
- package/skills/spec-wiki/evals/files/bootstrap/docs/overview.md +0 -9
- package/skills/spec-wiki/evals/files/bootstrap/requirements/payment-behavior.md +0 -17
- package/skills/spec-wiki/evals/files/bootstrap/src/payments.ts +0 -12
- package/skills/spec-wiki/evals/files/bootstrap/tests/payments.test.ts +0 -11
- package/skills/spec-wiki/evals/files/focused/src/session.ts +0 -5
- package/skills/spec-wiki/evals/files/focused/tests/session.test.ts +0 -17
- package/skills/spec-wiki/evals/files/maintenance/low-signal/incoming/capture.txt +0 -2
- package/skills/spec-wiki/evals/files/maintenance/low-signal/src/capture.ts +0 -3
- package/skills/spec-wiki/evals/files/maintenance/move/docs/old-job-contract.md +0 -18
- package/skills/spec-wiki/evals/files/maintenance/move/src/job.ts +0 -5
- package/skills/spec-wiki/evals/files/maintenance/new-relation/docs/session-refresh.md +0 -24
- package/skills/spec-wiki/evals/files/maintenance/new-relation/incoming/refresh-worker.ts +0 -7
- package/skills/spec-wiki/evals/files/maintenance/new-relation/src/session.ts +0 -7
- package/skills/spec-wiki/evals/files/maintenance/no-impact/docs/auth-contract.md +0 -17
- package/skills/spec-wiki/evals/files/maintenance/no-impact/incoming/telemetry-format.ts +0 -3
- package/skills/spec-wiki/evals/files/maintenance/no-impact/src/auth.ts +0 -3
- package/skills/spec-wiki/evals/files/query/docs/how-to-run-jobs.md +0 -4
- package/skills/spec-wiki/evals/files/query/docs/spec-overview.md +0 -9
- package/skills/spec-wiki/evals/files/query/features/jobs/cancellation-contract.md +0 -15
- package/skills/spec-wiki/evals/files/query/features/jobs/retry-spec.md +0 -6
- package/skills/spec-wiki/evals/maintenance_regression.py +0 -311
- package/skills/spec-wiki/evals/retrieval-eval.md +0 -37
- package/skills/spec-wiki/evals/retrieval-evals.json +0 -37
- package/skills/spec-wiki/evals/trigger-evals.json +0 -94
- package/skills/spec-wiki/references/bootstrap.md +0 -100
- package/skills/spec-wiki/references/focused-spec.md +0 -117
- package/skills/spec-wiki/references/index-schema.md +0 -330
- package/skills/spec-wiki/references/maintenance.md +0 -134
- package/skills/spec-wiki/references/query.md +0 -74
- package/skills/spec-wiki/scripts/spec_wiki.py +0 -2076
- /package/external/pi-tools-suite/src/async-subagents/agents/{browser-qa → ui-qa/browser}/examples/qa-auth.example.jsonc +0 -0
- /package/external/pi-tools-suite/src/async-subagents/agents/{browser-qa → ui-qa/browser}/examples/qa-flow.example.jsonc +0 -0
- /package/external/pi-tools-suite/src/async-subagents/agents/{browser-qa → ui-qa/browser}/vendor/fflate.LICENSE +0 -0
- /package/external/pi-tools-suite/src/async-subagents/agents/{browser-qa → ui-qa/browser}/vendor/fflate.mjs +0 -0
package/docs/desktop-mvp.md
CHANGED
|
@@ -44,8 +44,10 @@ current product non-goals.
|
|
|
44
44
|
|
|
45
45
|
## Behavior
|
|
46
46
|
|
|
47
|
-
1. Tauri starts one isolated `pix-acp` child
|
|
48
|
-
|
|
47
|
+
1. Tauri starts one isolated `pix-acp` child for the ACP protocol. The host's
|
|
48
|
+
command surface has since grown beyond start/line-send/stop (e.g. package and
|
|
49
|
+
shell terminals via portable-pty); those additions are governed by the later
|
|
50
|
+
`specs/desktop-*.md` family, not by this historical baseline.
|
|
49
51
|
2. The client initializes ACP with form-elicitation support before creating or
|
|
50
52
|
loading a session.
|
|
51
53
|
3. Selecting a workspace lists its persisted sessions. The user can create a
|
|
@@ -75,10 +77,13 @@ current product non-goals.
|
|
|
75
77
|
object and the generation must still own the child
|
|
76
78
|
- `acp_stop(generation)`; stale generations cannot stop a replacement child
|
|
77
79
|
- Rust → webview events:
|
|
78
|
-
- `acp://stdout` with `{ generation,
|
|
79
|
-
|
|
80
|
+
- `acp://stdout` with `{ windowLabel, generation, lines: string[] }` batches
|
|
81
|
+
of complete stdout lines (stdout stays protocol-only)
|
|
82
|
+
- `acp://stderr` with `{ windowLabel, generation, lines: string[] }` batches
|
|
83
|
+
of diagnostic lines
|
|
80
84
|
- `acp://exit` with the generation and child exit status
|
|
81
|
-
- Rust starts
|
|
85
|
+
- Rust starts Node with the generated `<repo>/acp/dist/main.js` entry by
|
|
86
|
+
default. `PIX_ACP_NODE_BINARY`
|
|
82
87
|
and `PIX_ACP_ENTRY` may override executable and entry path for development.
|
|
83
88
|
- Webview ↔ adapter payloads follow `@agentclientprotocol/sdk` 1.4.0 types.
|
|
84
89
|
|
|
@@ -16,15 +16,18 @@ agent's session-local todo list.
|
|
|
16
16
|
|
|
17
17
|
## Scope
|
|
18
18
|
|
|
19
|
-
- A collapsible, resizable left sidebar
|
|
19
|
+
- A collapsible, resizable left activity sidebar whose project-scoped views
|
|
20
|
+
include `Tasks` and `Project` alongside other workspace views.
|
|
20
21
|
- Create, edit, delete, manual status changes, drag reordering, and moving tasks
|
|
21
22
|
between type groups.
|
|
23
|
+
- Create an untitled task directly from the normal message composer through its
|
|
24
|
+
overflow menu, carrying the current draft text and attachments without
|
|
25
|
+
sending a prompt.
|
|
22
26
|
- Task type (`bug`, `feature`, `improvement`) and status (`backlog`, `todo`,
|
|
23
27
|
`in-progress`, `done`).
|
|
24
28
|
- Persisted priority (`low`, `medium`, `high`, `urgent`). New tasks currently
|
|
25
29
|
receive `medium`; priority is not exposed by the current task editor or rows.
|
|
26
30
|
- 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
31
|
- Starting an unlinked task in a new ACP session and reopening an already-linked
|
|
29
32
|
session instead of creating a duplicate.
|
|
30
33
|
- Task descriptions can contain attachment markers; those attachments are
|
|
@@ -42,38 +45,65 @@ agent's session-local todo list.
|
|
|
42
45
|
|
|
43
46
|
## Behavior
|
|
44
47
|
|
|
45
|
-
1.
|
|
46
|
-
|
|
48
|
+
1. On first use the sidebar starts on `Tasks`; afterward it restores the last
|
|
49
|
+
active sidebar view. It remembers its width/collapsed state locally and keeps
|
|
50
|
+
a compact activity rail available while collapsed.
|
|
47
51
|
2. Tasks are grouped by type. Dragging a task reorders it; dropping it into a
|
|
48
52
|
different group also changes its type and updates `updatedAt`.
|
|
49
|
-
3. Task rows show title
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
+
3. Task rows show the title when present. Untitled tasks use the first line of
|
|
54
|
+
description as their display label, or `Untitled task` when they contain only
|
|
55
|
+
attachments. Rows also show status, session/run action, edit, and delete
|
|
56
|
+
controls. Status uses icon, text, and color rather than color alone.
|
|
57
|
+
4. Manual creation through the task editor still requires a non-empty title.
|
|
58
|
+
Tasks start with status `todo` and priority `medium`, and may include
|
|
59
|
+
description text and attachments. Newly selected/pasted task attachments are
|
|
60
|
+
persisted into `.pi/task-attachments` so the task owns its files. Existing
|
|
61
|
+
untitled composer-captured tasks may be edited without inventing a title as
|
|
62
|
+
long as description content or attachments remain.
|
|
53
63
|
5. Editing changes title, description, and type. Status is changed separately.
|
|
54
64
|
Existing persisted priority is preserved.
|
|
55
65
|
6. `.pi/tasks.jsonc` is authoritative. Missing `.pi`/task storage produces an
|
|
56
66
|
empty version-1 document. JSONC comments and trailing commas are accepted.
|
|
57
|
-
7.
|
|
58
|
-
|
|
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.
|
|
67
|
+
7. Only `.pi/tasks.jsonc` is recognized as task storage. Other sibling task
|
|
68
|
+
files are ignored; Pix does not import, migrate, delete, or interpret them.
|
|
61
69
|
8. Starting an unlinked task creates/selects a new ACP session, persists its
|
|
62
70
|
session id, changes any non-`done` task to `in-progress`, preserves `done`,
|
|
63
71
|
appends the generated task prompt, and sends it immediately.
|
|
64
72
|
9. Starting a linked task opens that session. A stale/missing linked session is
|
|
65
73
|
a recoverable error and does not silently create another session.
|
|
66
74
|
10. Task completion remains manual.
|
|
75
|
+
11. The normal message composer's vertical-ellipsis menu exposes `Create task`
|
|
76
|
+
whenever the current draft has text, attachments, or active voice input.
|
|
77
|
+
Voice input is finalized first. The resulting task has an empty persisted
|
|
78
|
+
title, type `feature`, status `todo`, priority `medium`, and stores the
|
|
79
|
+
composer text plus attachment markers in its description. The prompt is not
|
|
80
|
+
sent to the agent. Composer attachments are persisted into
|
|
81
|
+
`.pi/task-attachments` before those markers are written; path-backed files
|
|
82
|
+
are copied there and pathless images are materialized from their bytes.
|
|
83
|
+
12. After composer task persistence succeeds, Pix expands/selects the Tasks
|
|
84
|
+
sidebar view, scrolls the newly created task into view, highlights it, and
|
|
85
|
+
clears the composer only if the draft is still the exact draft that was
|
|
86
|
+
captured for task creation. A failed save or edits made while the save is in
|
|
87
|
+
flight preserve the composer.
|
|
88
|
+
13. After a task-document write succeeds, Pix prunes regular files from
|
|
89
|
+
`.pi/task-attachments` that are no longer referenced by any remaining task.
|
|
90
|
+
Shared attachments stay on disk until the last task reference is removed.
|
|
91
|
+
14. Every successful task-document write also marks the Registry `tasks` project
|
|
92
|
+
artifact dirty for background synchronization. Rapid task mutations are
|
|
93
|
+
debounced/coalesced; a failed local write never enters the remote sync queue.
|
|
94
|
+
If the Registry session is busy, the dirty task state remains pending until
|
|
95
|
+
an idle sync window is available.
|
|
67
96
|
|
|
68
97
|
## Contracts
|
|
69
98
|
|
|
70
99
|
- Project file: `.pi/tasks.jsonc`.
|
|
71
100
|
- Document shape: optional `$schema`, `version: 1`, and `tasks`.
|
|
72
|
-
- Each task has a unique id, title, type, status, priority, `createdAt`,
|
|
73
|
-
`updatedAt`; description and `sessionId` are optional.
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
101
|
+
- Each task has a unique id, string title, type, status, priority, `createdAt`,
|
|
102
|
+
and `updatedAt`; description and `sessionId` are optional. The title may be an
|
|
103
|
+
empty string only when description content is present.
|
|
104
|
+
- Unknown fields, duplicate ids, unsupported enum values, completely empty task
|
|
105
|
+
content, malformed timestamps, unsupported versions, and oversized documents
|
|
106
|
+
are rejected.
|
|
77
107
|
- The Tauri backend confines task paths to the active workspace, rejects escape
|
|
78
108
|
through `.pi` symlinks, and caps the document at 1 MB.
|
|
79
109
|
- Writes validate the complete document, write a same-directory temporary file,
|
|
@@ -83,6 +113,18 @@ agent's session-local todo list.
|
|
|
83
113
|
|
|
84
114
|
- Failed validation never replaces the task file.
|
|
85
115
|
- Failed persistence restores the previous in-memory task document.
|
|
116
|
+
- Composer task creation never clears a newer draft that changed while task
|
|
117
|
+
persistence was in flight.
|
|
118
|
+
- Task attachments are persisted through the same task-description marker
|
|
119
|
+
format used by the task editor, and newly attached files are owned by the
|
|
120
|
+
project's `.pi/task-attachments` storage so running the task restores them
|
|
121
|
+
without depending on the expiring chat cache or original source path.
|
|
122
|
+
- Attachment cleanup runs only after the replacement `tasks.jsonc` has been
|
|
123
|
+
committed successfully. Cleanup is reference-based across the complete task
|
|
124
|
+
document and never deletes paths outside `.pi/task-attachments`.
|
|
125
|
+
- Create/edit/delete/status/reorder/session-link task mutations all flow through
|
|
126
|
+
the same save method, so they share the same background Registry scheduling
|
|
127
|
+
semantics.
|
|
86
128
|
- A task is linked to at most one session.
|
|
87
129
|
- Running/reordering/editing is disabled while conflicting task/session work is
|
|
88
130
|
active.
|
|
@@ -92,16 +134,23 @@ agent's session-local todo list.
|
|
|
92
134
|
|
|
93
135
|
- Switching workspaces discards the previous in-memory task view and loads the
|
|
94
136
|
new project's task document.
|
|
95
|
-
- Missing storage means no tasks; malformed or empty
|
|
96
|
-
-
|
|
97
|
-
removes `.pi/tasks.json`.
|
|
137
|
+
- Missing storage means no tasks; malformed or empty `.pi/tasks.jsonc` is an error.
|
|
138
|
+
- Unsupported sibling task files do not participate in task loading.
|
|
98
139
|
- Save, session creation, attachment preparation, and prompt failures remain
|
|
99
140
|
visible and retryable.
|
|
100
141
|
|
|
101
142
|
## Related files
|
|
102
143
|
|
|
103
|
-
- `desktop/src/
|
|
144
|
+
- `desktop/src/app/project-actions.svelte.ts`
|
|
145
|
+
- `desktop/src/app/desktop-project-action-services.ts`
|
|
146
|
+
- `desktop/src/components/PromptComposerActionsMenu.svelte`
|
|
104
147
|
- `desktop/src/components/WorkspaceSidebar.svelte`
|
|
148
|
+
- `desktop/src/components/workspace-sidebar-layout-controller.svelte.ts`
|
|
149
|
+
- `desktop/src/components/workspace-sidebar-task-drag-controller.svelte.ts`
|
|
150
|
+
- `desktop/src/components/WorkspaceSidebarTasksPanel.svelte`
|
|
151
|
+
- `desktop/src/components/WorkspaceSidebarTaskEditor.svelte`
|
|
152
|
+
- `desktop/src/lib/attachments.ts`
|
|
153
|
+
- `desktop/src/lib/attachments.test.ts`
|
|
105
154
|
- `desktop/src/lib/project-tasks.ts`
|
|
106
155
|
- `desktop/src/lib/project-tasks.test.ts`
|
|
107
156
|
- `desktop/src-tauri/src/lib.rs`
|
|
@@ -109,10 +158,12 @@ agent's session-local todo list.
|
|
|
109
158
|
|
|
110
159
|
## Verification
|
|
111
160
|
|
|
112
|
-
- `desktop/src/lib/project-tasks.test.ts` covers
|
|
113
|
-
drag/reorder semantics.
|
|
161
|
+
- `desktop/src/lib/project-tasks.test.ts` covers untitled composer task creation,
|
|
162
|
+
parsing, prompt generation, and drag/reorder semantics.
|
|
163
|
+
- `desktop/src/lib/attachments.test.ts` covers data-URL decoding used when a
|
|
164
|
+
pathless composer image is persisted into project task storage.
|
|
114
165
|
- Rust tests in `desktop/src-tauri/src/lib.rs` cover missing/read/write/malformed
|
|
115
|
-
JSONC, validation, workspace confinement, and
|
|
166
|
+
JSONC, validation, workspace confinement, and ignoring unsupported task files.
|
|
116
167
|
- Run `npm --prefix desktop test`, `npm --prefix desktop run check`, and
|
|
117
168
|
`cargo test --manifest-path desktop/src-tauri/Cargo.toml`.
|
|
118
169
|
|
|
@@ -127,9 +178,11 @@ agent's session-local todo list.
|
|
|
127
178
|
|
|
128
179
|
## Evidence
|
|
129
180
|
|
|
130
|
-
- Confirmed by code: `desktop/src/
|
|
131
|
-
`desktop/src/
|
|
132
|
-
`desktop/src/lib/project-tasks.ts` implement the
|
|
181
|
+
- Confirmed by code: `desktop/src/app/project-actions.svelte.ts`,
|
|
182
|
+
`desktop/src/app/desktop-project-action-services.ts`, the extracted composer/
|
|
183
|
+
sidebar task surfaces, and `desktop/src/lib/project-tasks.ts` implement the
|
|
184
|
+
current task lifecycle and composer capture action.
|
|
133
185
|
- Confirmed by code: `desktop/src-tauri/src/lib.rs` owns JSONC persistence,
|
|
134
|
-
validation, confinement, atomic replacement, and
|
|
186
|
+
validation, confinement, atomic replacement, and ignores unsupported sibling
|
|
187
|
+
task-storage formats.
|
|
135
188
|
- Confirmed by tests: project-task unit tests and Tauri task persistence tests.
|
package/docs/release.md
CHANGED
|
@@ -13,15 +13,39 @@ npm run smoke-test
|
|
|
13
13
|
`release:check` runs type checking, the test suite, a production build, and `npm pack --dry-run`.
|
|
14
14
|
`smoke-test` packs the real tarball, installs it into an isolated temp directory, checks the bundled files, and runs non-interactive `pix` commands from the installed package.
|
|
15
15
|
|
|
16
|
-
##
|
|
16
|
+
## CI regression guardrails
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
The normative CI invariants are recorded in [`specs/ci-release.md`](../specs/ci-release.md). This section is the operational checklist for release work.
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
The GitHub Actions release workflow has two different responsibilities and they should stay separate:
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
- `build-and-test` runs on Ubuntu, macOS, and Windows. This is the cross-platform correctness gate: type checks, unit/integration tests, platform-specific host checks, and the Pix build belong here.
|
|
23
|
+
- Package smoke tests validate the artifact a user actually installs. Run the full payload/tarball smoke test on Ubuntu, and a smaller pack/install/CLI sanity check on Windows. A separate macOS package smoke job is unnecessary unless packaging gains macOS-specific behavior.
|
|
24
|
+
|
|
25
|
+
Keep CI tests deterministic across runner speed and operating systems:
|
|
26
|
+
|
|
27
|
+
- Assert explicit byte/count/state thresholds instead of assuming a background producer will do enough work within a short wall-clock interval. For example, a truncation test should write a fixed amount greater than the limit rather than write repeatedly for 300 ms and assume the runner will exceed the limit.
|
|
28
|
+
- Use timers only when timeout behavior itself is the contract. Do not use elapsed time as a proxy for produced output, process progress, or cleanup completion.
|
|
29
|
+
- When a test needs asynchronous process teardown, wait for an observable owned-process condition rather than relying on a short sleep.
|
|
30
|
+
- Run configuration-sensitive suite checks with an isolated `HOME` when reproducing CI locally. User-level Pix/pi-tools-suite config can intentionally change DCP and other opt-in behavior and must not be mistaken for a CI regression.
|
|
31
|
+
|
|
32
|
+
Windows process tests have additional invariants:
|
|
33
|
+
|
|
34
|
+
- `@lydell/node-pty` on Windows does not support POSIX signal arguments to `kill`; terminate an owned Windows PTY with signal-less `kill()` and release its ConPTY resources.
|
|
35
|
+
- Browser/process cleanup must stay ownership-scoped. When a PowerShell helper discovers descendants, it must not select or terminate itself; kill owned child roots recursively and verify cleanup before returning.
|
|
36
|
+
- Treat CRLF/LF differences as presentation differences unless line endings are the behavior under test.
|
|
37
|
+
|
|
38
|
+
Package smoke assertions should check stable package contracts. If a bundled guide title, required payload path, CLI entry point, or other intentionally asserted artifact changes, update the corresponding smoke assertion in the same change. Do not remove the smoke test merely because ordinary source tests are green: source tests do not prove that `npm pack` contains an installable, runnable artifact.
|
|
39
|
+
|
|
40
|
+
Current implementation:
|
|
41
|
+
|
|
42
|
+
- `.github/workflows/publish.yml` owns the CI matrix and release gates.
|
|
43
|
+
- `scripts/smoke-test-package.sh` is the full packed-artifact/payload smoke test.
|
|
44
|
+
- `scripts/smoke-test-package-cli.mjs` is the cross-platform pack/install/CLI sanity check used on Windows.
|
|
45
|
+
|
|
46
|
+
## Publish a new npm version
|
|
47
|
+
|
|
48
|
+
Pix uses the same release style as `indexer-cli`: a local command bumps the version, smoke-tests the tarball, then pushes the release commit and tag. GitHub Actions publishes the tag to npm using npm trusted publishing (GitHub OIDC), so the publish job does not require a long-lived `NPM_TOKEN` secret.
|
|
25
49
|
|
|
26
50
|
Release commands:
|
|
27
51
|
|
|
@@ -12,8 +12,9 @@ This package keeps shared Pi tools as ordinary source folders under `src/` and r
|
|
|
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
|
|
14
14
|
- `src/session-recovery` — branch- and compaction-aware `session_overview`, `session_read_section`, `session_search`, and `session_recovery_context` tools for bounded recovery from Pi's raw append-only session history
|
|
15
|
-
- `src/
|
|
16
|
-
- `src/
|
|
15
|
+
- `src/context-gateway` — off/observe/enforce result shaping; enforce keeps safe test/build compacts and bounds over-budget structured `web_search` / `web_fetch` provider content while retaining the complete producer details in raw session history for `session-recovery`; active modes also keep a privacy-safe rotated JSONL efficiency log with gross avoided context, recovery/artifact-read tax, conservative net estimates, and finalized provider usage
|
|
16
|
+
- `src/repo-discovery` — `/idx-init`, `/idx-update`, and idx-backed `repo_architecture` / `repo_structure` / `repo_ast` / `repo_search` / `repo_explain` / `repo_deps` plus the unified `repo_knowledge` contract/wiki tool; repo tools and repo-aware mutation guidance register only when the launch project has `.indexer-cli` **and** an executable `idx` is available on `PATH`
|
|
17
|
+
- `src/antigravity-auth` — `antigravity` custom provider with Google Antigravity OAuth login, startup account list, auth.json-only runtime account loading, `/antigravity-add-account` OAuth append into rotation, `/antigravity-account` status display, account rotation/failover, model registration with live route mapping (current Antigravity catalog: Gemini 3.5/3.6/3.7/3.8 Flash, Gemini 3.1 Pro, Claude Sonnet 4.6 Thinking, Claude Opus 4.6 Thinking, GPT-OSS 120B Medium, plus legacy Antigravity aliases and Gemini CLI mirrors), and streaming through the Cloud Code Assist unified gateway
|
|
17
18
|
- `src/opencode-import` — `/opencode-import` for bounded migration of supported OpenCode OpenAI/Codex, GitHub Copilot, Z.ai, and Antigravity credentials into Pi; existing entries are preserved unless `--force` is passed
|
|
18
19
|
- `src/todo` — `todo` tool, `/todos`, `/todos-persist`, `/todos-scope`, and `/todos-clear` (also `/todos clear`); supports parent/subtask hierarchy, blockers, ready-task filtering, deferred out-of-scope items, batch operations, JSON/Markdown import/export, automatic clearing when all visible todos are completed, and optional project persistence via `/todos persist on` or `/todos-persist on`; localization/i18n has been removed
|
|
19
20
|
- `src/model-tools` — model-specific tool aliases such as Claude/GLM-style `Read` / `Edit` / `Write` / `Bash` / `Grep` / `Glob` / `LS`, GPT/Codex-style `shell`, and model-gated `apply_patch`
|
|
@@ -21,11 +22,58 @@ This package keeps shared Pi tools as ordinary source folders under `src/` and r
|
|
|
21
22
|
- `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
23
|
- `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
24
|
- `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/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
|
|
25
|
+
- `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>/task-attachments/`, `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` (with referenced `.pi/task-attachments` rebased through portable registry-only markers), `.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, and the tasks hash includes referenced attachment bytes; 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
26
|
|
|
26
27
|
`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
28
|
|
|
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.
|
|
29
|
+
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, context-gateway, truncation-metadata-normalizer, 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. Repo-aware mode requires both project `.indexer-cli` state and an executable `idx`; when enabled, `repo_*` tools stay active ahead of overlapping lower-level aliases. If `idx` is unavailable, the suite falls back to ordinary Read/Grep/LSP/sub-agent guidance and does **not** implicitly install, initialize, or create index state. `/idx-init` is the explicit setup/repair path and should be run only with user permission.
|
|
30
|
+
|
|
31
|
+
## Repository knowledge and spec maintenance
|
|
32
|
+
|
|
33
|
+
When repo-aware mode is available, `repo_knowledge` is the single model-facing
|
|
34
|
+
surface for behavioral specs/contracts. It wraps the first-class `idx context`
|
|
35
|
+
and `idx wiki` knowledge layer while ordinary file tools remain responsible for
|
|
36
|
+
editing the primary spec documents themselves.
|
|
37
|
+
|
|
38
|
+
Read/query actions:
|
|
39
|
+
|
|
40
|
+
- `context` — primary contract + implementation ranges + tests + freshness in a
|
|
41
|
+
bounded response;
|
|
42
|
+
- `search` / `show` — find or inspect authoritative project knowledge;
|
|
43
|
+
- `status` / `audit` / `catalog` — freshness and project knowledge health;
|
|
44
|
+
- `discover` — classify new/moved/changed document candidates, including
|
|
45
|
+
low-signal documents through the explicit all-unclassified mode;
|
|
46
|
+
- `impact` — review known and uncovered contract impact for this task's changed
|
|
47
|
+
paths (preferred) or a Git base fallback.
|
|
48
|
+
|
|
49
|
+
Metadata mutation actions are explicit: `record`, `relate`, `verify`, and
|
|
50
|
+
`remove`. They do not edit primary documents. The wrapper requires a source
|
|
51
|
+
review acknowledgement before `record`, concrete semantic evidence review before
|
|
52
|
+
`relate`/`verify`, and an explicit metadata-only acknowledgement before `remove`.
|
|
53
|
+
|
|
54
|
+
For a **material behavior-changing implementation** in repo-aware mode, the
|
|
55
|
+
model-facing contract is:
|
|
56
|
+
|
|
57
|
+
1. Find the existing primary behavioral contract before or while implementing.
|
|
58
|
+
2. Keep that primary spec aligned with the intended behavior in the same task.
|
|
59
|
+
If no suitable primary contract exists, create a focused spec with the normal
|
|
60
|
+
Edit/Write/`apply_patch` tools before recording its metadata.
|
|
61
|
+
3. After implementation, run task-scoped `repo_knowledge` `impact` on the files
|
|
62
|
+
changed by this task; review uncovered paths and new/moved documents.
|
|
63
|
+
4. Repair only evidence-backed relations. Similarity or graph proximity alone
|
|
64
|
+
never authorizes a durable relation, and a reviewed no-impact result is valid.
|
|
65
|
+
5. `record` means classified/indexed, **not verified**. Run `verify` only after
|
|
66
|
+
reading the primary source and checking relevant code/tests/evidence. Changed
|
|
67
|
+
code never automatically rewrites spec semantics.
|
|
68
|
+
|
|
69
|
+
Mechanical refactors, typo/formatting edits, exact renames, and other changes
|
|
70
|
+
that do not alter project behavior do not require this knowledge-maintenance
|
|
71
|
+
lifecycle. When `idx` is unavailable or the project is not indexed, none of
|
|
72
|
+
these requirements are injected; use the normal repository workflow instead.
|
|
73
|
+
For repo-aware projects, completing a todo when only the final active todo
|
|
74
|
+
remains adds one compact reminder to reconcile affected specs and repo knowledge
|
|
75
|
+
before closing that final todo. File mutations themselves do not emit knowledge
|
|
76
|
+
reminders.
|
|
29
77
|
|
|
30
78
|
## Session recovery
|
|
31
79
|
|
|
@@ -105,6 +153,7 @@ DCP settings are stored only under `dcp` in the user shared config file `~/.conf
|
|
|
105
153
|
"enabled": false,
|
|
106
154
|
"patience": 2,
|
|
107
155
|
"summarizerModel": [],
|
|
156
|
+
"summarizerFallbackModels": [],
|
|
108
157
|
"timeoutMs": 20000
|
|
109
158
|
}
|
|
110
159
|
},
|
|
@@ -176,11 +225,16 @@ DCP settings are stored only under `dcp` in the user shared config file `~/.conf
|
|
|
176
225
|
|
|
177
226
|
`minContextPercent` / `maxContextPercent` accept legacy fractions (`0.25`), percent strings (`"25%"`), or absolute token counts when Pi knows the current model context window. `minContextLimit` / `maxContextLimit` and `modelMinContextLimits` / `modelMaxContextLimits` are explicit absolute-or-percent aliases. `modelOverrides` and the `modelMin*` / `modelMax*` maps support exact model keys plus `*` / `?` wildcard patterns; matching is applied from generic to specific so exact bare-model matches override bare wildcards, and exact `provider/model` matches override provider wildcards. Array fields are union-merged, so model-specific `protectedTools` extend the defaults instead of replacing them. If `compress.protectUserMessages` is enabled, range compression appends selected user messages verbatim instead of rejecting the range; individual message compression still skips protected raw user messages. Protected tool outputs are copied into summaries for tools protected by name or `protectedFilePatterns`; protected `subagents` result reads also try to include the saved `result.md` artifact when available.
|
|
178
227
|
|
|
179
|
-
`compress.autoCompress.enabled` is `false` by default. When explicitly enabled, its `patience` counts completed correlated main-provider opportunities, not repeated context transforms; `summarizerModel
|
|
228
|
+
`compress.autoCompress.enabled` is `false` by default. When explicitly enabled, its `patience` counts completed correlated main-provider opportunities, not repeated context transforms; `summarizerModel` supplies the primary summarizer list and `summarizerFallbackModels` appends explicit ordered fallbacks. Existing multi-entry `summarizerModel` configs remain supported. When both lists are empty, DCP uses the bounded extractive fallback without a model call. A configured model summarizer receives a bounded sub-deadline (75% of `timeoutMs`) so deterministic extractive fallback and durable publication retain time inside the whole operation budget. After a failed model-backed auto-compression attempt, subsequent automatic attempts in that session skip the model summarizer and use deterministic extraction. Auto commit is accepted only when the full projected replacement has positive gain and meets the current budget-recovery target.
|
|
180
229
|
|
|
181
|
-
`strategies.emergencyCurrentTurnPruning` is the default-enabled lossy safety floor for a single unfinished turn
|
|
230
|
+
`strategies.emergencyCurrentTurnPruning` is the default-enabled lossy safety floor for a single unfinished turn. DCP first emits emergency reminders and offers only safe old same-turn tool-result candidates. After `patience` completed ignored opportunities, at the model-independent `hardContextPercent`, or when exact auto-compression fails while input capacity is already exceeded, it replaces eligible oldest result bodies until the estimated provider context reaches `targetContextPercent` or a safe capacity margin. User messages, configured/protected data, the newest `keepRecentToolPairs`, and results without **completed** provider evidence are never selected. HTTP 2xx alone is not evidence; DCP promotes eligibility only after an unambiguously correlated successful finalized assistant response, and ambiguous retries/interleaving fail closed. If eligible recovery still cannot fit the request, DCP emits a user-visible blocked diagnostic with the capacity reason before abort/handoff. The raw session transcript is unchanged. Setting `enabled` to `false` disables same-turn candidates and lossy pruning, but keeps the non-destructive emergency reminder.
|
|
182
231
|
|
|
183
|
-
DCP
|
|
232
|
+
DCP durable state is journaled as append-only `dcp-journal` custom entries in
|
|
233
|
+
the Pi session JSONL. Resume/reload replays that journal; the current
|
|
234
|
+
implementation has no legacy sidecar importer or dual-write path. Protected
|
|
235
|
+
subagent artifacts are optional bounded recovery input: reads are async, rooted
|
|
236
|
+
at the session cwd, reject symlink escapes and oversized files, and never
|
|
237
|
+
silently truncate a required protected artifact.
|
|
184
238
|
|
|
185
239
|
Set `dcp.debug: true` to write a JSONL debug log of DCP context/prune/compress events to `~/.pi/agent/dcp-debug.jsonl` (override the path with `PI_DCP_DEBUG_LOG`, or enable without config via `PI_DCP_DEBUG=1`); off by default. The log is size-limited and rotated: once it reaches `dcp.debugLog.maxBytes` (default `5242880` = 5 MB) it is renamed to `.1`, older backups shift down (`.1`→`.2`, …) and the oldest beyond `dcp.debugLog.maxBackups` (default `3`, minimum `1`) is dropped; override either with `PI_DCP_DEBUG_MAX_BYTES` / `PI_DCP_DEBUG_MAX_BACKUPS`.
|
|
186
240
|
|
|
@@ -444,10 +498,11 @@ Explicit task/CLI model overrides bypass the pool. Setting
|
|
|
444
498
|
`PI_SUBAGENTS_FORCE_CURRENT_MODEL=1`) deliberately selects the parent model and
|
|
445
499
|
strips conflicting model arguments; this is not the economical default.
|
|
446
500
|
|
|
447
|
-
The
|
|
501
|
+
The six built-in modes are `research` (read-only evidence and independent
|
|
448
502
|
review), `implement` (bounded code, docs, tests, or UI changes), `verify`
|
|
449
|
-
(run checks and diagnose logs without fixing files), `
|
|
450
|
-
|
|
503
|
+
(run checks and diagnose logs without fixing files), `ui-qa` (real browser,
|
|
504
|
+
terminal/TUI, and desktop-GUI verification), `frontier-review` (independent
|
|
505
|
+
post-implementation review), and `oracle` (deliberate strong second opinion).
|
|
451
506
|
Ordinary workers use economical model candidates; no built-in parent-tier
|
|
452
507
|
rule promotes them to a flagship. Oracle is the exception, not an automatic
|
|
453
508
|
retry for difficult work. Task-specific discipline belongs in the brief.
|
|
@@ -473,13 +528,14 @@ contract, configuration examples, override rules and legacy compatibility.
|
|
|
473
528
|
The parent normally selects an explicit `subagentType` from the effective
|
|
474
529
|
system-prompt catalog, preferring a matching project-local specialist. Valid
|
|
475
530
|
explicit types bypass the LLM router entirely; presets, model selection, tools,
|
|
476
|
-
|
|
531
|
+
and role instructions are still applied by the normal config resolver.
|
|
477
532
|
Model/thinking overrides are not substitutes for selecting a role.
|
|
478
533
|
|
|
479
534
|
The router remains enabled as a fallback for omitted types: use it when the role
|
|
480
535
|
is unclear or the user explicitly requests automatic routing. Only omitted
|
|
481
536
|
tasks are classified, in one batch; the parent's explicit choices are preserved.
|
|
482
|
-
Real
|
|
537
|
+
Real UI QA still requires explicit `subagentType: "ui-qa"`. Explicit legacy
|
|
538
|
+
`browser-qa` requests normalize to `ui-qa` for compatibility.
|
|
483
539
|
|
|
484
540
|
Unknown explicit types and failed/incomplete automatic routing reject the
|
|
485
541
|
**entire spawn batch before run state or child processes are created**. The tool
|
|
@@ -520,7 +576,7 @@ You are this project's staff reviewer. Apply the repo rules from
|
|
|
520
576
|
AGENTS.md before approving anything; cite file paths first.
|
|
521
577
|
```
|
|
522
578
|
|
|
523
|
-
- Frontmatter keys: `name` (must match the filename), `description`, `icon`, `models`, `thinking`, `tools`, `
|
|
579
|
+
- Frontmatter keys: `name` (must match the filename), `description`, `icon`, `models`, `thinking`, `tools`, `extraArgs`, `promptAppend`, `promptOverride`, `retry`, `maxResultBytes`, `timeoutMs`. Legacy `model`, `fallbackModels`, and `modelByParent` still load. Unknown keys are rejected with an error naming the file.
|
|
524
580
|
- 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
581
|
- 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
582
|
- 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.
|
|
@@ -528,26 +584,77 @@ AGENTS.md before approving anything; cite file paths first.
|
|
|
528
584
|
- 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
585
|
- `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.
|
|
530
586
|
|
|
531
|
-
###
|
|
532
|
-
|
|
533
|
-
The built-in `
|
|
534
|
-
`openai-codex/gpt-5.6-luna` as its fallback. Its
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
`
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
587
|
+
### Real UI QA (browser, TUI, and desktop GUI)
|
|
588
|
+
|
|
589
|
+
The built-in `ui-qa` role runs on `zai/glm-5.3-flash`, with
|
|
590
|
+
`openai-codex/gpt-5.6-luna` as its fallback. Its Markdown body
|
|
591
|
+
(`src/async-subagents/agents/ui-qa.md`) is a deliberately thin common contract:
|
|
592
|
+
test the real user-facing target, classify only the top-level backend, route
|
|
593
|
+
through on-demand guides, run through the unified runner, and keep deterministic
|
|
594
|
+
assertions as the oracle with bounded execution, owned cleanup, and private
|
|
595
|
+
evidence. Provider/presentation/platform details are intentionally absent from
|
|
596
|
+
the initial role body. The normal profile loader appends that body to the QA
|
|
597
|
+
child's task prompt; the parent and LLM router receive only the short
|
|
598
|
+
`description`. There is no additional QA skill to discover or read.
|
|
599
|
+
|
|
600
|
+
Backend specifics use progressive disclosure through bundled guides under
|
|
601
|
+
`src/async-subagents/agents/ui-qa/guides/`. `browser.md`, `tui.md`, and
|
|
602
|
+
`desktop.md` are compact routers; backend-scoped detail topics cover the actual
|
|
603
|
+
browser provider, TUI presentation, desktop platform driver, and explicit
|
|
604
|
+
browser-auth workflow. The child loads the matching base guide, then only the
|
|
605
|
+
routed detail topic read-only via the runner:
|
|
606
|
+
|
|
607
|
+
```sh
|
|
608
|
+
node "$PI_UI_QA_RUNNER" guide --backend browser # or: tui | desktop
|
|
609
|
+
node "$PI_UI_QA_RUNNER" guide --backend browser --topic playwright
|
|
610
|
+
# other examples: chrome-devtools, tui/native-terminal, desktop/windows-uia
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
The command resolves the guide from a backend-scoped fixed allowlist bundled
|
|
614
|
+
with the suite (never a model-composed path), rejects unknown/cross-backend
|
|
615
|
+
topics/options and extra arguments, bounds guide size, and prints only the
|
|
616
|
+
requested document. `probe` returns authoritative
|
|
617
|
+
`selection.guide = {backend, topic}`; the child reconciles that route before
|
|
618
|
+
`run`.
|
|
619
|
+
|
|
620
|
+
`ui-qa` authors one private declarative flow and invokes the capability-first
|
|
621
|
+
runner supplied in `PI_UI_QA_RUNNER`. The runner selects exactly one backend
|
|
622
|
+
from the target descriptor and reports candidate capabilities plus its selection
|
|
623
|
+
rationale. Browser routing selects the trusted Playwright backend or the
|
|
624
|
+
capability-probed Chrome DevTools provider. TUI routing selects PTY semantics or
|
|
625
|
+
the native-terminal mirror. Desktop routing selects the capability-probed macOS
|
|
626
|
+
Accessibility, Windows UI Automation, or Linux AT-SPI implementation. Evidence
|
|
627
|
+
capabilities remain platform-specific and never replace deterministic
|
|
628
|
+
assertions. Unsupported platforms or missing required control permissions
|
|
629
|
+
return `BLOCKED`. QA does not
|
|
630
|
+
install GUI automation dependencies, change OS privacy/accessibility settings,
|
|
631
|
+
disable sandboxing, or operate unrelated user windows. Static or mock checks do
|
|
632
|
+
not substitute for the requested UI.
|
|
633
|
+
|
|
634
|
+
Unified flows and native/TUI evidence—including automatic recordings—stay in the owning agent's private
|
|
635
|
+
`.pi/subagents/<run>/<agent-id>/ui-qa/` workspace. Pass/fail requires a
|
|
636
|
+
product-visible deterministic oracle such as terminal content/state,
|
|
637
|
+
accessibility/app-driver state, window/dialog state, or visible control values;
|
|
638
|
+
screenshots are supporting evidence, not the sole oracle. Cleanup is scoped to
|
|
639
|
+
the PTY/session/app process created by the QA run.
|
|
640
|
+
|
|
641
|
+
#### Browser backend and project auth
|
|
642
|
+
|
|
643
|
+
The capability-first runner and all backend resources live under
|
|
644
|
+
`src/async-subagents/agents/ui-qa/`; the trusted browser runner, vendor code,
|
|
645
|
+
license, and examples are grouped under its `browser/` directory. The launcher
|
|
646
|
+
supplies absolute paths in `PI_UI_QA_RUNNER` and `PI_BROWSER_QA_RUNNER`. Normal
|
|
647
|
+
probe/run uses the former;
|
|
648
|
+
the latter is invoked directly only for browser auth profile discovery and
|
|
649
|
+
form-auth scaffolding. These non-secret paths are set only for QA children.
|
|
650
|
+
Every async sub-agent launches with `--no-skills`, and skill flags in
|
|
651
|
+
`extraArgs` are stripped rather than forwarded. Agent roles are self-contained;
|
|
652
|
+
there is no profile field for injecting skills and no built-in QA `--skill`.
|
|
653
|
+
|
|
654
|
+
Model/thinking/tool-only overrides should use a project `ui-qa.md` and inherit
|
|
655
|
+
the bundled Markdown workflow. A legacy project `browser-qa.md` is migrated to
|
|
656
|
+
the canonical `ui-qa` profile when no `ui-qa.md` override exists. A project
|
|
657
|
+
Markdown body replaces the inherited
|
|
551
658
|
`promptAppend` under the usual field-level merge rules; custom QA instructions must preserve the runner-only,
|
|
552
659
|
credential, target, and evidence contracts. Runner-enforced isolation and
|
|
553
660
|
credential handling remain in code, not in the prompt.
|
|
@@ -594,9 +701,10 @@ video recording begins on the login page and captures the field-filling and subm
|
|
|
594
701
|
sequence; password inputs remain browser-masked, but the private video may show
|
|
595
702
|
other visible login identifiers and must be treated as sensitive evidence. Tracing
|
|
596
703
|
starts only after login succeeds and is sanitized before retention. The launcher
|
|
597
|
-
provides each
|
|
598
|
-
`.pi/subagents/<run>/<agent-id>/browser-qa/` workspace.
|
|
599
|
-
|
|
704
|
+
provides each UI QA process with its general `ui-qa/` workspace plus the browser
|
|
705
|
+
backend's `.pi/subagents/<run>/<agent-id>/browser-qa/` workspace. Unified flows
|
|
706
|
+
stay under `ui-qa/flows/`; browser adapter flows, screenshots, video, sanitized
|
|
707
|
+
traces, and result manifests stay under the backend workspace, so normal
|
|
600
708
|
session shutdown or `subagents cleanup` removes them with the run directory.
|
|
601
709
|
The runner validates the owning agent metadata and refuses flows outside that
|
|
602
710
|
workspace; reusing an agent id clears stale browser QA files first. Trace archives
|
|
@@ -607,7 +715,7 @@ creating a template. Only an explicit authenticated request may create the
|
|
|
607
715
|
private template. Missing, rejected, or expired selected auth returns
|
|
608
716
|
`QA_AUTH_UPDATE_REQUIRED`, naming only the profile/file/reason needed for the
|
|
609
717
|
parent to ask the user for an update and rerun. See
|
|
610
|
-
`src/async-subagents/agents/
|
|
718
|
+
`src/async-subagents/agents/ui-qa/browser/examples/qa-auth.example.jsonc`
|
|
611
719
|
for complete profile shapes and `examples/qa-flow.example.jsonc` beside it for
|
|
612
720
|
the declarative, non-executable QA action/assertion format.
|
|
613
721
|
|
|
@@ -621,7 +729,7 @@ so screenshots and assertions remain state-focused.
|
|
|
621
729
|
|
|
622
730
|
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
731
|
|
|
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.
|
|
732
|
+
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`. `lookupFallbackModels` is the ordered fallback array for `lookupModel` and defaults to `[]`; lookup tries the configured chain in order. 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
733
|
|
|
626
734
|
When `subagentType` is omitted, the lightweight role router classifies the task
|
|
627
735
|
using the descriptions. Explicit types bypass it. Unknown types or failed
|
|
@@ -638,7 +746,7 @@ Pool order does not change preference and pool-only models are never appended.
|
|
|
638
746
|
Without a preset, the full agent list is eligible. Candidate order expresses
|
|
639
747
|
the configured budget preference; runtime does not infer current API prices.
|
|
640
748
|
|
|
641
|
-
Image-bearing tasks and `
|
|
749
|
+
Image-bearing tasks and `ui-qa` require confirmed image support; configured
|
|
642
750
|
blind-model masks override runtime image metadata. Remaining eligible models
|
|
643
751
|
form the quota fallback chain, so neither quota history nor image fallback can
|
|
644
752
|
escape the pool. Antigravity account rotation still happens before provider
|
|
@@ -723,6 +831,14 @@ Without an Ollama API key, both tools default to `http://localhost:11434/api/exp
|
|
|
723
831
|
|
|
724
832
|
Configure a Tavily key to enable automatic fallback for both tools. Ollama remains the primary provider; if any Ollama request or response fails, `web_search` retries through `https://api.tavily.com/search` and `web_fetch` retries through `https://api.tavily.com/extract`. The Tavily key is sent only in Tavily's bearer authorization header and is never accepted as a tool parameter or included in result details. Fallback results set `details.provider` to `tavily` and include the primary Ollama error under `details.fallbackFrom`; ordinary results set `details.provider` to `ollama`.
|
|
725
833
|
|
|
834
|
+
When Context Gateway is in `enforce` mode, an over-budget `web_search` or
|
|
835
|
+
`web_fetch` result with complete structured producer details is delivered to the
|
|
836
|
+
next model as a bounded `web-recoverable-compact` view. The original structured
|
|
837
|
+
details stay in the raw session tool result (they are not serialized into the
|
|
838
|
+
provider request) and can be found by `toolCallId` with `session_search`, then
|
|
839
|
+
read or paged with `session_read_section`. Unsupported web result shapes remain
|
|
840
|
+
passthrough instead of being irreversibly sliced.
|
|
841
|
+
|
|
726
842
|
The recommended interactive setup is:
|
|
727
843
|
|
|
728
844
|
```text
|
|
@@ -767,17 +883,27 @@ pi-tools-suite/
|
|
|
767
883
|
package.json
|
|
768
884
|
src/
|
|
769
885
|
index.ts
|
|
886
|
+
coding-discipline/
|
|
770
887
|
ast-grep/
|
|
771
888
|
async-subagents/
|
|
772
889
|
lsp/
|
|
890
|
+
comment-checker/
|
|
891
|
+
session-name/
|
|
892
|
+
session-recovery/
|
|
773
893
|
repo-discovery/
|
|
774
894
|
antigravity-auth/
|
|
895
|
+
opencode-import/
|
|
775
896
|
todo/
|
|
776
897
|
model-tools/
|
|
777
898
|
usage/
|
|
778
899
|
web-search/
|
|
900
|
+
context-gateway/
|
|
901
|
+
truncation-metadata-normalizer/
|
|
779
902
|
dcp/
|
|
780
903
|
prompt-commands/
|
|
904
|
+
resource-registry/
|
|
905
|
+
credential-firewall/
|
|
906
|
+
codex-reasoning-fix/
|
|
781
907
|
docs/
|
|
782
908
|
licenses/
|
|
783
909
|
scripts/
|