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/dist/config.js CHANGED
@@ -56,9 +56,11 @@ const DEFAULT_OUTPUT_FILTERS = {
56
56
  const THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
57
57
  const DEFAULT_PROMPT_ENHANCER = {
58
58
  modelRef: "openai-codex/gpt-5.6-luna",
59
+ fallbackModels: [],
59
60
  };
60
61
  const DEFAULT_AUTOCOMPLETE = {
61
62
  modelRef: "zai/glm-5-turbo",
63
+ fallbackModels: [],
62
64
  debounceMs: 350,
63
65
  timeoutMs: 3000,
64
66
  maxTokens: 48,
@@ -75,16 +77,15 @@ const DEFAULT_MODEL_COLORS = {
75
77
  };
76
78
  const DEFAULT_DICTATION = {
77
79
  language: "en",
80
+ model: "nova-3",
78
81
  languages: {
79
82
  en: {
80
- dirName: "vosk-model-small-en-us-0.15",
81
- url: "https://alphacephei.com/vosk/models/vosk-model-small-en-us-0.15.zip",
82
83
  label: "English",
84
+ deepgramLanguage: "en",
83
85
  },
84
86
  ru: {
85
- dirName: "vosk-model-small-ru-0.22",
86
- url: "https://alphacephei.com/vosk/models/vosk-model-small-ru-0.22.zip",
87
87
  label: "Russian",
88
+ deepgramLanguage: "ru",
88
89
  },
89
90
  },
90
91
  };
@@ -133,20 +134,21 @@ function extractPromptEnhancerConfig(raw) {
133
134
  if (!isPlainObject(enhancer))
134
135
  return undefined;
135
136
  const modelRef = nonEmptyString(enhancer.modelRef) ?? nonEmptyString(enhancer.model);
136
- return modelRef ? { modelRef } : undefined;
137
+ return modelRef ? { modelRef, fallbackModels: modelFallbackList(enhancer.fallbackModels) } : undefined;
137
138
  }
138
139
  function extractAutocompleteConfig(raw) {
139
140
  if (!isPlainObject(raw))
140
141
  return undefined;
141
142
  const autocomplete = raw.autocomplete ?? raw.autoComplete;
142
143
  if (typeof autocomplete === "string")
143
- return { ...DEFAULT_AUTOCOMPLETE, modelRef: autocomplete.trim() };
144
+ return { ...DEFAULT_AUTOCOMPLETE, fallbackModels: [], modelRef: autocomplete.trim() };
144
145
  if (!isPlainObject(autocomplete))
145
146
  return undefined;
146
147
  const modelRef = autocompleteModelRef(autocomplete);
147
148
  return {
148
149
  ...DEFAULT_AUTOCOMPLETE,
149
150
  ...(modelRef === undefined ? {} : { modelRef }),
151
+ fallbackModels: modelFallbackList(autocomplete.fallbackModels),
150
152
  debounceMs: numberInRange(autocomplete.debounceMs, DEFAULT_AUTOCOMPLETE.debounceMs, 100, 2_000),
151
153
  timeoutMs: numberInRange(autocomplete.timeoutMs, DEFAULT_AUTOCOMPLETE.timeoutMs, 250, 10_000),
152
154
  maxTokens: numberInRange(autocomplete.maxTokens, DEFAULT_AUTOCOMPLETE.maxTokens, 8, 256),
@@ -181,9 +183,30 @@ function extractDefaultModelConfig(raw) {
181
183
  ?? normalizedModel.thinking;
182
184
  return {
183
185
  modelRef: normalizedModel.modelRef,
186
+ fallbackModels: modelFallbackList(configured.fallbackModels),
184
187
  ...(thinking === undefined ? {} : { thinking }),
185
188
  };
186
189
  }
190
+ function extractVisibleModelsConfig(raw) {
191
+ if (!isPlainObject(raw) || !Array.isArray(raw.visibleModels))
192
+ return undefined;
193
+ return [...new Set(raw.visibleModels
194
+ .filter((entry) => typeof entry === "string")
195
+ .map((entry) => entry.trim())
196
+ .filter(Boolean))];
197
+ }
198
+ function extractThinkingByModelConfig(raw) {
199
+ if (!isPlainObject(raw) || !isPlainObject(raw.thinkingByModel))
200
+ return undefined;
201
+ const preferences = {};
202
+ for (const [modelRef, value] of Object.entries(raw.thinkingByModel)) {
203
+ const normalizedRef = normalizeModelPreferenceRef(modelRef);
204
+ const thinking = normalizeThinkingLevel(value);
205
+ if (normalizedRef && thinking)
206
+ preferences[normalizedRef] = thinking;
207
+ }
208
+ return preferences;
209
+ }
187
210
  function extractModelColorsConfig(raw) {
188
211
  if (!isPlainObject(raw))
189
212
  return undefined;
@@ -217,33 +240,54 @@ function extractIconThemeConfig(raw) {
217
240
  ?? appIconThemeFromFallbackFlag(iconTheme.fallback);
218
241
  return configuredTheme ? { name: configuredTheme } : undefined;
219
242
  }
220
- function extractDictationConfig(raw) {
243
+ function extractDictationConfig(raw, fallback, options = {}) {
221
244
  if (!isPlainObject(raw))
222
245
  return undefined;
223
246
  const dictation = raw.dictation ?? raw.voiceInput ?? raw.voice;
224
247
  if (!isPlainObject(dictation))
225
248
  return undefined;
226
249
  const configuredLanguages = dictation.languages ?? dictation.models;
227
- if (!isPlainObject(configuredLanguages))
228
- return undefined;
229
- const languages = {};
230
- for (const [rawKey, value] of Object.entries(configuredLanguages)) {
231
- const key = rawKey.trim().toLowerCase();
232
- if (!key || !isPlainObject(value))
233
- continue;
234
- const dirName = nonEmptyString(value.dirName) ?? nonEmptyString(value.model) ?? nonEmptyString(value.modelDir);
235
- const url = nonEmptyString(value.url);
236
- const label = nonEmptyString(value.label) ?? key.toUpperCase();
237
- if (!dirName || !url)
238
- continue;
239
- languages[key] = { dirName, url, label };
250
+ const replacesLanguages = isPlainObject(configuredLanguages);
251
+ let languages = fallback.languages;
252
+ if (replacesLanguages) {
253
+ const parsedLanguages = {};
254
+ for (const [rawKey, value] of Object.entries(configuredLanguages)) {
255
+ const key = rawKey.trim().toLowerCase();
256
+ if (!key || !isPlainObject(value))
257
+ continue;
258
+ const label = nonEmptyString(value.label) ?? key.toUpperCase();
259
+ const deepgramLanguage = nonEmptyString(value.deepgramLanguage)
260
+ ?? nonEmptyString(value.language)
261
+ ?? key;
262
+ const dirName = nonEmptyString(value.dirName) ?? nonEmptyString(value.model) ?? nonEmptyString(value.modelDir);
263
+ const url = nonEmptyString(value.url);
264
+ parsedLanguages[key] = {
265
+ label,
266
+ deepgramLanguage,
267
+ ...(dirName ? { dirName } : {}),
268
+ ...(url ? { url } : {}),
269
+ };
270
+ }
271
+ if (Object.keys(parsedLanguages).length > 0)
272
+ languages = parsedLanguages;
240
273
  }
241
- const language = normalizeDictationLanguage(dictation.language)
274
+ const configuredLanguage = normalizeDictationLanguage(dictation.language)
242
275
  ?? normalizeDictationLanguage(dictation.selectedLanguage)
243
276
  ?? normalizeDictationLanguage(dictation.currentLanguage);
244
- const selectedLanguage = language && languages[language] ? language : undefined;
277
+ const selectedLanguage = configuredLanguage && languages[configuredLanguage]
278
+ ? configuredLanguage
279
+ : !replacesLanguages && fallback.language && languages[fallback.language]
280
+ ? fallback.language
281
+ : undefined;
282
+ const configuredModel = nonEmptyString(dictation.model) ?? nonEmptyString(dictation.deepgramModel);
283
+ const model = configuredModel ?? (replacesLanguages ? undefined : fallback.model);
284
+ const apiKey = options.allowApiKey === false
285
+ ? fallback.apiKey
286
+ : nonEmptyString(dictation.apiKey) ?? nonEmptyString(dictation.deepgramApiKey) ?? fallback.apiKey;
245
287
  return Object.keys(languages).length > 0 ? {
246
- ...(selectedLanguage ? { language: selectedLanguage } : {}),
288
+ ...(selectedLanguage === undefined ? {} : { language: selectedLanguage }),
289
+ ...(model === undefined ? {} : { model }),
290
+ ...(apiKey === undefined ? {} : { apiKey }),
247
291
  languages,
248
292
  } : undefined;
249
293
  }
@@ -280,6 +324,14 @@ function nonEmptyString(value) {
280
324
  const trimmed = value.trim();
281
325
  return trimmed.length > 0 ? trimmed : undefined;
282
326
  }
327
+ function modelFallbackList(value) {
328
+ if (!Array.isArray(value))
329
+ return [];
330
+ return [...new Set(value
331
+ .filter((entry) => typeof entry === "string")
332
+ .map((entry) => entry.trim())
333
+ .filter(Boolean))];
334
+ }
283
335
  function numberInRange(value, fallback, min, max) {
284
336
  if (typeof value !== "number" || !Number.isFinite(value))
285
337
  return fallback;
@@ -290,8 +342,8 @@ export function defaultPixConfig() {
290
342
  return {
291
343
  toolRenderer: cloneToolRendererConfig(DEFAULT_TOOL_RENDERER),
292
344
  outputFilters: { patterns: [...DEFAULT_OUTPUT_FILTERS.patterns] },
293
- promptEnhancer: { ...DEFAULT_PROMPT_ENHANCER },
294
- autocomplete: { ...DEFAULT_AUTOCOMPLETE },
345
+ promptEnhancer: { ...DEFAULT_PROMPT_ENHANCER, fallbackModels: [...DEFAULT_PROMPT_ENHANCER.fallbackModels] },
346
+ autocomplete: { ...DEFAULT_AUTOCOMPLETE, fallbackModels: [...DEFAULT_AUTOCOMPLETE.fallbackModels] },
295
347
  modelColors: { rules: { ...DEFAULT_MODEL_COLORS.rules } },
296
348
  iconTheme: { name: resolveAppIconThemeNameFromEnv() },
297
349
  dictation: cloneDictationConfig(DEFAULT_DICTATION),
@@ -309,21 +361,44 @@ function cloneDictationConfig(config) {
309
361
  return {
310
362
  languages: Object.fromEntries(Object.entries(config.languages).map(([language, model]) => [language, { ...model }])),
311
363
  ...(config.language === undefined ? {} : { language: config.language }),
364
+ ...(config.model === undefined ? {} : { model: config.model }),
365
+ ...(config.apiKey === undefined ? {} : { apiKey: config.apiKey }),
312
366
  };
313
367
  }
314
- function pixConfigFromParsed(parsed, fallback = defaultPixConfig()) {
368
+ function pixConfigFromParsed(parsed, fallback = defaultPixConfig(), options = {}) {
315
369
  const toolRenderer = extractToolRendererConfig(parsed) ?? fallback.toolRenderer;
316
370
  const outputFilters = extractOutputFiltersConfig(parsed) ?? fallback.outputFilters;
317
371
  const defaultModel = extractDefaultModelConfig(parsed) ?? fallback.defaultModel;
372
+ const visibleModels = options.allowVisibleModels === false
373
+ ? fallback.visibleModels
374
+ : extractVisibleModelsConfig(parsed) ?? fallback.visibleModels;
375
+ const thinkingByModel = options.allowThinkingByModel === false
376
+ ? fallback.thinkingByModel
377
+ : extractThinkingByModelConfig(parsed) ?? fallback.thinkingByModel;
318
378
  const promptEnhancer = extractPromptEnhancerConfig(parsed) ?? fallback.promptEnhancer;
319
379
  const autocomplete = extractAutocompleteConfig(parsed) ?? fallback.autocomplete;
320
380
  const modelColors = extractModelColorsConfig(parsed) ?? fallback.modelColors;
321
381
  const configuredIconTheme = extractIconThemeConfig(parsed) ?? fallback.iconTheme;
322
382
  const iconTheme = { name: appIconThemeOverrideFromEnv() ?? configuredIconTheme.name };
323
- const dictation = extractDictationConfig(parsed) ?? fallback.dictation;
383
+ const dictation = extractDictationConfig(parsed, fallback.dictation, {
384
+ allowApiKey: options.allowDictationApiKey ?? true,
385
+ }) ?? fallback.dictation;
324
386
  const ignoreContextFiles = extractIgnoreContextFiles(parsed) ?? fallback.ignoreContextFiles;
325
387
  const maxProjectSessions = extractMaxProjectSessions(parsed) ?? fallback.maxProjectSessions;
326
- return { toolRenderer, outputFilters, ...(defaultModel === undefined ? {} : { defaultModel }), promptEnhancer, autocomplete, modelColors, iconTheme, dictation, ignoreContextFiles, maxProjectSessions };
388
+ return {
389
+ toolRenderer,
390
+ outputFilters,
391
+ ...(defaultModel === undefined ? {} : { defaultModel }),
392
+ ...(visibleModels === undefined ? {} : { visibleModels: [...visibleModels] }),
393
+ ...(thinkingByModel === undefined ? {} : { thinkingByModel: { ...thinkingByModel } }),
394
+ promptEnhancer,
395
+ autocomplete,
396
+ modelColors,
397
+ iconTheme,
398
+ dictation,
399
+ ignoreContextFiles,
400
+ maxProjectSessions,
401
+ };
327
402
  }
328
403
  export function resolveDefaultModelRef(config) {
329
404
  const modelRef = config.defaultModel?.modelRef.trim();
@@ -367,6 +442,23 @@ export function savePixAutocompleteModel(modelRef) {
367
442
  writeFileSync(configPath, updated);
368
443
  return extractAutocompleteConfig(parseJsonc(updated)) ?? { ...DEFAULT_AUTOCOMPLETE, modelRef: modelRef.trim() };
369
444
  }
445
+ export function savePixVisibleModels(modelRefs) {
446
+ const configPath = PIX_CONFIG_PATH;
447
+ const source = existsSync(configPath) ? readFileSync(configPath, "utf8") : "{\n}\n";
448
+ const normalized = normalizeVisibleModelRefs(modelRefs);
449
+ const updated = upsertPixVisibleModelsInJsonc(source, normalized);
450
+ mkdirSync(dirname(configPath), { recursive: true });
451
+ writeFileSync(configPath, updated);
452
+ return extractVisibleModelsConfig(parseJsonc(updated)) ?? normalized;
453
+ }
454
+ export function savePixThinkingLevelForModel(modelRef, thinking) {
455
+ const configPath = PIX_CONFIG_PATH;
456
+ const source = existsSync(configPath) ? readFileSync(configPath, "utf8") : "{\n}\n";
457
+ const updated = upsertPixThinkingLevelForModelInJsonc(source, modelRef, thinking);
458
+ mkdirSync(dirname(configPath), { recursive: true });
459
+ writeFileSync(configPath, updated);
460
+ return extractThinkingByModelConfig(parseJsonc(updated)) ?? {};
461
+ }
370
462
  export function saveProjectPixIgnoreContextFiles(cwd, ignoreContextFiles) {
371
463
  const configPath = getProjectPixConfigPath(cwd);
372
464
  const source = existsSync(configPath) ? readFileSync(configPath, "utf8") : `{
@@ -382,6 +474,18 @@ export function upsertPixIgnoreContextFilesInJsonc(source, ignoreContextFiles) {
382
474
  const formattingOptions = { insertSpaces: true, tabSize: 2 };
383
475
  return applyEdits(source, modify(source, ["ignoreContextFiles"], ignoreContextFiles, { formattingOptions }));
384
476
  }
477
+ export function upsertPixVisibleModelsInJsonc(source, modelRefs) {
478
+ const formattingOptions = { insertSpaces: true, tabSize: 2 };
479
+ return applyEdits(source, modify(source, ["visibleModels"], normalizeVisibleModelRefs(modelRefs), { formattingOptions }));
480
+ }
481
+ export function upsertPixThinkingLevelForModelInJsonc(source, modelRef, thinking) {
482
+ const normalizedRef = normalizeModelPreferenceRef(modelRef);
483
+ const normalizedThinking = normalizeThinkingLevel(thinking);
484
+ if (!normalizedRef || !normalizedThinking)
485
+ return source;
486
+ const formattingOptions = { insertSpaces: true, tabSize: 2 };
487
+ return applyEdits(source, modify(source, ["thinkingByModel", normalizedRef], normalizedThinking, { formattingOptions }));
488
+ }
385
489
  export function upsertPixDefaultModelInJsonc(source, modelRef) {
386
490
  const normalized = normalizeDefaultModelRef(modelRef);
387
491
  if (!normalized)
@@ -391,6 +495,7 @@ export function upsertPixDefaultModelInJsonc(source, modelRef) {
391
495
  const thinking = normalized.thinking ?? current?.thinking;
392
496
  const next = {
393
497
  modelRef: normalized.modelRef,
498
+ fallbackModels: current?.fallbackModels ?? [],
394
499
  ...(thinking === undefined ? {} : { thinking }),
395
500
  };
396
501
  return upsertPixDefaultModelObjectInJsonc(source, parsed, next);
@@ -407,6 +512,7 @@ export function upsertPixDefaultThinkingInJsonc(source, thinking, fallbackModelR
407
512
  return source;
408
513
  const next = {
409
514
  modelRef: stripThinkingSuffix(modelRef),
515
+ fallbackModels: current?.fallbackModels ?? fallback?.fallbackModels ?? [],
410
516
  thinking: normalizedThinking,
411
517
  };
412
518
  return upsertPixDefaultModelObjectInJsonc(source, parsed, next);
@@ -417,6 +523,7 @@ function upsertPixDefaultModelObjectInJsonc(source, parsed, config) {
417
523
  return applyEdits(source, modify(source, ["defaultModel"], config, { formattingOptions, getInsertionIndex: () => 0 }));
418
524
  }
419
525
  let updated = applyEdits(source, modify(source, ["defaultModel", "modelRef"], config.modelRef, { formattingOptions }));
526
+ updated = applyEdits(updated, modify(updated, ["defaultModel", "fallbackModels"], config.fallbackModels, { formattingOptions }));
420
527
  if (config.thinking !== undefined) {
421
528
  updated = applyEdits(updated, modify(updated, ["defaultModel", "thinking"], config.thinking, { formattingOptions }));
422
529
  }
@@ -424,7 +531,11 @@ function upsertPixDefaultModelObjectInJsonc(source, parsed, config) {
424
531
  }
425
532
  export function upsertPixAutocompleteModelInJsonc(source, modelRef) {
426
533
  const formattingOptions = { insertSpaces: true, tabSize: 2 };
427
- return applyEdits(source, modify(source, ["autocomplete", "modelRef"], modelRef.trim(), { formattingOptions }));
534
+ const parsed = parseJsonc(source);
535
+ const current = extractAutocompleteConfig(parsed);
536
+ let updated = applyEdits(source, modify(source, ["autocomplete", "modelRef"], modelRef.trim(), { formattingOptions }));
537
+ updated = applyEdits(updated, modify(updated, ["autocomplete", "fallbackModels"], current?.fallbackModels ?? [], { formattingOptions }));
538
+ return updated;
428
539
  }
429
540
  function normalizeDefaultModelRef(modelRef) {
430
541
  const trimmed = modelRef.trim();
@@ -432,10 +543,19 @@ function normalizeDefaultModelRef(modelRef) {
432
543
  return undefined;
433
544
  const colonIndex = trimmed.lastIndexOf(":");
434
545
  if (colonIndex <= 0)
435
- return { modelRef: trimmed };
546
+ return { modelRef: trimmed, fallbackModels: [] };
436
547
  const suffix = trimmed.slice(colonIndex + 1);
437
548
  const thinking = normalizeDefaultThinking(suffix);
438
- return thinking ? { modelRef: trimmed.slice(0, colonIndex), thinking } : { modelRef: trimmed };
549
+ return thinking
550
+ ? { modelRef: trimmed.slice(0, colonIndex), fallbackModels: [], thinking }
551
+ : { modelRef: trimmed, fallbackModels: [] };
552
+ }
553
+ function normalizeVisibleModelRefs(modelRefs) {
554
+ return [...new Set(modelRefs.map((entry) => entry.trim()).filter(Boolean))];
555
+ }
556
+ function normalizeModelPreferenceRef(modelRef) {
557
+ const normalized = stripThinkingSuffix(modelRef.trim());
558
+ return normalized.length > 0 ? normalized : undefined;
439
559
  }
440
560
  function stripThinkingSuffix(modelRef) {
441
561
  const colonIndex = modelRef.lastIndexOf(":");
@@ -506,7 +626,14 @@ function loadProjectPixConfig(cwd, fallback) {
506
626
  return fallback;
507
627
  try {
508
628
  const raw = readFileSync(configPath, "utf8");
509
- return pixConfigFromParsed(parseJsonc(raw), fallback);
629
+ return pixConfigFromParsed(parseJsonc(raw), fallback, {
630
+ allowDictationApiKey: false,
631
+ // Model visibility is a user UI preference shared by TUI and Desktop.
632
+ // Project config must not silently fork that picker state.
633
+ allowVisibleModels: false,
634
+ // Remembered thinking is the same cross-UI user preference.
635
+ allowThinkingByModel: false,
636
+ });
510
637
  }
511
638
  catch (error) {
512
639
  process.stderr.write(`[pix] Failed to load ${configPath}: ${error instanceof Error ? error.message : String(error)}\n`);
@@ -1,11 +1,27 @@
1
1
  export const DEFAULT_PIX_CONFIG_JSONC = String.raw `{
2
2
  "$schema": "https://unpkg.com/pi-ui-extend/schemas/pix.json",
3
3
  // pix renderer configuration
4
- "defaultModel": { "modelRef": "openai-codex/gpt-5.6-sol", "thinking": "medium" },
4
+ "defaultModel": { "modelRef": "openai-codex/gpt-5.6-sol", "fallbackModels": [], "thinking": "medium" },
5
+ // Optional model-picker whitelist shared by Pix TUI and Desktop. Omit it to show all available models.
6
+ // "visibleModels": ["openai-codex/gpt-5.6-sol", "zai/glm-5-turbo"],
7
+ // Last applied thinking level per model, shared by Pix TUI and Desktop model pickers.
8
+ // "thinkingByModel": { "openai-codex/gpt-5.6-sol": "high", "zai/glm-5-turbo": "max" },
5
9
  // Disable AGENTS.md / CLAUDE.md discovery for this project when set in <cwd>/.pi/pix.jsonc.
6
10
  "ignoreContextFiles": false,
7
11
  // Maximum pi session JSONL files to retain per project. 0 disables automatic deletion.
8
12
  "maxProjectSessions": 0,
13
+ "desktop": {
14
+ // External editor used by Pix Desktop's Project explorer: zed, code/vscode, cursor, subl, idea, webstorm, or an executable path/name.
15
+ "externalEditor": "zed",
16
+ "git": {
17
+ // LLM used for Source Control and /code-review.
18
+ "reviewModelRef": "openai-codex/gpt-5.6-luna:medium",
19
+ "reviewFallbackModels": [],
20
+ // LLM used to generate commit messages in Desktop and /commit-message.
21
+ "commitMessageModelRef": "openai-codex/gpt-5.6-luna:minimal",
22
+ "commitMessageFallbackModels": []
23
+ }
24
+ },
9
25
 
10
26
  "toolRenderer": {
11
27
  "default": { "previewLines": 0, "direction": "head", "color": "toolTitle" },
@@ -52,14 +68,18 @@ export const DEFAULT_PIX_CONFIG_JSONC = String.raw `{
52
68
  "antigravity/antigravity-claude-*": "error"
53
69
  },
54
70
 
55
- "promptEnhancer": { "modelRef": "openai-codex/gpt-5.6-luna" },
56
- "autocomplete": { "modelRef": "zai/glm-5-turbo", "debounceMs": 350, "timeoutMs": 3000, "maxTokens": 48, "maxPromptTokens": 1200, "includeRecentMessages": 0 },
71
+ "promptEnhancer": { "modelRef": "openai-codex/gpt-5.6-luna", "fallbackModels": [] },
72
+ "autocomplete": { "modelRef": "zai/glm-5-turbo", "fallbackModels": [], "debounceMs": 350, "timeoutMs": 3000, "maxTokens": 48, "maxPromptTokens": 1200, "includeRecentMessages": 0 },
57
73
  "sessionTitle": { "modelRef": "openai-codex/gpt-5.6-luna", "fallbackModels": ["zai/glm-5-turbo"] },
58
74
  "dictation": {
75
+ // Deepgram API key used by both terminal and desktop voice input.
76
+ // Keep secrets in this user config (~/.config/pi/pix.jsonc), not project .pi/pix.jsonc.
77
+ "apiKey": "",
59
78
  "language": "en",
79
+ "model": "nova-3",
60
80
  "languages": {
61
- "en": { "dirName": "vosk-model-small-en-us-0.15", "url": "https://alphacephei.com/vosk/models/vosk-model-small-en-us-0.15.zip", "label": "English" },
62
- "ru": { "dirName": "vosk-model-small-ru-0.22", "url": "https://alphacephei.com/vosk/models/vosk-model-small-ru-0.22.zip", "label": "Russian" }
81
+ "en": { "deepgramLanguage": "en", "label": "English" },
82
+ "ru": { "deepgramLanguage": "ru", "label": "Russian" }
63
83
  }
64
84
  }
65
85
  }
@@ -3,3 +3,4 @@
3
3
  */
4
4
  export { PixConfigSchema } from "./pix-schema.js";
5
5
  export { PiToolsSuiteConfigSchema } from "./pi-tools-suite-schema.js";
6
+ export { ProjectTasksSchema } from "./tasks-schema.js";
@@ -3,3 +3,4 @@
3
3
  */
4
4
  export { PixConfigSchema } from "./pix-schema.js";
5
5
  export { PiToolsSuiteConfigSchema } from "./pi-tools-suite-schema.js";
6
+ export { ProjectTasksSchema } from "./tasks-schema.js";
@@ -14,12 +14,18 @@ export declare const PiToolsSuiteConfigSchema: Type.TObject<{
14
14
  todoThinking: Type.TOptional<Type.TBoolean>;
15
15
  todoThinkingOverrides: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TLiteral<"off">, Type.TLiteral<"minimal">, Type.TLiteral<"low">, Type.TLiteral<"medium">, Type.TLiteral<"high">, Type.TLiteral<"xhigh">, Type.TLiteral<"max">, Type.TNull]>>>;
16
16
  lookupModel: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
17
+ lookupFallbackModels: Type.TOptional<Type.TArray<Type.TString>>;
17
18
  terminalBell: Type.TOptional<Type.TObject<{
18
19
  sound: Type.TOptional<Type.TBoolean>;
19
- telegram: Type.TOptional<Type.TObject<{
20
- botToken: Type.TOptional<Type.TString>;
21
- chatId: Type.TOptional<Type.TString>;
22
- }>>;
20
+ }>>;
21
+ telegramConnector: Type.TOptional<Type.TObject<{
22
+ enabled: Type.TOptional<Type.TBoolean>;
23
+ botToken: Type.TOptional<Type.TString>;
24
+ chatId: Type.TOptional<Type.TUnion<[Type.TString, Type.TInteger]>>;
25
+ }>>;
26
+ commentChecker: Type.TOptional<Type.TObject<{
27
+ enabled: Type.TOptional<Type.TBoolean>;
28
+ strictness: Type.TOptional<Type.TUnion<[Type.TLiteral<"conservative">, Type.TLiteral<"balanced">, Type.TLiteral<"aggressive">]>>;
23
29
  }>>;
24
30
  dcp: Type.TOptional<Type.TObject<{
25
31
  enabled: Type.TOptional<Type.TBoolean>;
@@ -30,12 +36,13 @@ export declare const PiToolsSuiteConfigSchema: Type.TObject<{
30
36
  }>>;
31
37
  manualMode: Type.TOptional<Type.TObject<{
32
38
  enabled: Type.TOptional<Type.TBoolean>;
39
+ automaticStrategies: Type.TOptional<Type.TNever>;
33
40
  }>>;
34
41
  compress: Type.TOptional<Type.TObject<{
35
42
  maxContextPercent: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
36
43
  minContextPercent: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
37
- modelMaxContextPercent: Type.TOptional<Type.TRecord<"^.*$", Type.TNumber>>;
38
- modelMinContextPercent: Type.TOptional<Type.TRecord<"^.*$", Type.TNumber>>;
44
+ modelMaxContextPercent: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TNumber, Type.TString]>>>;
45
+ modelMinContextPercent: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TNumber, Type.TString]>>>;
39
46
  maxContextLimit: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
40
47
  minContextLimit: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
41
48
  modelMaxContextLimits: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TNumber, Type.TString]>>>;
@@ -66,6 +73,7 @@ export declare const PiToolsSuiteConfigSchema: Type.TObject<{
66
73
  enabled: Type.TOptional<Type.TBoolean>;
67
74
  patience: Type.TOptional<Type.TNumber>;
68
75
  summarizerModel: Type.TOptional<Type.TArray<Type.TString>>;
76
+ summarizerFallbackModels: Type.TOptional<Type.TArray<Type.TString>>;
69
77
  timeoutMs: Type.TOptional<Type.TNumber>;
70
78
  }>>;
71
79
  }>>;
@@ -80,68 +88,80 @@ export declare const PiToolsSuiteConfigSchema: Type.TObject<{
80
88
  maxSuggestions: Type.TOptional<Type.TNumber>;
81
89
  protectedTools: Type.TOptional<Type.TArray<Type.TString>>;
82
90
  }>>;
91
+ deduplication: Type.TOptional<Type.TNever>;
92
+ purgeErrors: Type.TOptional<Type.TNever>;
93
+ autoToolPruning: Type.TOptional<Type.TNever>;
83
94
  }>>;
84
95
  protectedFilePatterns: Type.TOptional<Type.TArray<Type.TString>>;
85
- }>>;
86
- asyncSubagents: Type.TOptional<Type.TObject<{
87
- defaultType: Type.TOptional<Type.TString>;
88
- routing: Type.TOptional<Type.TObject<{
96
+ modelOverrides: Type.TOptional<Type.TRecord<"^.*$", Type.TObject<{
89
97
  enabled: Type.TOptional<Type.TBoolean>;
90
- model: Type.TOptional<Type.TString>;
91
- fallbackModels: Type.TOptional<Type.TArray<Type.TString>>;
92
- maxTaskChars: Type.TOptional<Type.TNumber>;
93
- maxTokens: Type.TOptional<Type.TNumber>;
94
- maxRetries: Type.TOptional<Type.TNumber>;
95
- timeoutMs: Type.TOptional<Type.TNumber>;
96
98
  debug: Type.TOptional<Type.TBoolean>;
97
- }>>;
98
- vision: Type.TOptional<Type.TObject<{
99
- blindModelPatterns: Type.TOptional<Type.TArray<Type.TString>>;
100
- }>>;
101
- presets: Type.TOptional<Type.TRecord<"^.*$", Type.TObject<{
102
- description: Type.TOptional<Type.TString>;
103
- models: Type.TOptional<Type.TArray<Type.TString>>;
104
- model: Type.TOptional<Type.TString>;
105
- fallbackModels: Type.TOptional<Type.TArray<Type.TString>>;
106
- thinking: Type.TOptional<Type.TString>;
107
- extraArgs: Type.TOptional<Type.TArray<Type.TString>>;
108
- timeoutMs: Type.TOptional<Type.TNumber>;
109
- types: Type.TOptional<Type.TRecord<"^.*$", Type.TObject<{
110
- model: Type.TOptional<Type.TString>;
111
- fallbackModels: Type.TOptional<Type.TArray<Type.TString>>;
112
- thinking: Type.TOptional<Type.TString>;
113
- extraArgs: Type.TOptional<Type.TArray<Type.TString>>;
114
- timeoutMs: Type.TOptional<Type.TNumber>;
115
- }>>>;
116
- }>>>;
117
- types: Type.TOptional<Type.TRecord<"^.*$", Type.TObject<{
118
- description: Type.TOptional<Type.TString>;
119
- icon: Type.TOptional<Type.TString>;
120
- models: Type.TOptional<Type.TArray<Type.TString>>;
121
- model: Type.TOptional<Type.TString>;
122
- fallbackModels: Type.TOptional<Type.TArray<Type.TString>>;
123
- thinking: Type.TOptional<Type.TString>;
124
- tools: Type.TOptional<Type.TArray<Type.TString>>;
125
- isolatedSkills: Type.TOptional<Type.TArray<Type.TString>>;
126
- extraArgs: Type.TOptional<Type.TArray<Type.TString>>;
127
- promptAppend: Type.TOptional<Type.TString>;
128
- promptOverride: Type.TOptional<Type.TString>;
129
- retry: Type.TOptional<Type.TObject<{
130
- maxRetries: Type.TOptional<Type.TNumber>;
131
- backoffMs: Type.TOptional<Type.TNumber>;
132
- retryableExitCodes: Type.TOptional<Type.TArray<Type.TNumber>>;
99
+ debugLog: Type.TOptional<Type.TObject<{
100
+ maxBytes: Type.TOptional<Type.TNumber>;
101
+ maxBackups: Type.TOptional<Type.TNumber>;
133
102
  }>>;
134
- maxResultBytes: Type.TOptional<Type.TNumber>;
135
- timeoutMs: Type.TOptional<Type.TNumber>;
103
+ manualMode: Type.TOptional<Type.TObject<{
104
+ enabled: Type.TOptional<Type.TBoolean>;
105
+ automaticStrategies: Type.TOptional<Type.TNever>;
106
+ }>>;
107
+ compress: Type.TOptional<Type.TObject<{
108
+ maxContextPercent: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
109
+ minContextPercent: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
110
+ modelMaxContextPercent: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TNumber, Type.TString]>>>;
111
+ modelMinContextPercent: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TNumber, Type.TString]>>>;
112
+ maxContextLimit: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
113
+ minContextLimit: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
114
+ modelMaxContextLimits: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TNumber, Type.TString]>>>;
115
+ modelMinContextLimits: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TNumber, Type.TString]>>>;
116
+ summaryBuffer: Type.TOptional<Type.TBoolean>;
117
+ nudgeFrequency: Type.TOptional<Type.TNumber>;
118
+ iterationNudgeThreshold: Type.TOptional<Type.TNumber>;
119
+ nudgeForce: Type.TOptional<Type.TUnion<[Type.TLiteral<"strong">, Type.TLiteral<"soft">]>>;
120
+ protectedTools: Type.TOptional<Type.TArray<Type.TString>>;
121
+ protectTags: Type.TOptional<Type.TBoolean>;
122
+ protectUserMessages: Type.TOptional<Type.TBoolean>;
123
+ autoCandidates: Type.TOptional<Type.TObject<{
124
+ enabled: Type.TOptional<Type.TBoolean>;
125
+ minContextPercent: Type.TOptional<Type.TNumber>;
126
+ keepRecentTurns: Type.TOptional<Type.TNumber>;
127
+ minMessages: Type.TOptional<Type.TNumber>;
128
+ minTokens: Type.TOptional<Type.TNumber>;
129
+ }>>;
130
+ messageMode: Type.TOptional<Type.TObject<{
131
+ enabled: Type.TOptional<Type.TBoolean>;
132
+ minContextPercent: Type.TOptional<Type.TNumber>;
133
+ keepRecentTurns: Type.TOptional<Type.TNumber>;
134
+ mediumTokens: Type.TOptional<Type.TNumber>;
135
+ highTokens: Type.TOptional<Type.TNumber>;
136
+ maxSuggestions: Type.TOptional<Type.TNumber>;
137
+ }>>;
138
+ autoCompress: Type.TOptional<Type.TObject<{
139
+ enabled: Type.TOptional<Type.TBoolean>;
140
+ patience: Type.TOptional<Type.TNumber>;
141
+ summarizerModel: Type.TOptional<Type.TArray<Type.TString>>;
142
+ summarizerFallbackModels: Type.TOptional<Type.TArray<Type.TString>>;
143
+ timeoutMs: Type.TOptional<Type.TNumber>;
144
+ }>>;
145
+ }>>;
146
+ strategies: Type.TOptional<Type.TObject<{
147
+ emergencyCurrentTurnPruning: Type.TOptional<Type.TObject<{
148
+ enabled: Type.TOptional<Type.TBoolean>;
149
+ hardContextPercent: Type.TOptional<Type.TNumber>;
150
+ targetContextPercent: Type.TOptional<Type.TNumber>;
151
+ patience: Type.TOptional<Type.TNumber>;
152
+ keepRecentToolPairs: Type.TOptional<Type.TNumber>;
153
+ minOutputTokens: Type.TOptional<Type.TNumber>;
154
+ maxSuggestions: Type.TOptional<Type.TNumber>;
155
+ protectedTools: Type.TOptional<Type.TArray<Type.TString>>;
156
+ }>>;
157
+ deduplication: Type.TOptional<Type.TNever>;
158
+ purgeErrors: Type.TOptional<Type.TNever>;
159
+ autoToolPruning: Type.TOptional<Type.TNever>;
160
+ }>>;
161
+ protectedFilePatterns: Type.TOptional<Type.TArray<Type.TString>>;
162
+ pruneNotification: Type.TOptional<Type.TNever>;
136
163
  }>>>;
137
- maxConcurrent: Type.TOptional<Type.TNumber>;
138
- retry: Type.TOptional<Type.TObject<{
139
- maxRetries: Type.TOptional<Type.TNumber>;
140
- backoffMs: Type.TOptional<Type.TNumber>;
141
- retryableExitCodes: Type.TOptional<Type.TArray<Type.TNumber>>;
142
- }>>;
143
- maxResultBytes: Type.TOptional<Type.TNumber>;
144
- timeoutMs: Type.TOptional<Type.TNumber>;
164
+ pruneNotification: Type.TOptional<Type.TNever>;
145
165
  }>>;
146
166
  toolRenderer: Type.TOptional<Type.TObject<{
147
167
  default: Type.TOptional<Type.TObject<{
@@ -184,6 +204,11 @@ export declare const PiToolsSuiteConfigSchema: Type.TObject<{
184
204
  repoDiscovery: Type.TOptional<Type.TObject<{
185
205
  profile: Type.TOptional<Type.TUnion<[Type.TLiteral<"baseline">, Type.TLiteral<"native-compact">]>>;
186
206
  }>>;
207
+ resourceRegistry: Type.TOptional<Type.TObject<{
208
+ remote: Type.TOptional<Type.TString>;
209
+ branch: Type.TOptional<Type.TString>;
210
+ projectKey: Type.TOptional<Type.TString>;
211
+ }>>;
187
212
  lsp: Type.TOptional<Type.TObject<{
188
213
  servers: Type.TOptional<Type.TArray<Type.TObject<{
189
214
  id: Type.TString;
@@ -206,5 +231,6 @@ export declare const PiToolsSuiteConfigSchema: Type.TObject<{
206
231
  settings: Type.TOptional<Type.TUnknown>;
207
232
  }>>>;
208
233
  }>>;
234
+ asyncSubagents: Type.TOptional<Type.TNever>;
209
235
  }>;
210
236
  export type PiToolsSuiteConfigSchemaType = Static<typeof PiToolsSuiteConfigSchema>;