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.
Files changed (236) hide show
  1. package/README.md +50 -13
  2. package/dist/app/app.d.ts +13 -0
  3. package/dist/app/app.js +158 -8
  4. package/dist/app/cli/install.js +2 -2
  5. package/dist/app/commands/command-controller.d.ts +4 -0
  6. package/dist/app/commands/command-controller.js +11 -0
  7. package/dist/app/commands/command-git-actions.d.ts +25 -0
  8. package/dist/app/commands/command-git-actions.js +381 -0
  9. package/dist/app/commands/command-host.d.ts +4 -0
  10. package/dist/app/commands/command-host.js +5 -2
  11. package/dist/app/commands/command-model-actions.d.ts +1 -0
  12. package/dist/app/commands/command-model-actions.js +57 -35
  13. package/dist/app/commands/command-navigation-actions.d.ts +1 -0
  14. package/dist/app/commands/command-navigation-actions.js +16 -3
  15. package/dist/app/commands/command-registry.d.ts +2 -0
  16. package/dist/app/commands/command-registry.js +15 -1
  17. package/dist/app/commands/command-session-actions.js +9 -3
  18. package/dist/app/commands/reload-context-inventory.d.ts +11 -0
  19. package/dist/app/commands/reload-context-inventory.js +70 -0
  20. package/dist/app/extensions/extension-actions-controller.d.ts +1 -0
  21. package/dist/app/extensions/extension-actions-controller.js +6 -0
  22. package/dist/app/extensions/subagent-catalog-state.d.ts +9 -0
  23. package/dist/app/extensions/subagent-catalog-state.js +23 -0
  24. package/dist/app/input/autocomplete-controller.js +61 -34
  25. package/dist/app/input/input-action-controller.d.ts +2 -0
  26. package/dist/app/input/input-action-controller.js +8 -1
  27. package/dist/app/input/input-controller.d.ts +2 -1
  28. package/dist/app/input/input-controller.js +7 -2
  29. package/dist/app/input/prompt-enhancer-controller.js +53 -35
  30. package/dist/app/input/voice-controller.d.ts +41 -45
  31. package/dist/app/input/voice-controller.js +351 -419
  32. package/dist/app/model/model-usage-controller.js +17 -7
  33. package/dist/app/model/model-usage-status.d.ts +4 -1
  34. package/dist/app/model/model-usage-status.js +270 -46
  35. package/dist/app/popup/menu-items-controller.d.ts +13 -3
  36. package/dist/app/popup/menu-items-controller.js +37 -21
  37. package/dist/app/popup/popup-action-controller.d.ts +12 -2
  38. package/dist/app/popup/popup-action-controller.js +77 -24
  39. package/dist/app/popup/popup-menu-controller.d.ts +36 -14
  40. package/dist/app/popup/popup-menu-controller.js +239 -69
  41. package/dist/app/rendering/dcp-stats.d.ts +9 -4
  42. package/dist/app/rendering/dcp-stats.js +40 -425
  43. package/dist/app/rendering/editor-panels.js +10 -4
  44. package/dist/app/rendering/popup-menu-renderer.d.ts +3 -5
  45. package/dist/app/rendering/popup-menu-renderer.js +42 -37
  46. package/dist/app/rendering/render-controller.js +23 -2
  47. package/dist/app/rendering/status-line-renderer.d.ts +5 -0
  48. package/dist/app/rendering/status-line-renderer.js +41 -5
  49. package/dist/app/rendering/tab-line-renderer.js +26 -20
  50. package/dist/app/runtime.d.ts +12 -1
  51. package/dist/app/runtime.js +120 -12
  52. package/dist/app/screen/mouse-controller.d.ts +2 -0
  53. package/dist/app/screen/mouse-controller.js +17 -7
  54. package/dist/app/screen/status-controller.d.ts +4 -0
  55. package/dist/app/screen/status-controller.js +5 -0
  56. package/dist/app/session/lazy-session-manager.js +34 -0
  57. package/dist/app/session/session-event-controller.d.ts +1 -0
  58. package/dist/app/session/session-event-controller.js +10 -1
  59. package/dist/app/session/session-history.d.ts +1 -0
  60. package/dist/app/session/session-history.js +12 -1
  61. package/dist/app/session/session-lifecycle-controller.d.ts +7 -1
  62. package/dist/app/session/session-lifecycle-controller.js +16 -1
  63. package/dist/app/session/tabs-controller.d.ts +26 -1
  64. package/dist/app/session/tabs-controller.js +454 -147
  65. package/dist/app/subagents/subagents-files.js +60 -1
  66. package/dist/app/subagents/subagents-model.d.ts +1 -0
  67. package/dist/app/subagents/subagents-model.js +18 -2
  68. package/dist/app/subagents/subagents-widget-controller.d.ts +1 -0
  69. package/dist/app/subagents/subagents-widget-controller.js +6 -0
  70. package/dist/app/types.d.ts +16 -1
  71. package/dist/app/workspace/workspace-actions-controller.js +10 -2
  72. package/dist/app/workspace/workspace-undo.d.ts +1 -0
  73. package/dist/app/workspace/workspace-undo.js +1 -0
  74. package/dist/bundled-extensions/question/index.js +9 -1
  75. package/dist/bundled-extensions/question/remote.d.ts +4 -0
  76. package/dist/bundled-extensions/question/remote.js +33 -0
  77. package/dist/bundled-extensions/telegram-connector/bot.d.ts +43 -0
  78. package/dist/bundled-extensions/telegram-connector/bot.js +166 -0
  79. package/dist/bundled-extensions/telegram-connector/config.d.ts +8 -0
  80. package/dist/bundled-extensions/telegram-connector/config.js +87 -0
  81. package/dist/bundled-extensions/telegram-connector/coordinator.d.ts +66 -0
  82. package/dist/bundled-extensions/telegram-connector/coordinator.js +413 -0
  83. package/dist/bundled-extensions/telegram-connector/index.d.ts +3 -0
  84. package/dist/bundled-extensions/telegram-connector/index.js +195 -0
  85. package/dist/bundled-extensions/terminal-bell/index.d.ts +0 -8
  86. package/dist/bundled-extensions/terminal-bell/index.js +0 -76
  87. package/dist/bundled-extensions/workspace-undo/index.d.ts +26 -0
  88. package/dist/bundled-extensions/workspace-undo/index.js +191 -0
  89. package/dist/config.d.ts +21 -2
  90. package/dist/config.js +159 -32
  91. package/dist/default-pix-config.js +25 -5
  92. package/dist/schemas/index.d.ts +1 -0
  93. package/dist/schemas/index.js +1 -0
  94. package/dist/schemas/pi-tools-suite-schema.d.ts +88 -62
  95. package/dist/schemas/pi-tools-suite-schema.js +54 -83
  96. package/dist/schemas/pix-schema.d.ts +19 -2
  97. package/dist/schemas/pix-schema.js +47 -5
  98. package/dist/schemas/tasks-schema.d.ts +18 -0
  99. package/dist/schemas/tasks-schema.js +41 -0
  100. package/docs/concurrency.md +9 -1
  101. package/docs/desktop-mvp.md +22 -6
  102. package/docs/desktop-task-manager.md +148 -84
  103. package/docs/release.md +30 -6
  104. package/external/pi-tools-suite/README.md +197 -84
  105. package/external/pi-tools-suite/docs/evals.md +1 -1
  106. package/external/pi-tools-suite/docs/session-recovery.md +47 -14
  107. package/external/pi-tools-suite/docs/subagent-model-pools.md +48 -30
  108. package/external/pi-tools-suite/docs/ui-qa-subagent.md +440 -0
  109. package/external/pi-tools-suite/package.json +6 -1
  110. package/external/pi-tools-suite/src/antigravity-auth/auth-store.ts +2 -1
  111. package/external/pi-tools-suite/src/antigravity-auth/constants.ts +9 -3
  112. package/external/pi-tools-suite/src/antigravity-auth/headers.ts +41 -3
  113. package/external/pi-tools-suite/src/antigravity-auth/models.ts +94 -21
  114. package/external/pi-tools-suite/src/antigravity-auth/oauth.ts +5 -17
  115. package/external/pi-tools-suite/src/antigravity-auth/payload.ts +72 -7
  116. package/external/pi-tools-suite/src/antigravity-auth/stream.ts +13 -1
  117. package/external/pi-tools-suite/src/async-subagents/agents/frontier-review.md +23 -0
  118. package/external/pi-tools-suite/src/async-subagents/agents/implement.md +1 -1
  119. package/external/pi-tools-suite/src/async-subagents/agents/presets.jsonc +16 -0
  120. package/external/pi-tools-suite/src/async-subagents/agents/research.md +5 -3
  121. package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/backends/browser.mjs +346 -0
  122. package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/backends/desktop.mjs +1038 -0
  123. package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/backends/tui.mjs +759 -0
  124. package/external/pi-tools-suite/src/async-subagents/agents/{browser-qa → ui-qa/browser}/scripts/browser-qa-runner.mjs +32 -23
  125. package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/drivers/chrome-devtools/chrome-devtools-provider.mjs +895 -0
  126. package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/drivers/linux/linux-atspi.py +494 -0
  127. package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/drivers/macos/macos-accessibility.swift +1085 -0
  128. package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/drivers/native-terminal/bridge-client.mjs +50 -0
  129. package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/drivers/native-terminal/native-terminal-host.mjs +501 -0
  130. package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/drivers/windows/windows-uia.ps1 +454 -0
  131. package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/guides/browser-auth.md +114 -0
  132. package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/guides/browser-chrome-devtools.md +91 -0
  133. package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/guides/browser-playwright.md +145 -0
  134. package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/guides/browser.md +82 -0
  135. package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/guides/desktop-linux.md +26 -0
  136. package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/guides/desktop-macos.md +29 -0
  137. package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/guides/desktop-windows.md +23 -0
  138. package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/guides/desktop.md +54 -0
  139. package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/guides/tui-native-terminal.md +59 -0
  140. package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/guides/tui-pty.md +37 -0
  141. package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/guides/tui.md +60 -0
  142. package/external/pi-tools-suite/src/async-subagents/agents/ui-qa/scripts/ui-qa-runner.mjs +535 -0
  143. package/external/pi-tools-suite/src/async-subagents/agents/ui-qa.md +75 -0
  144. package/external/pi-tools-suite/src/async-subagents/commands.ts +15 -71
  145. package/external/pi-tools-suite/src/async-subagents/core/activity.ts +33 -0
  146. package/external/pi-tools-suite/src/async-subagents/core/agent-catalog.ts +5 -4
  147. package/external/pi-tools-suite/src/async-subagents/core/agent-strategy.ts +1 -1
  148. package/external/pi-tools-suite/src/async-subagents/core/agents-dir.ts +8 -5
  149. package/external/pi-tools-suite/src/async-subagents/core/browser-qa.ts +16 -2
  150. package/external/pi-tools-suite/src/async-subagents/core/config.ts +160 -327
  151. package/external/pi-tools-suite/src/async-subagents/core/model-selection.ts +2 -1
  152. package/external/pi-tools-suite/src/async-subagents/core/registry.ts +158 -33
  153. package/external/pi-tools-suite/src/async-subagents/core/routing.ts +21 -5
  154. package/external/pi-tools-suite/src/async-subagents/core/spawn.ts +40 -26
  155. package/external/pi-tools-suite/src/async-subagents/core/state.ts +40 -0
  156. package/external/pi-tools-suite/src/async-subagents/core/types.ts +7 -0
  157. package/external/pi-tools-suite/src/async-subagents/core/ultrawork-auto.ts +51 -45
  158. package/external/pi-tools-suite/src/async-subagents/index.ts +69 -5
  159. package/external/pi-tools-suite/src/async-subagents/lib.ts +16 -9
  160. package/external/pi-tools-suite/src/async-subagents/tools/spawn.ts +8 -5
  161. package/external/pi-tools-suite/src/async-subagents/tools/subagents.ts +5 -4
  162. package/external/pi-tools-suite/src/async-subagents/types.ts +1 -0
  163. package/external/pi-tools-suite/src/coding-discipline/index.ts +90 -59
  164. package/external/pi-tools-suite/src/config.ts +55 -1
  165. package/external/pi-tools-suite/src/context-gateway/accounting-log.ts +282 -0
  166. package/external/pi-tools-suite/src/context-gateway/config.ts +77 -3
  167. package/external/pi-tools-suite/src/context-gateway/efficiency.ts +414 -0
  168. package/external/pi-tools-suite/src/context-gateway/enforcement.ts +222 -0
  169. package/external/pi-tools-suite/src/context-gateway/index.ts +206 -19
  170. package/external/pi-tools-suite/src/context-gateway/storeless-capabilities.ts +7 -7
  171. package/external/pi-tools-suite/src/context-gateway/telemetry.ts +101 -28
  172. package/external/pi-tools-suite/src/context-gateway/types.ts +16 -3
  173. package/external/pi-tools-suite/src/context-inventory.ts +99 -0
  174. package/external/pi-tools-suite/src/dcp/auto-compress-budget.ts +39 -4
  175. package/external/pi-tools-suite/src/dcp/auto-compress.ts +128 -49
  176. package/external/pi-tools-suite/src/dcp/commands.ts +32 -156
  177. package/external/pi-tools-suite/src/dcp/compress-tool.ts +177 -46
  178. package/external/pi-tools-suite/src/dcp/compression-blocks.ts +6 -58
  179. package/external/pi-tools-suite/src/dcp/compression-preview.ts +9 -0
  180. package/external/pi-tools-suite/src/dcp/compression-progress.ts +22 -0
  181. package/external/pi-tools-suite/src/dcp/config.ts +114 -17
  182. package/external/pi-tools-suite/src/dcp/conversation-index.ts +36 -9
  183. package/external/pi-tools-suite/src/dcp/diagnostics.ts +41 -0
  184. package/external/pi-tools-suite/src/dcp/fresh-tool-results.ts +38 -0
  185. package/external/pi-tools-suite/src/dcp/index.ts +338 -66
  186. package/external/pi-tools-suite/src/dcp/journal.ts +126 -4
  187. package/external/pi-tools-suite/src/dcp/progress-controller.ts +2 -1
  188. package/external/pi-tools-suite/src/dcp/prompts.ts +83 -192
  189. package/external/pi-tools-suite/src/dcp/protected-continuity.ts +175 -0
  190. package/external/pi-tools-suite/src/dcp/pruner-candidates.ts +93 -3
  191. package/external/pi-tools-suite/src/dcp/pruner-message-ids.ts +6 -10
  192. package/external/pi-tools-suite/src/dcp/pruner-nudge.ts +36 -33
  193. package/external/pi-tools-suite/src/dcp/pruner-tools.ts +6 -3
  194. package/external/pi-tools-suite/src/dcp/pruner.ts +1 -0
  195. package/external/pi-tools-suite/src/dcp/routine-pressure.ts +86 -0
  196. package/external/pi-tools-suite/src/dcp/state.ts +9 -0
  197. package/external/pi-tools-suite/src/dcp/statistics.d.ts +8 -0
  198. package/external/pi-tools-suite/src/dcp/statistics.js +156 -0
  199. package/external/pi-tools-suite/src/default-pi-tools-suite-config.ts +78 -22
  200. package/external/pi-tools-suite/src/index.ts +7 -1
  201. package/external/pi-tools-suite/src/lib/project.ts +36 -1
  202. package/external/pi-tools-suite/src/model-tools/index.ts +10 -7
  203. package/external/pi-tools-suite/src/repo-discovery/index.ts +304 -4
  204. package/external/pi-tools-suite/src/resource-registry/index.ts +2551 -0
  205. package/external/pi-tools-suite/src/session-recovery/index.ts +17 -0
  206. package/external/pi-tools-suite/src/shell-command-policy.ts +219 -0
  207. package/external/pi-tools-suite/src/todo/index.ts +21 -0
  208. package/external/pi-tools-suite/src/todo/todo.ts +19 -1
  209. package/external/pi-tools-suite/src/tool-descriptions.ts +47 -19
  210. package/package.json +10 -9
  211. package/schemas/pi-tools-suite.json +466 -287
  212. package/schemas/pix.json +129 -11
  213. package/schemas/tasks.json +131 -0
  214. package/skills/simplify/SKILL.md +33 -5
  215. package/docs/desktop-markdown-media.md +0 -77
  216. package/external/pi-tools-suite/docs/browser-qa-subagent.md +0 -177
  217. package/external/pi-tools-suite/docs/dcp-emergency-current-turn.md +0 -102
  218. package/external/pi-tools-suite/src/async-subagents/agents/browser-qa.md +0 -598
  219. package/external/pi-tools-suite/src/async-subagents/async-subagents.sample.jsonc +0 -54
  220. package/external/pi-tools-suite/src/skill-installer/index.ts +0 -333
  221. package/skills/playwright-cli/SKILL.md +0 -420
  222. package/skills/playwright-cli/references/element-attributes.md +0 -23
  223. package/skills/playwright-cli/references/playwright-tests.md +0 -50
  224. package/skills/playwright-cli/references/request-mocking.md +0 -87
  225. package/skills/playwright-cli/references/running-code.md +0 -241
  226. package/skills/playwright-cli/references/session-management.md +0 -273
  227. package/skills/playwright-cli/references/spec-driven-testing.md +0 -311
  228. package/skills/playwright-cli/references/storage-state.md +0 -290
  229. package/skills/playwright-cli/references/test-generation.md +0 -142
  230. package/skills/playwright-cli/references/tracing.md +0 -154
  231. package/skills/playwright-cli/references/video-recording.md +0 -147
  232. package/skills/spec-lite/SKILL.md +0 -140
  233. /package/external/pi-tools-suite/src/async-subagents/agents/{browser-qa → ui-qa/browser}/examples/qa-auth.example.jsonc +0 -0
  234. /package/external/pi-tools-suite/src/async-subagents/agents/{browser-qa → ui-qa/browser}/examples/qa-flow.example.jsonc +0 -0
  235. /package/external/pi-tools-suite/src/async-subagents/agents/{browser-qa → ui-qa/browser}/vendor/fflate.LICENSE +0 -0
  236. /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
- "dirName": {
367
+ "label": {
292
368
  "type": "string",
293
- "description": "Vosk model directory name."
369
+ "description": "Human-readable language label."
294
370
  },
295
- "url": {
371
+ "deepgramLanguage": {
296
372
  "type": "string",
297
- "description": "Download URL for the Vosk model zip."
373
+ "description": "Deepgram language code. Defaults to the language map key."
298
374
  },
299
- "label": {
375
+ "dirName": {
300
376
  "type": "string",
301
- "description": "Human-readable language label."
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": "Vosk voice dictation model definition."
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": "Available language models keyed by language code."
425
+ "description": "Pix Git/Source Control LLM preferences shared by Desktop and TUI."
308
426
  }
309
427
  },
310
- "description": "Voice dictation (Vosk) configuration."
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
+ }
@@ -1,6 +1,10 @@
1
1
  ---
2
2
  name: simplify
3
- description: Simplify and refine recently modified code for clarity and consistency. Use after writing code to improve readability without changing functionality.
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 the established coding standards from http://CLAUDE.md including:
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. **Enhance Clarity**: Simplify code structure by:
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
- 4. **Maintain Balance**: Avoid over-simplification that could:
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
- 5. **Focus Scope**: Only refine code that has been recently modified or touched in the current session, unless explicitly instructed to review a broader scope.
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.