pi-ui-extend 1.0.41 → 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 +50 -13
- package/dist/app/app.d.ts +13 -0
- package/dist/app/app.js +158 -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 +4 -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 +57 -35
- 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 +15 -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 +70 -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/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/editor-panels.js +10 -4
- 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 +7 -1
- package/dist/app/session/session-lifecycle-controller.js +16 -1
- package/dist/app/session/tabs-controller.d.ts +26 -1
- package/dist/app/session/tabs-controller.js +454 -147
- 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/subagents/subagents-widget-controller.d.ts +1 -0
- package/dist/app/subagents/subagents-widget-controller.js +6 -0
- package/dist/app/types.d.ts +16 -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 +25 -5
- package/dist/schemas/index.d.ts +1 -0
- package/dist/schemas/index.js +1 -0
- package/dist/schemas/pi-tools-suite-schema.d.ts +88 -62
- package/dist/schemas/pi-tools-suite-schema.js +54 -83
- package/dist/schemas/pix-schema.d.ts +19 -2
- package/dist/schemas/pix-schema.js +47 -5
- package/dist/schemas/tasks-schema.d.ts +18 -0
- package/dist/schemas/tasks-schema.js +41 -0
- package/docs/concurrency.md +9 -1
- package/docs/desktop-mvp.md +22 -6
- package/docs/desktop-task-manager.md +148 -84
- package/docs/release.md +30 -6
- package/external/pi-tools-suite/README.md +197 -84
- package/external/pi-tools-suite/docs/evals.md +1 -1
- package/external/pi-tools-suite/docs/session-recovery.md +47 -14
- package/external/pi-tools-suite/docs/subagent-model-pools.md +48 -30
- 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/frontier-review.md +23 -0
- package/external/pi-tools-suite/src/async-subagents/agents/implement.md +1 -1
- 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/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 +15 -71
- 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 -5
- 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 +160 -327
- 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 +21 -5
- package/external/pi-tools-suite/src/async-subagents/core/spawn.ts +40 -26
- 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/core/ultrawork-auto.ts +51 -45
- package/external/pi-tools-suite/src/async-subagents/index.ts +69 -5
- package/external/pi-tools-suite/src/async-subagents/lib.ts +16 -9
- package/external/pi-tools-suite/src/async-subagents/tools/spawn.ts +8 -5
- package/external/pi-tools-suite/src/async-subagents/tools/subagents.ts +5 -4
- package/external/pi-tools-suite/src/async-subagents/types.ts +1 -0
- package/external/pi-tools-suite/src/coding-discipline/index.ts +90 -59
- package/external/pi-tools-suite/src/config.ts +55 -1
- package/external/pi-tools-suite/src/context-gateway/accounting-log.ts +282 -0
- package/external/pi-tools-suite/src/context-gateway/config.ts +77 -3
- package/external/pi-tools-suite/src/context-gateway/efficiency.ts +414 -0
- package/external/pi-tools-suite/src/context-gateway/enforcement.ts +222 -0
- package/external/pi-tools-suite/src/context-gateway/index.ts +206 -19
- package/external/pi-tools-suite/src/context-gateway/storeless-capabilities.ts +7 -7
- package/external/pi-tools-suite/src/context-gateway/telemetry.ts +101 -28
- package/external/pi-tools-suite/src/context-gateway/types.ts +16 -3
- package/external/pi-tools-suite/src/context-inventory.ts +99 -0
- package/external/pi-tools-suite/src/dcp/auto-compress-budget.ts +39 -4
- package/external/pi-tools-suite/src/dcp/auto-compress.ts +128 -49
- package/external/pi-tools-suite/src/dcp/commands.ts +32 -156
- package/external/pi-tools-suite/src/dcp/compress-tool.ts +177 -46
- 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/compression-progress.ts +22 -0
- package/external/pi-tools-suite/src/dcp/config.ts +114 -17
- 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/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 +93 -3
- package/external/pi-tools-suite/src/dcp/pruner-message-ids.ts +6 -10
- package/external/pi-tools-suite/src/dcp/pruner-nudge.ts +36 -33
- package/external/pi-tools-suite/src/dcp/pruner-tools.ts +6 -3
- 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 +78 -22
- package/external/pi-tools-suite/src/index.ts +7 -1
- 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 +2551 -0
- package/external/pi-tools-suite/src/session-recovery/index.ts +17 -0
- package/external/pi-tools-suite/src/shell-command-policy.ts +219 -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 +47 -19
- package/package.json +10 -9
- package/schemas/pi-tools-suite.json +466 -287
- package/schemas/pix.json +129 -11
- package/schemas/tasks.json +131 -0
- package/skills/simplify/SKILL.md +33 -5
- package/docs/desktop-markdown-media.md +0 -77
- package/external/pi-tools-suite/docs/browser-qa-subagent.md +0 -177
- package/external/pi-tools-suite/docs/dcp-emergency-current-turn.md +0 -102
- package/external/pi-tools-suite/src/async-subagents/agents/browser-qa.md +0 -598
- 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/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-lite/SKILL.md +0 -140
- /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/schemas/pix.json
CHANGED
|
@@ -21,6 +21,14 @@
|
|
|
21
21
|
"type": "string",
|
|
22
22
|
"description": "Provider/model identifier, e.g. 'openai-codex/gpt-5.4'."
|
|
23
23
|
},
|
|
24
|
+
"fallbackModels": {
|
|
25
|
+
"type": "array",
|
|
26
|
+
"items": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"description": "Fallback provider/model identifier."
|
|
29
|
+
},
|
|
30
|
+
"description": "Ordered default-model fallbacks tried after modelRef."
|
|
31
|
+
},
|
|
24
32
|
"thinking": {
|
|
25
33
|
"anyOf": [
|
|
26
34
|
{
|
|
@@ -57,6 +65,52 @@
|
|
|
57
65
|
},
|
|
58
66
|
"description": "Default model selection for new sessions."
|
|
59
67
|
},
|
|
68
|
+
"visibleModels": {
|
|
69
|
+
"type": "array",
|
|
70
|
+
"items": {
|
|
71
|
+
"type": "string",
|
|
72
|
+
"description": "Provider/model identifier shown in Pix model pickers."
|
|
73
|
+
},
|
|
74
|
+
"description": "User-level whitelist shared by Pix TUI and Desktop model pickers. Omit to show every available model."
|
|
75
|
+
},
|
|
76
|
+
"thinkingByModel": {
|
|
77
|
+
"type": "object",
|
|
78
|
+
"patternProperties": {
|
|
79
|
+
"^.*$": {
|
|
80
|
+
"anyOf": [
|
|
81
|
+
{
|
|
82
|
+
"type": "string",
|
|
83
|
+
"const": "off"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"type": "string",
|
|
87
|
+
"const": "minimal"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"type": "string",
|
|
91
|
+
"const": "low"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"type": "string",
|
|
95
|
+
"const": "medium"
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"type": "string",
|
|
99
|
+
"const": "high"
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"type": "string",
|
|
103
|
+
"const": "xhigh"
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"type": "string",
|
|
107
|
+
"const": "max"
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"description": "User-level last-applied thinking level per provider/model, shared by Pix TUI and Desktop model pickers."
|
|
113
|
+
},
|
|
60
114
|
"toolRenderer": {
|
|
61
115
|
"type": "object",
|
|
62
116
|
"properties": {
|
|
@@ -168,6 +222,14 @@
|
|
|
168
222
|
"modelRef": {
|
|
169
223
|
"type": "string",
|
|
170
224
|
"description": "Model used for prompt enhancement."
|
|
225
|
+
},
|
|
226
|
+
"fallbackModels": {
|
|
227
|
+
"type": "array",
|
|
228
|
+
"items": {
|
|
229
|
+
"type": "string",
|
|
230
|
+
"description": "Fallback provider/model identifier."
|
|
231
|
+
},
|
|
232
|
+
"description": "Ordered prompt-enhancer fallbacks tried after modelRef."
|
|
171
233
|
}
|
|
172
234
|
},
|
|
173
235
|
"description": "Prompt enhancer configuration."
|
|
@@ -179,6 +241,14 @@
|
|
|
179
241
|
"type": "string",
|
|
180
242
|
"description": "Model for inline autocomplete. Empty string disables LLM autocomplete."
|
|
181
243
|
},
|
|
244
|
+
"fallbackModels": {
|
|
245
|
+
"type": "array",
|
|
246
|
+
"items": {
|
|
247
|
+
"type": "string",
|
|
248
|
+
"description": "Fallback provider/model identifier."
|
|
249
|
+
},
|
|
250
|
+
"description": "Ordered autocomplete fallbacks tried after modelRef."
|
|
251
|
+
},
|
|
182
252
|
"debounceMs": {
|
|
183
253
|
"type": "number",
|
|
184
254
|
"description": "Delay after typing before requesting completion.",
|
|
@@ -273,41 +343,89 @@
|
|
|
273
343
|
"dictation": {
|
|
274
344
|
"type": "object",
|
|
275
345
|
"properties": {
|
|
346
|
+
"apiKey": {
|
|
347
|
+
"type": "string",
|
|
348
|
+
"description": "Deepgram API key used by terminal and desktop voice input. Store it in the user config (~/.config/pi/pix.jsonc); project-level .pi/pix.jsonc does not override this secret."
|
|
349
|
+
},
|
|
276
350
|
"language": {
|
|
277
351
|
"type": "string",
|
|
278
352
|
"description": "Selected language code, e.g. 'en' or 'ru'."
|
|
279
353
|
},
|
|
354
|
+
"model": {
|
|
355
|
+
"type": "string",
|
|
356
|
+
"description": "Deepgram speech-to-text model. Defaults to 'nova-3'."
|
|
357
|
+
},
|
|
280
358
|
"languages": {
|
|
281
359
|
"type": "object",
|
|
282
360
|
"patternProperties": {
|
|
283
361
|
"^.*$": {
|
|
284
362
|
"type": "object",
|
|
285
363
|
"required": [
|
|
286
|
-
"dirName",
|
|
287
|
-
"url",
|
|
288
364
|
"label"
|
|
289
365
|
],
|
|
290
366
|
"properties": {
|
|
291
|
-
"
|
|
367
|
+
"label": {
|
|
292
368
|
"type": "string",
|
|
293
|
-
"description": "
|
|
369
|
+
"description": "Human-readable language label."
|
|
294
370
|
},
|
|
295
|
-
"
|
|
371
|
+
"deepgramLanguage": {
|
|
296
372
|
"type": "string",
|
|
297
|
-
"description": "
|
|
373
|
+
"description": "Deepgram language code. Defaults to the language map key."
|
|
298
374
|
},
|
|
299
|
-
"
|
|
375
|
+
"dirName": {
|
|
300
376
|
"type": "string",
|
|
301
|
-
"description": "
|
|
377
|
+
"description": "Deprecated legacy Vosk model directory name; ignored by Deepgram dictation."
|
|
378
|
+
},
|
|
379
|
+
"url": {
|
|
380
|
+
"type": "string",
|
|
381
|
+
"description": "Deprecated legacy Vosk model URL; ignored by Deepgram dictation."
|
|
302
382
|
}
|
|
303
383
|
},
|
|
304
|
-
"description": "
|
|
384
|
+
"description": "Deepgram voice dictation language definition."
|
|
385
|
+
}
|
|
386
|
+
},
|
|
387
|
+
"description": "Available dictation languages keyed by local language code."
|
|
388
|
+
}
|
|
389
|
+
},
|
|
390
|
+
"description": "Voice dictation (Deepgram) configuration. Uses dictation.apiKey from the user pix config, with DEEPGRAM_API_KEY as a compatibility fallback."
|
|
391
|
+
},
|
|
392
|
+
"desktop": {
|
|
393
|
+
"type": "object",
|
|
394
|
+
"properties": {
|
|
395
|
+
"externalEditor": {
|
|
396
|
+
"type": "string",
|
|
397
|
+
"description": "External editor used by Pix Desktop project explorer. Known aliases include zed, code/vscode, cursor, subl/sublime, idea/intellij, and webstorm; an executable path/name is also accepted."
|
|
398
|
+
},
|
|
399
|
+
"git": {
|
|
400
|
+
"type": "object",
|
|
401
|
+
"properties": {
|
|
402
|
+
"reviewModelRef": {
|
|
403
|
+
"type": "string",
|
|
404
|
+
"description": "Model reference used by Pix Desktop and TUI for LLM review of Git diffs, optionally with a :thinking suffix."
|
|
405
|
+
},
|
|
406
|
+
"reviewFallbackModels": {
|
|
407
|
+
"type": "array",
|
|
408
|
+
"items": {
|
|
409
|
+
"type": "string"
|
|
410
|
+
},
|
|
411
|
+
"description": "Ordered fallback model references used for Git diff review."
|
|
412
|
+
},
|
|
413
|
+
"commitMessageModelRef": {
|
|
414
|
+
"type": "string",
|
|
415
|
+
"description": "Model reference used by Pix Desktop and TUI to generate Git commit messages, optionally with a :thinking suffix."
|
|
416
|
+
},
|
|
417
|
+
"commitMessageFallbackModels": {
|
|
418
|
+
"type": "array",
|
|
419
|
+
"items": {
|
|
420
|
+
"type": "string"
|
|
421
|
+
},
|
|
422
|
+
"description": "Ordered fallback model references used for Git commit-message generation."
|
|
305
423
|
}
|
|
306
424
|
},
|
|
307
|
-
"description": "
|
|
425
|
+
"description": "Pix Git/Source Control LLM preferences shared by Desktop and TUI."
|
|
308
426
|
}
|
|
309
427
|
},
|
|
310
|
-
"description": "
|
|
428
|
+
"description": "Pix Desktop preferences; the nested git model settings are also consumed by TUI Git helpers for compatibility."
|
|
311
429
|
}
|
|
312
430
|
},
|
|
313
431
|
"$id": "https://unpkg.com/pi-ui-extend/schemas/pix.json",
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "object",
|
|
3
|
+
"required": [
|
|
4
|
+
"version",
|
|
5
|
+
"tasks"
|
|
6
|
+
],
|
|
7
|
+
"properties": {
|
|
8
|
+
"$schema": {
|
|
9
|
+
"type": "string",
|
|
10
|
+
"description": "JSON Schema URL used by editors for validation and autocomplete."
|
|
11
|
+
},
|
|
12
|
+
"version": {
|
|
13
|
+
"type": "number",
|
|
14
|
+
"const": 1,
|
|
15
|
+
"description": "Task document format version."
|
|
16
|
+
},
|
|
17
|
+
"tasks": {
|
|
18
|
+
"type": "array",
|
|
19
|
+
"items": {
|
|
20
|
+
"type": "object",
|
|
21
|
+
"required": [
|
|
22
|
+
"id",
|
|
23
|
+
"title",
|
|
24
|
+
"type",
|
|
25
|
+
"status",
|
|
26
|
+
"priority",
|
|
27
|
+
"createdAt",
|
|
28
|
+
"updatedAt"
|
|
29
|
+
],
|
|
30
|
+
"properties": {
|
|
31
|
+
"id": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"minLength": 1,
|
|
34
|
+
"maxLength": 128,
|
|
35
|
+
"description": "Stable unique task id."
|
|
36
|
+
},
|
|
37
|
+
"title": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"maxLength": 200,
|
|
40
|
+
"description": "Short task title. May be empty when the task has description content."
|
|
41
|
+
},
|
|
42
|
+
"description": {
|
|
43
|
+
"type": "string",
|
|
44
|
+
"maxLength": 10000,
|
|
45
|
+
"description": "Optional detailed task description."
|
|
46
|
+
},
|
|
47
|
+
"type": {
|
|
48
|
+
"anyOf": [
|
|
49
|
+
{
|
|
50
|
+
"type": "string",
|
|
51
|
+
"const": "bug"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"type": "string",
|
|
55
|
+
"const": "feature"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"type": "string",
|
|
59
|
+
"const": "improvement"
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
"status": {
|
|
64
|
+
"anyOf": [
|
|
65
|
+
{
|
|
66
|
+
"type": "string",
|
|
67
|
+
"const": "backlog"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"type": "string",
|
|
71
|
+
"const": "todo"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"type": "string",
|
|
75
|
+
"const": "in-progress"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"type": "string",
|
|
79
|
+
"const": "done"
|
|
80
|
+
}
|
|
81
|
+
]
|
|
82
|
+
},
|
|
83
|
+
"priority": {
|
|
84
|
+
"anyOf": [
|
|
85
|
+
{
|
|
86
|
+
"type": "string",
|
|
87
|
+
"const": "low"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"type": "string",
|
|
91
|
+
"const": "medium"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"type": "string",
|
|
95
|
+
"const": "high"
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"type": "string",
|
|
99
|
+
"const": "urgent"
|
|
100
|
+
}
|
|
101
|
+
]
|
|
102
|
+
},
|
|
103
|
+
"sessionId": {
|
|
104
|
+
"type": "string",
|
|
105
|
+
"minLength": 1,
|
|
106
|
+
"maxLength": 512,
|
|
107
|
+
"description": "Optional Pi session associated with this task."
|
|
108
|
+
},
|
|
109
|
+
"createdAt": {
|
|
110
|
+
"type": "string",
|
|
111
|
+
"format": "date-time",
|
|
112
|
+
"description": "RFC 3339 creation timestamp."
|
|
113
|
+
},
|
|
114
|
+
"updatedAt": {
|
|
115
|
+
"type": "string",
|
|
116
|
+
"format": "date-time",
|
|
117
|
+
"description": "RFC 3339 last-update timestamp."
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
"additionalProperties": false
|
|
121
|
+
},
|
|
122
|
+
"maxItems": 10000,
|
|
123
|
+
"description": "Project tasks. Task ids must be unique."
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
"$id": "https://unpkg.com/pi-ui-extend/schemas/tasks.json",
|
|
127
|
+
"$schema": "https://json-schema.org/draft-07/schema#",
|
|
128
|
+
"title": "Pix Project Tasks",
|
|
129
|
+
"description": "Project-scoped task document stored in <cwd>/.pi/tasks.jsonc.",
|
|
130
|
+
"additionalProperties": false
|
|
131
|
+
}
|
package/skills/simplify/SKILL.md
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: simplify
|
|
3
|
-
description:
|
|
3
|
+
description: >-
|
|
4
|
+
Simplify and refine recently modified code for clarity, cohesion, and
|
|
5
|
+
consistency. Use after writing code, especially when files/functions are
|
|
6
|
+
growing, responsibilities are blurring, or a change adds structural
|
|
7
|
+
complexity. Preserve behavior.
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
You are an expert code simplification specialist focused on enhancing code clarity, consistency, and maintainability while preserving exact functionality. Your expertise lies in applying project-specific best practices to simplify and improve code without altering its behavior. You prioritize readable, explicit code over overly compact solutions. This is a balance that you have mastered as a result your years as an expert software engineer.
|
|
@@ -9,7 +13,8 @@ You will analyze recently modified code and apply refinements that:
|
|
|
9
13
|
|
|
10
14
|
1. **Preserve Functionality**: Never change what the code does - only how it does it. All original features, outputs, and behaviors must remain intact.
|
|
11
15
|
|
|
12
|
-
2. **Apply Project Standards**: Follow
|
|
16
|
+
2. **Apply Project Standards**: Follow `AGENTS.md`, any nearer scoped project
|
|
17
|
+
instructions, and the surrounding code conventions. In particular:
|
|
13
18
|
|
|
14
19
|
- Use ES modules with proper import sorting and extensions
|
|
15
20
|
- Prefer `function` keyword over arrow functions
|
|
@@ -18,7 +23,25 @@ You will analyze recently modified code and apply refinements that:
|
|
|
18
23
|
- Use proper error handling patterns (avoid try/catch when possible)
|
|
19
24
|
- Maintain consistent naming conventions
|
|
20
25
|
|
|
21
|
-
3. **
|
|
26
|
+
3. **Control File and Module Growth**: Do not let touched hand-written files
|
|
27
|
+
become dumping grounds for new behavior.
|
|
28
|
+
|
|
29
|
+
- Treat file size as a review signal, not a line-count game. Around 500 lines,
|
|
30
|
+
actively look for a cohesive extraction before adding substantial new
|
|
31
|
+
behavior. Around 800+ lines, do not keep adding substantial behavior unless
|
|
32
|
+
the file is intentionally declarative/generated or a clear composition root.
|
|
33
|
+
- Split by ownership and responsibility: move a complete concern, state machine,
|
|
34
|
+
service, policy, adapter, or component into a module with a clear API.
|
|
35
|
+
- Do not "fix" size by creating pass-through wrappers, arbitrary `part1`/`part2`
|
|
36
|
+
files, or fragments that increase navigation cost without reducing
|
|
37
|
+
responsibility.
|
|
38
|
+
- Prefer keeping state, I/O, rendering, and policy in distinct owners when they
|
|
39
|
+
can change independently.
|
|
40
|
+
- If a touched file is already oversized, avoid making it worse even when a full
|
|
41
|
+
cleanup is outside scope; extract the part directly related to the current
|
|
42
|
+
change when that produces a clean boundary.
|
|
43
|
+
|
|
44
|
+
4. **Enhance Clarity**: Simplify code structure by:
|
|
22
45
|
|
|
23
46
|
- Reducing unnecessary complexity and nesting
|
|
24
47
|
- Eliminating redundant code and abstractions
|
|
@@ -28,7 +51,7 @@ You will analyze recently modified code and apply refinements that:
|
|
|
28
51
|
- IMPORTANT: Avoid nested ternary operators - prefer switch statements or if/else chains for multiple conditions
|
|
29
52
|
- Choose clarity over brevity - explicit code is often better than overly compact code
|
|
30
53
|
|
|
31
|
-
|
|
54
|
+
5. **Maintain Balance**: Avoid over-simplification that could:
|
|
32
55
|
|
|
33
56
|
- Reduce code clarity or maintainability
|
|
34
57
|
- Create overly clever solutions that are hard to understand
|
|
@@ -36,8 +59,13 @@ You will analyze recently modified code and apply refinements that:
|
|
|
36
59
|
- Remove helpful abstractions that improve code organization
|
|
37
60
|
- Prioritize "fewer lines" over readability (e.g., nested ternaries, dense one-liners)
|
|
38
61
|
- Make the code harder to debug or extend
|
|
62
|
+
- Remove cancellation, generation/request guards, ownership checks, mutexes, or
|
|
63
|
+
other concurrency protections merely because they look redundant. For
|
|
64
|
+
async/reactive code, prove equivalent ordering and lifecycle semantics before
|
|
65
|
+
simplifying them.
|
|
39
66
|
|
|
40
|
-
|
|
67
|
+
6. **Focus Scope**: Only refine code that has been recently modified or touched
|
|
68
|
+
in the current session, unless explicitly instructed to review a broader scope.
|
|
41
69
|
|
|
42
70
|
Your refinement process:
|
|
43
71
|
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
# Spec: Desktop Markdown media previews
|
|
2
|
-
|
|
3
|
-
## Type
|
|
4
|
-
|
|
5
|
-
Change
|
|
6
|
-
|
|
7
|
-
## Goal
|
|
8
|
-
|
|
9
|
-
Show an inline preview when transcript Markdown links to a supported local image or video, including `file://` artifacts outside the active workspace, and keep every local artifact label actionable.
|
|
10
|
-
|
|
11
|
-
## Scope
|
|
12
|
-
|
|
13
|
-
- Relative Markdown destinations that resolve inside the active workspace.
|
|
14
|
-
- Absolute local paths expressed as `file://` Markdown destinations, such as QA artifacts in the system temporary directory.
|
|
15
|
-
- Image formats: AVIF, BMP, GIF, JPEG, PNG, SVG, and WebP.
|
|
16
|
-
- Video formats: M4V, MOV, MP4, OGV, and WebM.
|
|
17
|
-
- Both ordinary Markdown links and local Markdown image syntax.
|
|
18
|
-
|
|
19
|
-
## Non-goals
|
|
20
|
-
|
|
21
|
-
- Embedding remote media.
|
|
22
|
-
- Adding codecs beyond those supported by the desktop WebView.
|
|
23
|
-
- Changing previews for non-media project files.
|
|
24
|
-
- Inline previews for non-media `file://` artifacts; those remain links and open in the operating-system default application.
|
|
25
|
-
|
|
26
|
-
## Behavior
|
|
27
|
-
|
|
28
|
-
- A supported local media link renders an inline, bounded preview with its Markdown label as a caption.
|
|
29
|
-
- A supported `file://` media link uses the same preview treatment after its URL is decoded to an absolute local path.
|
|
30
|
-
- Images are lazy-loaded and open the existing media preview dialog when clicked.
|
|
31
|
-
- Videos expose native inline playback controls; their caption opens the media preview dialog.
|
|
32
|
-
- A missing, disallowed, or unrenderable media file leaves a readable fallback and a clickable caption.
|
|
33
|
-
- Opening a supported media link uses the media path flow, not the UTF-8 source-file reader.
|
|
34
|
-
- Other relative project links continue to open the source preview dialog.
|
|
35
|
-
- Other `file://` links remain visibly clickable and open only after an explicit click.
|
|
36
|
-
|
|
37
|
-
## Contracts
|
|
38
|
-
|
|
39
|
-
- The frontend requests a resolved media file using the active workspace and normalized relative path.
|
|
40
|
-
- The backend canonicalizes both workspace and destination, rejects traversal and symlink escapes, verifies a supported extension, and grants asset-protocol access only to the resolved file.
|
|
41
|
-
- A `file://` destination is accepted only when it decodes to an absolute path. The backend canonicalizes it, requires an existing regular file, and grants asset-protocol access only for supported image/video previews.
|
|
42
|
-
- Non-media local files are passed to the OS opener only in response to a user click.
|
|
43
|
-
- Markdown output continues to escape labels, paths, and attributes before insertion through `{@html}`.
|
|
44
|
-
|
|
45
|
-
## Edge cases
|
|
46
|
-
|
|
47
|
-
- URL-like, absolute, control-character, and parent-traversing destinations are not treated as project media.
|
|
48
|
-
- URL schemes other than `file://`, malformed file URLs, relative `file:` forms, and decoded control characters are not treated as local files.
|
|
49
|
-
- Query strings and fragments are removed by the existing project-path normalization.
|
|
50
|
-
- Media loading failures do not replace the transcript with a global error.
|
|
51
|
-
- Clicking a failed media caption still reports the underlying file-resolution error through the normal project-file action.
|
|
52
|
-
|
|
53
|
-
## Related files
|
|
54
|
-
|
|
55
|
-
- `desktop/src/lib/markdown.ts`
|
|
56
|
-
- `desktop/src/components/MarkdownText.svelte`
|
|
57
|
-
- `desktop/src/App.svelte`
|
|
58
|
-
- `desktop/src-tauri/src/lib.rs`
|
|
59
|
-
|
|
60
|
-
## Verification
|
|
61
|
-
|
|
62
|
-
- Markdown unit tests cover workspace and `file://` image/video links, image syntax, escaping, and rejected destinations.
|
|
63
|
-
- Rust unit tests cover supported workspace/absolute media, unsupported binary files, relative local paths, traversal, and workspace containment.
|
|
64
|
-
- `npm run test`, `npm run check`, and `npm run build:web` pass in `desktop/`.
|
|
65
|
-
- `cargo test` passes in `desktop/src-tauri/`.
|
|
66
|
-
|
|
67
|
-
## Risks / unknowns
|
|
68
|
-
|
|
69
|
-
- Actual video playback remains codec-dependent in the operating-system WebView; load failures use the fallback state.
|
|
70
|
-
- A transcript can request an inline view of any readable local image/video via an explicit `file://` URL. The bytes remain local and are exposed only to the app's scoped asset protocol.
|
|
71
|
-
|
|
72
|
-
## Evidence
|
|
73
|
-
|
|
74
|
-
- Confirmed by code: relative links currently call `read_project_file`, which always decodes bytes as UTF-8.
|
|
75
|
-
- Confirmed by code: attachment previews already use Tauri's scoped asset protocol and the existing media dialog.
|
|
76
|
-
- Confirmed by the reported session: QA artifact links use `file:///tmp/...`, which the project-path normalizer intentionally rejects and previously reduced to plain labels.
|
|
77
|
-
- Confirmed by tests: project paths are normalized and constrained to the active workspace.
|
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
# Browser QA sub-agent specification
|
|
2
|
-
|
|
3
|
-
## Goal
|
|
4
|
-
|
|
5
|
-
Provide a cheap, fast `browser-qa` async-subagent that reproduces browser bugs
|
|
6
|
-
and proves fixes with deterministic assertions plus screenshot, video, and trace
|
|
7
|
-
evidence. Its ranked `models` list prefers `zai/glm-5.3-flash`, then
|
|
8
|
-
`openai-codex/gpt-5.6-luna`, filtered by the active preset's model pool and
|
|
9
|
-
confirmed runtime image support.
|
|
10
|
-
|
|
11
|
-
## Inline agent workflow and skill isolation
|
|
12
|
-
|
|
13
|
-
- All operating instructions, flow contracts, scenario-design guidance, and
|
|
14
|
-
auth-scaffolding rules live in `src/async-subagents/agents/browser-qa.md`.
|
|
15
|
-
Its body becomes the QA child's `promptAppend` through the shared agent
|
|
16
|
-
loader. Parent and router catalogs include only its short `description`.
|
|
17
|
-
- Runner code, vendor dependencies/licenses, and optional JSONC examples live
|
|
18
|
-
under `src/async-subagents/agents/browser-qa/`; none is a discoverable skill.
|
|
19
|
-
- Sub-agent processes disable normal extension discovery, then always load the
|
|
20
|
-
suite's model-tools extension. They load the Antigravity provider extension
|
|
21
|
-
only when an Antigravity model is explicitly selected.
|
|
22
|
-
- A type profile may declare `isolatedSkills`. Spawning that profile adds
|
|
23
|
-
`--no-skills` followed by one explicit `--skill` per configured path.
|
|
24
|
-
- `browser-qa` always disables normal skill discovery and filters skill flags
|
|
25
|
-
out of `extraArgs`, even without configured skills. It no longer injects a
|
|
26
|
-
mandatory QA skill. Explicitly configured skills are optional additions.
|
|
27
|
-
- The launcher sets `PI_BROWSER_QA_RUNNER` to the absolute installed runner path,
|
|
28
|
-
replacing inherited values, and strips it from ordinary child environments.
|
|
29
|
-
QA invokes `node "$PI_BROWSER_QA_RUNNER"` without guessing paths from cwd.
|
|
30
|
-
- Model-only profile overrides inherit the workflow. An explicit profile
|
|
31
|
-
`promptAppend` replaces the body like any other agent profile; it is not an
|
|
32
|
-
immutable security boundary. Runtime protections remain in the runner.
|
|
33
|
-
|
|
34
|
-
## Authentication contract
|
|
35
|
-
|
|
36
|
-
- Public browser QA requires no auth profile and does not create or require
|
|
37
|
-
`.pi/qa_auth.jsonc`. Its explicit base URL supplies the one exact allowed
|
|
38
|
-
origin, and the runner still blocks every other HTTP(S)/WebSocket origin.
|
|
39
|
-
- Auth profiles live in project-local `.pi/qa_auth.jsonc` and are selected by
|
|
40
|
-
explicit id. The file must be a real project-local file with mode `0600` on
|
|
41
|
-
POSIX. Profile listings expose only `id`, description, and traits.
|
|
42
|
-
- Listing profiles when the file is absent returns an empty list without side
|
|
43
|
-
effects. When authenticated QA explicitly requests credentials and that file
|
|
44
|
-
is absent, the runner creates a private empty template and returns
|
|
45
|
-
`provide_credentials`.
|
|
46
|
-
The sub-agent must explicitly ask the user to fill the reported file and
|
|
47
|
-
rerun QA; it must not read or edit the credential values itself.
|
|
48
|
-
- Every profile requires one or more exact `allowedOrigins`. Secret-bearing auth
|
|
49
|
-
is applied only to those origins; all other HTTP(S)/WebSocket traffic and
|
|
50
|
-
service workers are blocked during QA.
|
|
51
|
-
- Supported auth types are `form`, `cookie`, `localStorage`, `sessionStorage`,
|
|
52
|
-
`bearer`, and existing Playwright `storageState`.
|
|
53
|
-
- The bundled runner reads secrets internally. Credentials must never be copied
|
|
54
|
-
into prompts, generated QA flows, shell arguments, transcripts, reports,
|
|
55
|
-
or QA evidence.
|
|
56
|
-
- Generated browser state is private cache under `.pi/qa-auth-state`. Ephemeral
|
|
57
|
-
flows, evidence, and result manifests are written under the owning agent's
|
|
58
|
-
`.pi/subagents/<run>/<agent-id>/browser-qa/` workspace. Multiple profiles use
|
|
59
|
-
separate browser contexts/evidence directories, and normal sub-agent shutdown
|
|
60
|
-
or cleanup removes the whole workspace with its run.
|
|
61
|
-
- Missing, rejected, or expired explicitly selected auth returns a
|
|
62
|
-
machine-readable update-required status naming only the profile id, config
|
|
63
|
-
file, and redacted reason. The parent asks the user to update the file and
|
|
64
|
-
reruns; there is no `/qa-auth` command.
|
|
65
|
-
|
|
66
|
-
## QA execution contract
|
|
67
|
-
|
|
68
|
-
- A model-authored QA flow is declarative JSONC, not executable JavaScript. The
|
|
69
|
-
trusted runner implements a bounded set of navigation, interaction,
|
|
70
|
-
assertion, screenshot, and auth-rejection actions and never gives the flow a
|
|
71
|
-
Playwright context or credential values.
|
|
72
|
-
- Target discovery is a bounded preflight, not an open-ended research task. The
|
|
73
|
-
sub-agent invokes the runner within 45 seconds or returns `BLOCKED`; it does
|
|
74
|
-
not spend the full launcher budget reading source or probing prerequisites.
|
|
75
|
-
- The launcher injects `PI_SUBAGENT_AGENT_DIR`, pre-creates a private
|
|
76
|
-
`browser-qa/flows/` workspace, and clears stale browser QA files when an agent
|
|
77
|
-
id is reused. The runner validates the directory's project/type metadata and
|
|
78
|
-
refuses flows outside it; the model cannot select a shared evidence root.
|
|
79
|
-
- The runner owns browser lifecycle, origin checks, auth application, tracing,
|
|
80
|
-
screenshots, video finalization, and redacted result output. Before retaining
|
|
81
|
-
a trace it removes network/non-image resource entries, redacts configured and
|
|
82
|
-
runtime storage credentials, and verifies those values are absent.
|
|
83
|
-
- After every navigation or visible interaction, the runner waits for DOM
|
|
84
|
-
readiness, completion of requests started by the action, and disappearance of
|
|
85
|
-
common visible busy/spinner/skeleton markers. It requires a 500 ms stable
|
|
86
|
-
interval before the next action so recordings remain readable; a page that
|
|
87
|
-
stays busy through the flow timeout fails closed instead of being tested as a
|
|
88
|
-
loading shell. App-specific readiness still requires an explicit declarative
|
|
89
|
-
wait/assertion in the authored flow.
|
|
90
|
-
- Before any page is created, the runner installs a context-wide, isolated
|
|
91
|
-
interaction visualizer. Recorded clicks/double-clicks show a transient cursor
|
|
92
|
-
and pulse. Native drag/drop is replayed for 450 ms with a large orange cursor,
|
|
93
|
-
progressively drawn high-contrast path, and green drop marker. It also covers
|
|
94
|
-
same-origin frames, declared popups, and form-auth submission. The layer is
|
|
95
|
-
accessibility-hidden, pointer-transparent, never cancels application events,
|
|
96
|
-
and its bounded animations clear within the post-action stable interval.
|
|
97
|
-
- Success and post-launch failure results include typed artifact groups. Every
|
|
98
|
-
item has an absolute filesystem path and a `file:` URI; the sub-agent must
|
|
99
|
-
present each item as a clickable Markdown link instead of reporting only the
|
|
100
|
-
evidence directory.
|
|
101
|
-
- Success requires deterministic assertions. Visual inspection supplements,
|
|
102
|
-
but never replaces, explicit expected-state checks.
|
|
103
|
-
- Auth rejection discovered by a QA flow is reported through the
|
|
104
|
-
`authRejectedIf` action so the parent gets an update-required status.
|
|
105
|
-
|
|
106
|
-
## Reliability and shutdown contract
|
|
107
|
-
|
|
108
|
-
- The built-in `browser-qa` profile has a 300-second wall-clock budget unless
|
|
109
|
-
the caller explicitly supplies a task or spawn timeout. This bounds model
|
|
110
|
-
stalls as well as browser work.
|
|
111
|
-
- The trusted runner has its own bounded lifecycle. Browser launch, context
|
|
112
|
-
setup, auth, flow execution, evidence finalization, and browser shutdown must
|
|
113
|
-
not wait forever; a timeout reports the last started stage without exposing
|
|
114
|
-
flow contents or credentials.
|
|
115
|
-
- Trace sanitization runs in a memory-limited worker that can be terminated at
|
|
116
|
-
the cleanup deadline; synchronous archive work cannot defeat the watchdog.
|
|
117
|
-
- The launcher always writes a small sanitized `progress.jsonl` journal in the
|
|
118
|
-
agent directory. It records lifecycle/RPC event types and tool names, but not
|
|
119
|
-
prompts, tool arguments, tool results, model text, or secrets. The browser
|
|
120
|
-
runner writes similarly sanitized stage entries under its private workspace.
|
|
121
|
-
- On POSIX, newly launched agents own a process group. Settled, timed-out, and
|
|
122
|
-
explicitly stopped agents signal that group rather than only the Pi process;
|
|
123
|
-
timeout/settled shutdown escalates to `SIGKILL` after its grace period. On
|
|
124
|
-
Windows the existing recursive `taskkill /T /F` behavior remains in force.
|
|
125
|
-
- Process-tree cleanup is scoped to a launcher-created process-group marker so
|
|
126
|
-
an old or externally-created PID is never treated as an owned process group.
|
|
127
|
-
User browser sessions outside that group must not be signalled.
|
|
128
|
-
- Playwright can launch Chromium in its own POSIX process group. On runner
|
|
129
|
-
failure the runner snapshots and kills only its own descendants before it
|
|
130
|
-
exits, covering that detached browser tree without touching a user's browser.
|
|
131
|
-
|
|
132
|
-
## Acceptance criteria
|
|
133
|
-
|
|
134
|
-
1. `browser-qa` resolves to the intended model/fallback and its inline Markdown
|
|
135
|
-
workflow, and its isolated child process can register the configured
|
|
136
|
-
model provider.
|
|
137
|
-
2. Default QA spawn args contain `--no-skills` but no `--skill`. The child
|
|
138
|
-
receives the full workflow in its initial prompt and can invoke the bundled
|
|
139
|
-
runner through `PI_BROWSER_QA_RUNNER` from an unrelated project directory.
|
|
140
|
-
Optional configured skills still load; ordinary profiles retain existing
|
|
141
|
-
skill discovery behavior and do not receive QA-only environment paths.
|
|
142
|
-
3. Auth profile listing and all error output are redacted; model-authored input
|
|
143
|
-
cannot execute code in the credential-bearing process.
|
|
144
|
-
4. Runner tests cover public execution without an auth file, explicit profile
|
|
145
|
-
selection, all auth modes, fail-closed origins, path/mode hardening, private
|
|
146
|
-
empty-template creation only on an explicit auth request, non-executable
|
|
147
|
-
flows, and successful redacted evidence creation.
|
|
148
|
-
5. Browser QA flows/evidence live only inside the owning sub-agent directory;
|
|
149
|
-
deleting the run removes them while persistent auth config/state remains.
|
|
150
|
-
6. Runner tests prove that network activity and visible loading indicators are
|
|
151
|
-
awaited, persistent loading fails the flow, visible actions retain a stable
|
|
152
|
-
500 ms video interval, and context-wide click/drag video visualization is
|
|
153
|
-
installed with bounded click pacing.
|
|
154
|
-
7. Completed test runs report clickable screenshot, video, and trace links
|
|
155
|
-
whenever those artifacts exist.
|
|
156
|
-
8. Timeout tests identify the last browser stage, launcher progress remains
|
|
157
|
-
available when full RPC logging is disabled, and process-tree tests prove a
|
|
158
|
-
descendant is terminated without signalling unrelated processes.
|
|
159
|
-
9. Suite tests/typecheck, host checks, and suite sync pass.
|
|
160
|
-
|
|
161
|
-
## Real-browser regression test
|
|
162
|
-
|
|
163
|
-
The repository includes a local mock-page E2E that launches real Chromium and
|
|
164
|
-
asserts PNG screenshots, WebM video, sanitized trace output, and absolute
|
|
165
|
-
path/`file:` URI metadata:
|
|
166
|
-
|
|
167
|
-
```bash
|
|
168
|
-
npx playwright install chromium
|
|
169
|
-
npm run test:browser-qa-e2e
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
Normal suite tests keep this case skipped; the Publish workflow runs it on
|
|
173
|
-
Linux after installing Chromium. The runner writes into a temporary simulated
|
|
174
|
-
sub-agent directory. For manual inspection only, explicit E2E runs copy the
|
|
175
|
-
latest artifacts to `.pi/qa-runs/browser-qa-e2e/latest/` and print clickable
|
|
176
|
-
links; this test-only published copy is not the runtime storage contract. Set
|
|
177
|
-
`BROWSER_QA_KEEP_EVIDENCE=0` to skip that copy.
|