pi-ui-extend 0.1.9 → 0.1.13

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 (121) hide show
  1. package/README.md +23 -2
  2. package/dist/app/app.d.ts +4 -0
  3. package/dist/app/app.js +76 -7
  4. package/dist/app/cli/install.d.ts +16 -0
  5. package/dist/app/cli/install.js +34 -7
  6. package/dist/app/cli/startup-info.js +5 -2
  7. package/dist/app/cli/update.d.ts +7 -0
  8. package/dist/app/cli/update.js +11 -3
  9. package/dist/app/commands/command-controller.js +4 -0
  10. package/dist/app/commands/command-host.d.ts +4 -0
  11. package/dist/app/commands/command-model-actions.d.ts +5 -0
  12. package/dist/app/commands/command-model-actions.js +104 -0
  13. package/dist/app/commands/command-navigation-actions.d.ts +6 -1
  14. package/dist/app/commands/command-navigation-actions.js +37 -14
  15. package/dist/app/commands/command-registry.d.ts +4 -0
  16. package/dist/app/commands/command-registry.js +32 -0
  17. package/dist/app/commands/command-session-actions.d.ts +1 -0
  18. package/dist/app/commands/command-session-actions.js +15 -5
  19. package/dist/app/commands/shell-command.d.ts +7 -0
  20. package/dist/app/commands/shell-command.js +12 -4
  21. package/dist/app/commands/shell-controller.d.ts +1 -0
  22. package/dist/app/commands/shell-controller.js +1 -1
  23. package/dist/app/constants.d.ts +1 -1
  24. package/dist/app/constants.js +1 -1
  25. package/dist/app/icons.d.ts +1 -0
  26. package/dist/app/icons.js +3 -1
  27. package/dist/app/input/autocomplete-controller.d.ts +52 -0
  28. package/dist/app/input/autocomplete-controller.js +352 -0
  29. package/dist/app/input/input-action-controller.d.ts +1 -0
  30. package/dist/app/input/input-action-controller.js +21 -0
  31. package/dist/app/input/input-controller.d.ts +1 -0
  32. package/dist/app/input/input-controller.js +2 -0
  33. package/dist/app/input/input-paste-handler.d.ts +1 -0
  34. package/dist/app/input/input-paste-handler.js +22 -18
  35. package/dist/app/input/prompt-enhancer-controller.d.ts +7 -1
  36. package/dist/app/input/prompt-enhancer-controller.js +12 -3
  37. package/dist/app/input/voice-controller.d.ts +51 -1
  38. package/dist/app/input/voice-controller.js +42 -19
  39. package/dist/app/model/model-usage-status.d.ts +9 -0
  40. package/dist/app/model/model-usage-status.js +124 -34
  41. package/dist/app/popup/popup-action-controller.js +1 -1
  42. package/dist/app/process.d.ts +17 -0
  43. package/dist/app/process.js +68 -0
  44. package/dist/app/rendering/conversation-entry-renderer.js +8 -6
  45. package/dist/app/rendering/conversation-tool-renderer.js +3 -2
  46. package/dist/app/rendering/editor-layout-renderer.d.ts +1 -0
  47. package/dist/app/rendering/editor-layout-renderer.js +11 -1
  48. package/dist/app/rendering/message-content.js +65 -7
  49. package/dist/app/rendering/render-controller.js +6 -1
  50. package/dist/app/rendering/render-text.d.ts +3 -0
  51. package/dist/app/rendering/render-text.js +51 -3
  52. package/dist/app/rendering/status-line-renderer.d.ts +5 -1
  53. package/dist/app/rendering/status-line-renderer.js +61 -25
  54. package/dist/app/rendering/toast-renderer.js +10 -13
  55. package/dist/app/rendering/tool-block-renderer.d.ts +1 -0
  56. package/dist/app/rendering/tool-block-renderer.js +16 -33
  57. package/dist/app/runtime.d.ts +6 -1
  58. package/dist/app/runtime.js +35 -2
  59. package/dist/app/screen/clipboard.d.ts +11 -2
  60. package/dist/app/screen/clipboard.js +29 -21
  61. package/dist/app/screen/file-link-opener.d.ts +8 -0
  62. package/dist/app/screen/file-link-opener.js +11 -3
  63. package/dist/app/screen/file-links.js +3 -3
  64. package/dist/app/screen/image-opener.d.ts +12 -0
  65. package/dist/app/screen/image-opener.js +13 -5
  66. package/dist/app/screen/mouse-controller.d.ts +5 -2
  67. package/dist/app/screen/mouse-controller.js +16 -1
  68. package/dist/app/screen/screen-styler.d.ts +4 -1
  69. package/dist/app/screen/screen-styler.js +3 -2
  70. package/dist/app/screen/status-controller.d.ts +3 -0
  71. package/dist/app/screen/status-controller.js +23 -8
  72. package/dist/app/session/queued-message-controller.d.ts +7 -1
  73. package/dist/app/session/queued-message-controller.js +36 -21
  74. package/dist/app/session/resume-session-loader.d.ts +15 -0
  75. package/dist/app/session/resume-session-loader.js +204 -0
  76. package/dist/app/session/session-event-controller.d.ts +5 -1
  77. package/dist/app/session/session-event-controller.js +72 -5
  78. package/dist/app/session/session-history.js +4 -3
  79. package/dist/app/session/session-lifecycle-controller.d.ts +5 -0
  80. package/dist/app/session/session-lifecycle-controller.js +9 -1
  81. package/dist/app/session/tabs-controller.d.ts +10 -1
  82. package/dist/app/session/tabs-controller.js +101 -5
  83. package/dist/app/terminal/nerd-font-controller.d.ts +16 -0
  84. package/dist/app/terminal/nerd-font-controller.js +30 -23
  85. package/dist/app/terminal/terminal-controller.d.ts +1 -0
  86. package/dist/app/terminal/terminal-controller.js +1 -0
  87. package/dist/app/types.d.ts +14 -0
  88. package/dist/app/workspace/workspace-actions-controller.d.ts +1 -1
  89. package/dist/app/workspace/workspace-actions-controller.js +3 -3
  90. package/dist/app/workspace/workspace-undo.d.ts +1 -1
  91. package/dist/app/workspace/workspace-undo.js +22 -20
  92. package/dist/config.d.ts +27 -0
  93. package/dist/config.js +174 -1
  94. package/dist/default-pix-config.js +39 -353
  95. package/dist/input-editor.d.ts +7 -1
  96. package/dist/input-editor.js +47 -6
  97. package/dist/markdown-format.d.ts +1 -0
  98. package/dist/markdown-format.js +26 -1
  99. package/dist/schemas/index.d.ts +5 -0
  100. package/dist/schemas/index.js +5 -0
  101. package/dist/schemas/pi-tools-suite-schema.d.ts +177 -0
  102. package/dist/schemas/pi-tools-suite-schema.js +218 -0
  103. package/dist/schemas/pix-schema.d.ts +65 -0
  104. package/dist/schemas/pix-schema.js +91 -0
  105. package/dist/terminal-width.js +73 -56
  106. package/external/pi-tools-suite/src/async-subagents/async-subagents.sample.jsonc +3 -0
  107. package/external/pi-tools-suite/src/dcp/compression-blocks.ts +1 -0
  108. package/external/pi-tools-suite/src/dcp/prompts.ts +1 -0
  109. package/external/pi-tools-suite/src/default-pi-tools-suite-config.ts +46 -195
  110. package/external/pi-tools-suite/src/lib/lsp.ts +2 -1
  111. package/external/pi-tools-suite/src/lsp/_shared/output.ts +8 -7
  112. package/external/pi-tools-suite/src/lsp/manager.ts +4 -4
  113. package/external/pi-tools-suite/src/repo-discovery/index.ts +49 -2
  114. package/external/pi-tools-suite/src/todo/index.ts +4 -2
  115. package/external/pi-tools-suite/src/todo/state/selectors.ts +4 -0
  116. package/external/pi-tools-suite/src/todo/todo.ts +2 -6
  117. package/external/pi-tools-suite/src/todo/tool/response-envelope.ts +9 -1
  118. package/external/pi-tools-suite/src/tool-descriptions.ts +1 -1
  119. package/package.json +12 -3
  120. package/schemas/pi-tools-suite.json +881 -0
  121. package/schemas/pix.json +298 -0
@@ -0,0 +1,177 @@
1
+ /**
2
+ * TypeBox JSON Schema definitions for pi-tools-suite.jsonc (~/.config/pi/pi-tools-suite.jsonc).
3
+ *
4
+ * All fields are optional because the runtime applies generous defaults.
5
+ * The generated JSON Schema includes `"additionalProperties": true`.
6
+ */
7
+ import { Type, Static } from "typebox";
8
+ export declare const PiToolsSuiteConfigSchema: Type.TObject<{
9
+ $schema: Type.TOptional<Type.TString>;
10
+ enabled: Type.TOptional<Type.TBoolean>;
11
+ disabledModules: Type.TOptional<Type.TArray<Type.TString>>;
12
+ terminalBell: Type.TOptional<Type.TObject<{
13
+ sound: Type.TOptional<Type.TBoolean>;
14
+ }>>;
15
+ dcp: Type.TOptional<Type.TObject<{
16
+ enabled: Type.TOptional<Type.TBoolean>;
17
+ debug: Type.TOptional<Type.TBoolean>;
18
+ manualMode: Type.TOptional<Type.TObject<{
19
+ enabled: Type.TOptional<Type.TBoolean>;
20
+ automaticStrategies: Type.TOptional<Type.TBoolean>;
21
+ }>>;
22
+ compress: Type.TOptional<Type.TObject<{
23
+ maxContextPercent: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
24
+ minContextPercent: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
25
+ modelMaxContextPercent: Type.TOptional<Type.TRecord<"^.*$", Type.TNumber>>;
26
+ modelMinContextPercent: Type.TOptional<Type.TRecord<"^.*$", Type.TNumber>>;
27
+ maxContextLimit: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
28
+ minContextLimit: Type.TOptional<Type.TUnion<[Type.TNumber, Type.TString]>>;
29
+ modelMaxContextLimits: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TNumber, Type.TString]>>>;
30
+ modelMinContextLimits: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TNumber, Type.TString]>>>;
31
+ summaryBuffer: Type.TOptional<Type.TBoolean>;
32
+ nudgeFrequency: Type.TOptional<Type.TNumber>;
33
+ iterationNudgeThreshold: Type.TOptional<Type.TNumber>;
34
+ nudgeForce: Type.TOptional<Type.TUnion<[Type.TLiteral<"strong">, Type.TLiteral<"soft">]>>;
35
+ protectedTools: Type.TOptional<Type.TArray<Type.TString>>;
36
+ protectTags: Type.TOptional<Type.TBoolean>;
37
+ protectUserMessages: Type.TOptional<Type.TBoolean>;
38
+ autoCandidates: Type.TOptional<Type.TObject<{
39
+ enabled: Type.TOptional<Type.TBoolean>;
40
+ minContextPercent: Type.TOptional<Type.TNumber>;
41
+ keepRecentTurns: Type.TOptional<Type.TNumber>;
42
+ minMessages: Type.TOptional<Type.TNumber>;
43
+ minTokens: Type.TOptional<Type.TNumber>;
44
+ }>>;
45
+ messageMode: Type.TOptional<Type.TObject<{
46
+ enabled: Type.TOptional<Type.TBoolean>;
47
+ minContextPercent: Type.TOptional<Type.TNumber>;
48
+ keepRecentTurns: Type.TOptional<Type.TNumber>;
49
+ mediumTokens: Type.TOptional<Type.TNumber>;
50
+ highTokens: Type.TOptional<Type.TNumber>;
51
+ maxSuggestions: Type.TOptional<Type.TNumber>;
52
+ }>>;
53
+ }>>;
54
+ strategies: Type.TOptional<Type.TObject<{
55
+ deduplication: Type.TOptional<Type.TObject<{
56
+ enabled: Type.TOptional<Type.TBoolean>;
57
+ protectedTools: Type.TOptional<Type.TArray<Type.TString>>;
58
+ }>>;
59
+ purgeErrors: Type.TOptional<Type.TObject<{
60
+ enabled: Type.TOptional<Type.TBoolean>;
61
+ turns: Type.TOptional<Type.TNumber>;
62
+ protectedTools: Type.TOptional<Type.TArray<Type.TString>>;
63
+ }>>;
64
+ autoToolPruning: Type.TOptional<Type.TObject<{
65
+ enabled: Type.TOptional<Type.TBoolean>;
66
+ maxOutputTokens: Type.TOptional<Type.TNumber>;
67
+ keepRecentTurns: Type.TOptional<Type.TNumber>;
68
+ readLikeTools: Type.TOptional<Type.TArray<Type.TString>>;
69
+ readLikeTurns: Type.TOptional<Type.TNumber>;
70
+ protectedTools: Type.TOptional<Type.TArray<Type.TString>>;
71
+ }>>;
72
+ }>>;
73
+ protectedFilePatterns: Type.TOptional<Type.TArray<Type.TString>>;
74
+ pruneNotification: Type.TOptional<Type.TUnion<[Type.TLiteral<"off">, Type.TLiteral<"minimal">, Type.TLiteral<"detailed">]>>;
75
+ }>>;
76
+ asyncSubagents: Type.TOptional<Type.TObject<{
77
+ defaultType: Type.TOptional<Type.TString>;
78
+ routing: Type.TOptional<Type.TObject<{
79
+ enabled: Type.TOptional<Type.TBoolean>;
80
+ model: Type.TOptional<Type.TString>;
81
+ maxTaskChars: Type.TOptional<Type.TNumber>;
82
+ maxTokens: Type.TOptional<Type.TNumber>;
83
+ maxRetries: Type.TOptional<Type.TNumber>;
84
+ temperature: Type.TOptional<Type.TNumber>;
85
+ timeoutMs: Type.TOptional<Type.TNumber>;
86
+ debug: Type.TOptional<Type.TBoolean>;
87
+ }>>;
88
+ vision: Type.TOptional<Type.TObject<{
89
+ blindModelPatterns: Type.TOptional<Type.TArray<Type.TString>>;
90
+ }>>;
91
+ presets: Type.TOptional<Type.TRecord<"^.*$", Type.TObject<{
92
+ description: Type.TOptional<Type.TString>;
93
+ model: Type.TOptional<Type.TString>;
94
+ fallbackModels: Type.TOptional<Type.TArray<Type.TString>>;
95
+ thinking: Type.TOptional<Type.TString>;
96
+ extraArgs: Type.TOptional<Type.TArray<Type.TString>>;
97
+ timeoutMs: Type.TOptional<Type.TNumber>;
98
+ types: Type.TOptional<Type.TRecord<"^.*$", Type.TObject<{
99
+ model: Type.TOptional<Type.TString>;
100
+ fallbackModels: Type.TOptional<Type.TArray<Type.TString>>;
101
+ thinking: Type.TOptional<Type.TString>;
102
+ extraArgs: Type.TOptional<Type.TArray<Type.TString>>;
103
+ timeoutMs: Type.TOptional<Type.TNumber>;
104
+ }>>>;
105
+ }>>>;
106
+ types: Type.TOptional<Type.TRecord<"^.*$", Type.TObject<{
107
+ description: Type.TOptional<Type.TString>;
108
+ model: Type.TOptional<Type.TString>;
109
+ fallbackModels: Type.TOptional<Type.TArray<Type.TString>>;
110
+ thinking: Type.TOptional<Type.TString>;
111
+ tools: Type.TOptional<Type.TArray<Type.TString>>;
112
+ extraArgs: Type.TOptional<Type.TArray<Type.TString>>;
113
+ promptAppend: Type.TOptional<Type.TString>;
114
+ promptOverride: Type.TOptional<Type.TString>;
115
+ retry: Type.TOptional<Type.TObject<{
116
+ maxRetries: Type.TOptional<Type.TNumber>;
117
+ backoffMs: Type.TOptional<Type.TNumber>;
118
+ retryableExitCodes: Type.TOptional<Type.TArray<Type.TNumber>>;
119
+ }>>;
120
+ maxResultBytes: Type.TOptional<Type.TNumber>;
121
+ timeoutMs: Type.TOptional<Type.TNumber>;
122
+ }>>>;
123
+ maxConcurrent: Type.TOptional<Type.TNumber>;
124
+ retry: Type.TOptional<Type.TObject<{
125
+ maxRetries: Type.TOptional<Type.TNumber>;
126
+ backoffMs: Type.TOptional<Type.TNumber>;
127
+ retryableExitCodes: Type.TOptional<Type.TArray<Type.TNumber>>;
128
+ }>>;
129
+ maxResultBytes: Type.TOptional<Type.TNumber>;
130
+ timeoutMs: Type.TOptional<Type.TNumber>;
131
+ }>>;
132
+ toolRenderer: Type.TOptional<Type.TObject<{
133
+ default: Type.TOptional<Type.TObject<{
134
+ previewLines: Type.TOptional<Type.TNumber>;
135
+ direction: Type.TOptional<Type.TUnion<[Type.TLiteral<"head">, Type.TLiteral<"tail">]>>;
136
+ color: Type.TOptional<Type.TString>;
137
+ defaultExpanded: Type.TOptional<Type.TBoolean>;
138
+ compactHidden: Type.TOptional<Type.TBoolean>;
139
+ hidden: Type.TOptional<Type.TBoolean>;
140
+ }>>;
141
+ tools: Type.TOptional<Type.TRecord<"^.*$", Type.TObject<{
142
+ previewLines: Type.TOptional<Type.TNumber>;
143
+ direction: Type.TOptional<Type.TUnion<[Type.TLiteral<"head">, Type.TLiteral<"tail">]>>;
144
+ color: Type.TOptional<Type.TString>;
145
+ defaultExpanded: Type.TOptional<Type.TBoolean>;
146
+ compactHidden: Type.TOptional<Type.TBoolean>;
147
+ hidden: Type.TOptional<Type.TBoolean>;
148
+ }>>>;
149
+ }>>;
150
+ promptCommands: Type.TOptional<Type.TObject<{
151
+ commands: Type.TOptional<Type.TRecord<"^.*$", Type.TObject<{
152
+ description: Type.TOptional<Type.TString>;
153
+ prompt: Type.TString;
154
+ }>>>;
155
+ }>>;
156
+ lsp: Type.TOptional<Type.TObject<{
157
+ servers: Type.TOptional<Type.TArray<Type.TObject<{
158
+ id: Type.TString;
159
+ enabled: Type.TOptional<Type.TBoolean>;
160
+ include: Type.TOptional<Type.TArray<Type.TString>>;
161
+ exclude: Type.TOptional<Type.TArray<Type.TString>>;
162
+ rootMarkers: Type.TOptional<Type.TArray<Type.TString>>;
163
+ maxFileSizeBytes: Type.TOptional<Type.TNumber>;
164
+ bin: Type.TString;
165
+ args: Type.TOptional<Type.TArray<Type.TString>>;
166
+ cwd: Type.TOptional<Type.TString>;
167
+ env: Type.TOptional<Type.TRecord<"^.*$", Type.TString>>;
168
+ config: Type.TOptional<Type.TString>;
169
+ languageIdByExtension: Type.TOptional<Type.TRecord<"^.*$", Type.TString>>;
170
+ startupTimeoutMs: Type.TOptional<Type.TNumber>;
171
+ diagnosticsWaitMs: Type.TOptional<Type.TNumber>;
172
+ initializationOptions: Type.TOptional<Type.TUnknown>;
173
+ settings: Type.TOptional<Type.TUnknown>;
174
+ }>>>;
175
+ }>>;
176
+ }>;
177
+ export type PiToolsSuiteConfigSchemaType = Static<typeof PiToolsSuiteConfigSchema>;
@@ -0,0 +1,218 @@
1
+ /**
2
+ * TypeBox JSON Schema definitions for pi-tools-suite.jsonc (~/.config/pi/pi-tools-suite.jsonc).
3
+ *
4
+ * All fields are optional because the runtime applies generous defaults.
5
+ * The generated JSON Schema includes `"additionalProperties": true`.
6
+ */
7
+ import { Type } from "typebox";
8
+ // ---------------------------------------------------------------------------
9
+ // Shared primitives
10
+ // ---------------------------------------------------------------------------
11
+ // ---------------------------------------------------------------------------
12
+ // Tool renderer (same shape as pix)
13
+ // ---------------------------------------------------------------------------
14
+ const ToolRendererRule = Type.Object({
15
+ previewLines: Type.Optional(Type.Number({ minimum: 0, description: "Lines to show in the tool preview." })),
16
+ direction: Type.Optional(Type.Union([Type.Literal("head"), Type.Literal("tail")], { description: "Preview direction." })),
17
+ color: Type.Optional(Type.String({ description: "Theme color name or hex color." })),
18
+ defaultExpanded: Type.Optional(Type.Boolean({ description: "Expand tool output by default." })),
19
+ compactHidden: Type.Optional(Type.Boolean({ description: "Compact hidden placeholder." })),
20
+ hidden: Type.Optional(Type.Boolean({ description: "Hide tool output completely." })),
21
+ }, { description: "Per-tool rendering rule." });
22
+ const ToolRendererConfig = Type.Object({
23
+ default: Type.Optional(ToolRendererRule),
24
+ tools: Type.Optional(Type.Record(Type.String(), ToolRendererRule, { description: "Tool-specific rendering rules keyed by tool name or glob pattern, e.g. 'bash' or 'repo_*'." })),
25
+ }, { description: "Per-tool rendering configuration." });
26
+ // ---------------------------------------------------------------------------
27
+ // Terminal bell
28
+ // ---------------------------------------------------------------------------
29
+ const TerminalBellConfig = Type.Object({
30
+ sound: Type.Optional(Type.Boolean({ description: "Play terminal bell sound on completion/error." })),
31
+ }, { description: "Terminal bell configuration." });
32
+ // ---------------------------------------------------------------------------
33
+ // DCP (Dynamic Context Pruning)
34
+ // ---------------------------------------------------------------------------
35
+ const DcpManualModeConfig = Type.Object({
36
+ enabled: Type.Optional(Type.Boolean({ description: "Enable manual DCP mode." })),
37
+ automaticStrategies: Type.Optional(Type.Boolean({ description: "Run dedup/purge even in manual mode." })),
38
+ }, { description: "Manual mode configuration." });
39
+ const DcpAutoCandidatesConfig = Type.Object({
40
+ enabled: Type.Optional(Type.Boolean({ description: "Enable auto candidate selection for compression." })),
41
+ minContextPercent: Type.Optional(Type.Number({ description: "Minimum context usage to trigger auto-candidates.", minimum: 0, maximum: 1 })),
42
+ keepRecentTurns: Type.Optional(Type.Number({ description: "Number of recent turns to keep.", minimum: 0 })),
43
+ minMessages: Type.Optional(Type.Number({ description: "Minimum messages before auto-candidate selection.", minimum: 0 })),
44
+ minTokens: Type.Optional(Type.Number({ description: "Minimum tokens for auto-candidate selection.", minimum: 0 })),
45
+ }, { description: "Auto-candidate selection for compression." });
46
+ const DcpMessageModeConfig = Type.Object({
47
+ enabled: Type.Optional(Type.Boolean({ description: "Enable message-mode compression suggestions." })),
48
+ minContextPercent: Type.Optional(Type.Number({ description: "Minimum context usage to trigger message mode.", minimum: 0, maximum: 1 })),
49
+ keepRecentTurns: Type.Optional(Type.Number({ description: "Recent turns to keep.", minimum: 0 })),
50
+ mediumTokens: Type.Optional(Type.Number({ description: "Token threshold for medium-quality summary.", minimum: 0 })),
51
+ highTokens: Type.Optional(Type.Number({ description: "Token threshold for high-quality summary.", minimum: 0 })),
52
+ maxSuggestions: Type.Optional(Type.Number({ description: "Maximum compression suggestions.", minimum: 0 })),
53
+ }, { description: "Message-mode compression configuration." });
54
+ const DcpCompressConfig = Type.Object({
55
+ maxContextPercent: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: "Maximum context percent (0–1 or '80%') before compression triggers." })),
56
+ minContextPercent: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: "Target context percent after compression." })),
57
+ modelMaxContextPercent: Type.Optional(Type.Record(Type.String(), Type.Number(), { description: "Per-model max context percent overrides." })),
58
+ modelMinContextPercent: Type.Optional(Type.Record(Type.String(), Type.Number(), { description: "Per-model min context percent overrides." })),
59
+ maxContextLimit: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: "Absolute max context tokens or '200k'." })),
60
+ minContextLimit: Type.Optional(Type.Union([Type.Number(), Type.String()], { description: "Absolute min context tokens." })),
61
+ modelMaxContextLimits: Type.Optional(Type.Record(Type.String(), Type.Union([Type.Number(), Type.String()]), { description: "Per-model max context limit overrides." })),
62
+ modelMinContextLimits: Type.Optional(Type.Record(Type.String(), Type.Union([Type.Number(), Type.String()]), { description: "Per-model min context limit overrides." })),
63
+ summaryBuffer: Type.Optional(Type.Boolean({ description: "Buffer summary output." })),
64
+ nudgeFrequency: Type.Optional(Type.Number({ description: "Inject nudge every N context events.", minimum: 1 })),
65
+ iterationNudgeThreshold: Type.Optional(Type.Number({ description: "Nudge after N tool calls since last user message.", minimum: 1 })),
66
+ nudgeForce: Type.Optional(Type.Union([Type.Literal("strong"), Type.Literal("soft")], { description: "Nudge intensity." })),
67
+ protectedTools: Type.Optional(Type.Array(Type.String(), { description: "Tool outputs protected from pruning." })),
68
+ protectTags: Type.Optional(Type.Boolean({ description: "Protect XML-like tags from pruning." })),
69
+ protectUserMessages: Type.Optional(Type.Boolean({ description: "Protect user messages from pruning." })),
70
+ autoCandidates: Type.Optional(DcpAutoCandidatesConfig),
71
+ messageMode: Type.Optional(DcpMessageModeConfig),
72
+ }, { description: "Compression trigger and behavior configuration." });
73
+ const DcpDeduplicationConfig = Type.Object({
74
+ enabled: Type.Optional(Type.Boolean({ description: "Enable duplicate content deduplication." })),
75
+ protectedTools: Type.Optional(Type.Array(Type.String(), { description: "Tool outputs protected from dedup." })),
76
+ }, { description: "Deduplication strategy configuration." });
77
+ const DcpPurgeErrorsConfig = Type.Object({
78
+ enabled: Type.Optional(Type.Boolean({ description: "Enable error input purging." })),
79
+ turns: Type.Optional(Type.Number({ description: "Prune error inputs after N user turns.", minimum: 1 })),
80
+ protectedTools: Type.Optional(Type.Array(Type.String(), { description: "Tool outputs protected from error purge." })),
81
+ }, { description: "Error purging strategy configuration." });
82
+ const DcpAutoToolPruningConfig = Type.Object({
83
+ enabled: Type.Optional(Type.Boolean({ description: "Enable automatic tool output pruning." })),
84
+ maxOutputTokens: Type.Optional(Type.Number({ description: "Maximum output tokens before truncation.", minimum: 0 })),
85
+ keepRecentTurns: Type.Optional(Type.Number({ description: "Recent turns to keep.", minimum: 0 })),
86
+ readLikeTools: Type.Optional(Type.Array(Type.String(), { description: "Tools treated as read-like (aggressively pruned)." })),
87
+ readLikeTurns: Type.Optional(Type.Number({ description: "Turns threshold for read-like tool pruning.", minimum: 0 })),
88
+ protectedTools: Type.Optional(Type.Array(Type.String(), { description: "Tool outputs protected from auto-pruning." })),
89
+ }, { description: "Auto tool pruning strategy configuration." });
90
+ const DcpStrategiesConfig = Type.Object({
91
+ deduplication: Type.Optional(DcpDeduplicationConfig),
92
+ purgeErrors: Type.Optional(DcpPurgeErrorsConfig),
93
+ autoToolPruning: Type.Optional(DcpAutoToolPruningConfig),
94
+ }, { description: "DCP pruning strategies." });
95
+ const DcpConfig = Type.Object({
96
+ enabled: Type.Optional(Type.Boolean({ description: "Enable DCP (Dynamic Context Pruning)." })),
97
+ debug: Type.Optional(Type.Boolean({ description: "Enable DCP debug logging." })),
98
+ manualMode: Type.Optional(DcpManualModeConfig),
99
+ compress: Type.Optional(DcpCompressConfig),
100
+ strategies: Type.Optional(DcpStrategiesConfig),
101
+ protectedFilePatterns: Type.Optional(Type.Array(Type.String(), { description: "File path glob patterns whose content is protected from pruning." })),
102
+ pruneNotification: Type.Optional(Type.Union([Type.Literal("off"), Type.Literal("minimal"), Type.Literal("detailed")], { description: "Notification level when pruning occurs." })),
103
+ }, { description: "DCP (Dynamic Context Pruning) configuration." });
104
+ // ---------------------------------------------------------------------------
105
+ // Async subagents
106
+ // ---------------------------------------------------------------------------
107
+ const RetryConfig = Type.Object({
108
+ maxRetries: Type.Optional(Type.Number({ description: "Maximum retry attempts.", minimum: 0 })),
109
+ backoffMs: Type.Optional(Type.Number({ description: "Base delay in ms before first retry.", minimum: 0 })),
110
+ retryableExitCodes: Type.Optional(Type.Array(Type.Number(), { description: "Exit codes eligible for retry. Empty array disables retry." })),
111
+ }, { description: "Retry configuration for sub-agents." });
112
+ const SubagentRoutingConfig = Type.Object({
113
+ enabled: Type.Optional(Type.Boolean({ description: "Enable LLM-based automatic role routing." })),
114
+ model: Type.Optional(Type.String({ description: "Router model in provider/model form." })),
115
+ maxTaskChars: Type.Optional(Type.Number({ description: "Max task/scope characters sent to router.", minimum: 100 })),
116
+ maxTokens: Type.Optional(Type.Number({ description: "Max router response tokens.", minimum: 8 })),
117
+ maxRetries: Type.Optional(Type.Number({ description: "Router request retries.", minimum: 0 })),
118
+ temperature: Type.Optional(Type.Number({ description: "Router sampling temperature.", minimum: 0, maximum: 2 })),
119
+ timeoutMs: Type.Optional(Type.Number({ description: "Router request timeout in ms.", minimum: 1000 })),
120
+ debug: Type.Optional(Type.Boolean({ description: "Show routing debug warnings." })),
121
+ }, { description: "LLM-based role routing configuration." });
122
+ const SubagentVisionConfig = Type.Object({
123
+ blindModelPatterns: Type.Optional(Type.Array(Type.String(), { description: "Glob-like model refs treated as unable to inspect images." })),
124
+ }, { description: "Vision capability overrides." });
125
+ const SubagentPresetTypeOverride = Type.Object({
126
+ model: Type.Optional(Type.String({ description: "Model override for this type within the preset." })),
127
+ fallbackModels: Type.Optional(Type.Array(Type.String(), { description: "Per-role fallback models." })),
128
+ thinking: Type.Optional(Type.String({ description: "Thinking level override." })),
129
+ extraArgs: Type.Optional(Type.Array(Type.String(), { description: "Extra CLI arguments." })),
130
+ timeoutMs: Type.Optional(Type.Number({ description: "Per-agent wall-clock timeout in ms.", minimum: 1 })),
131
+ }, { description: "Per-type override within a preset." });
132
+ const SubagentPreset = Type.Object({
133
+ description: Type.Optional(Type.String({ description: "Preset description." })),
134
+ model: Type.Optional(Type.String({ description: "Default model for this preset." })),
135
+ fallbackModels: Type.Optional(Type.Array(Type.String(), { description: "Global fallback models for this preset." })),
136
+ thinking: Type.Optional(Type.String({ description: "Default thinking level." })),
137
+ extraArgs: Type.Optional(Type.Array(Type.String(), { description: "Extra CLI arguments." })),
138
+ timeoutMs: Type.Optional(Type.Number({ description: "Per-agent wall-clock timeout in ms.", minimum: 1 })),
139
+ types: Type.Optional(Type.Record(Type.String(), SubagentPresetTypeOverride, { description: "Per-type overrides." })),
140
+ }, { description: "Named spawn preset." });
141
+ const SubagentTypeConfig = Type.Object({
142
+ description: Type.Optional(Type.String({ description: "Role description for routing." })),
143
+ model: Type.Optional(Type.String({ description: "Model for this sub-agent type." })),
144
+ fallbackModels: Type.Optional(Type.Array(Type.String(), { description: "Ordered model fallbacks." })),
145
+ thinking: Type.Optional(Type.String({ description: "Thinking level." })),
146
+ tools: Type.Optional(Type.Array(Type.String(), { description: "Enabled tools for this type." })),
147
+ extraArgs: Type.Optional(Type.Array(Type.String(), { description: "Extra CLI arguments." })),
148
+ promptAppend: Type.Optional(Type.String({ description: "Extra prompt text appended after generated prompt." })),
149
+ promptOverride: Type.Optional(Type.String({ description: "Full prompt replacement." })),
150
+ retry: Type.Optional(RetryConfig),
151
+ maxResultBytes: Type.Optional(Type.Number({ description: "Max bytes in result summary.", minimum: 0 })),
152
+ timeoutMs: Type.Optional(Type.Number({ description: "Per-agent wall-clock timeout in ms.", minimum: 1 })),
153
+ }, { description: "Configuration for a sub-agent type/role." });
154
+ const AsyncSubagentsConfig = Type.Object({
155
+ defaultType: Type.Optional(Type.String({ description: "Default sub-agent type when not specified." })),
156
+ routing: Type.Optional(SubagentRoutingConfig),
157
+ vision: Type.Optional(SubagentVisionConfig),
158
+ presets: Type.Optional(Type.Record(Type.String(), SubagentPreset, { description: "Named spawn presets." })),
159
+ types: Type.Optional(Type.Record(Type.String(), SubagentTypeConfig, { description: "Sub-agent type definitions." })),
160
+ maxConcurrent: Type.Optional(Type.Number({ description: "Max concurrent agents per spawn batch (0 = unlimited).", minimum: 0 })),
161
+ retry: Type.Optional(RetryConfig),
162
+ maxResultBytes: Type.Optional(Type.Number({ description: "Global max bytes in result summary.", minimum: 0 })),
163
+ timeoutMs: Type.Optional(Type.Number({ description: "Global per-agent wall-clock timeout in ms.", minimum: 1 })),
164
+ }, { description: "Async sub-agent configuration." });
165
+ // ---------------------------------------------------------------------------
166
+ // Prompt commands
167
+ // ---------------------------------------------------------------------------
168
+ const PromptCommand = Type.Object({
169
+ description: Type.Optional(Type.String({ description: "Short description shown in command menu." })),
170
+ prompt: Type.String({ description: "The prompt text to send. Supports {cwd} template variable." }),
171
+ }, { description: "A saved slash command." });
172
+ const PromptCommandsConfig = Type.Object({
173
+ commands: Type.Optional(Type.Record(Type.String(), PromptCommand, { description: "Command definitions keyed by slash command name." })),
174
+ }, { description: "User-defined slash commands." });
175
+ // ---------------------------------------------------------------------------
176
+ // LSP
177
+ // ---------------------------------------------------------------------------
178
+ const LspServerConfig = Type.Object({
179
+ id: Type.String({ description: "Unique server identifier." }),
180
+ enabled: Type.Optional(Type.Boolean({ description: "Enable/disable this server." })),
181
+ include: Type.Optional(Type.Array(Type.String(), { description: "File glob patterns to include." })),
182
+ exclude: Type.Optional(Type.Array(Type.String(), { description: "File glob patterns to exclude." })),
183
+ rootMarkers: Type.Optional(Type.Array(Type.String(), { description: "Files that indicate a project root (e.g. ['package.json', '.git'])." })),
184
+ maxFileSizeBytes: Type.Optional(Type.Number({ description: "Max file size to send to the server.", minimum: 0 })),
185
+ bin: Type.String({ description: "Path to the language server binary." }),
186
+ args: Type.Optional(Type.Array(Type.String(), { description: "Command-line arguments." })),
187
+ cwd: Type.Optional(Type.String({ description: "Working directory for the server process." })),
188
+ env: Type.Optional(Type.Record(Type.String(), Type.String(), { description: "Environment variables." })),
189
+ config: Type.Optional(Type.String({ description: "Path to server configuration file." })),
190
+ languageIdByExtension: Type.Optional(Type.Record(Type.String(), Type.String(), { description: "File extension → language ID mapping, e.g. {'.ts': 'typescript'}." })),
191
+ startupTimeoutMs: Type.Optional(Type.Number({ description: "Server startup timeout in ms.", minimum: 1000 })),
192
+ diagnosticsWaitMs: Type.Optional(Type.Number({ description: "Wait time for diagnostics after file change.", minimum: 0 })),
193
+ initializationOptions: Type.Optional(Type.Unknown({ description: "LSP initialization options passed to the server." })),
194
+ settings: Type.Optional(Type.Unknown({ description: "LSP workspace/settings passed to the server." })),
195
+ }, { description: "LSP server configuration." });
196
+ const LspConfig = Type.Object({
197
+ servers: Type.Optional(Type.Array(LspServerConfig, { description: "LSP server definitions." })),
198
+ }, { description: "Language Server Protocol configuration." });
199
+ // ---------------------------------------------------------------------------
200
+ // Top-level schema
201
+ // ---------------------------------------------------------------------------
202
+ export const PiToolsSuiteConfigSchema = Type.Object({
203
+ $schema: Type.Optional(Type.String({ description: "JSON Schema URL used by editors for validation and autocomplete." })),
204
+ enabled: Type.Optional(Type.Boolean({ description: "Enable or disable the entire pi-tools-suite extension." })),
205
+ disabledModules: Type.Optional(Type.Array(Type.String(), { description: "List of disabled module names (e.g. ['lsp', 'prompt-commands'])." })),
206
+ terminalBell: Type.Optional(TerminalBellConfig),
207
+ dcp: Type.Optional(DcpConfig),
208
+ asyncSubagents: Type.Optional(AsyncSubagentsConfig),
209
+ toolRenderer: Type.Optional(ToolRendererConfig),
210
+ promptCommands: Type.Optional(PromptCommandsConfig),
211
+ lsp: Type.Optional(LspConfig),
212
+ }, {
213
+ $id: "https://unpkg.com/pi-ui-extend/schemas/pi-tools-suite.json",
214
+ $schema: "https://json-schema.org/draft-07/schema#",
215
+ title: "Pi Tools Suite Configuration",
216
+ description: "Configuration for the pi-tools-suite extension (~/.config/pi/pi-tools-suite.jsonc).",
217
+ additionalProperties: true,
218
+ });
@@ -0,0 +1,65 @@
1
+ /**
2
+ * TypeBox JSON Schema definitions for pix.jsonc (~/.config/pi/pix.jsonc).
3
+ *
4
+ * These schemas describe the _user-facing_ config shape — all fields are optional
5
+ * because the runtime applies generous defaults. The generated JSON Schema files
6
+ * include `"additionalProperties": true` so that future fields are not rejected.
7
+ */
8
+ import { Type, Static } from "typebox";
9
+ export declare const PixConfigSchema: Type.TObject<{
10
+ $schema: Type.TOptional<Type.TString>;
11
+ defaultModel: Type.TOptional<Type.TObject<{
12
+ modelRef: Type.TOptional<Type.TString>;
13
+ thinking: Type.TOptional<Type.TUnion<Type.TLiteral<string>[]>>;
14
+ }>>;
15
+ toolRenderer: Type.TOptional<Type.TObject<{
16
+ default: Type.TOptional<Type.TObject<{
17
+ previewLines: Type.TOptional<Type.TNumber>;
18
+ direction: Type.TOptional<Type.TUnion<[Type.TLiteral<"head">, Type.TLiteral<"tail">]>>;
19
+ color: Type.TOptional<Type.TString>;
20
+ defaultExpanded: Type.TOptional<Type.TBoolean>;
21
+ compactHidden: Type.TOptional<Type.TBoolean>;
22
+ hidden: Type.TOptional<Type.TBoolean>;
23
+ }>>;
24
+ tools: Type.TOptional<Type.TRecord<"^.*$", Type.TObject<{
25
+ previewLines: Type.TOptional<Type.TNumber>;
26
+ direction: Type.TOptional<Type.TUnion<[Type.TLiteral<"head">, Type.TLiteral<"tail">]>>;
27
+ color: Type.TOptional<Type.TString>;
28
+ defaultExpanded: Type.TOptional<Type.TBoolean>;
29
+ compactHidden: Type.TOptional<Type.TBoolean>;
30
+ hidden: Type.TOptional<Type.TBoolean>;
31
+ }>>>;
32
+ }>>;
33
+ outputFilters: Type.TOptional<Type.TObject<{
34
+ patterns: Type.TOptional<Type.TArray<Type.TString>>;
35
+ }>>;
36
+ promptEnhancer: Type.TOptional<Type.TObject<{
37
+ modelRef: Type.TOptional<Type.TString>;
38
+ }>>;
39
+ autocomplete: Type.TOptional<Type.TObject<{
40
+ modelRef: Type.TOptional<Type.TString>;
41
+ debounceMs: Type.TOptional<Type.TNumber>;
42
+ timeoutMs: Type.TOptional<Type.TNumber>;
43
+ maxTokens: Type.TOptional<Type.TNumber>;
44
+ maxPromptTokens: Type.TOptional<Type.TNumber>;
45
+ includeRecentMessages: Type.TOptional<Type.TNumber>;
46
+ }>>;
47
+ sessionTitle: Type.TOptional<Type.TObject<{
48
+ modelRef: Type.TOptional<Type.TString>;
49
+ }>>;
50
+ modelColors: Type.TOptional<Type.TUnion<[Type.TRecord<"^.*$", Type.TString>, Type.TObject<{
51
+ rules: Type.TOptional<Type.TRecord<"^.*$", Type.TString>>;
52
+ }>]>>;
53
+ iconTheme: Type.TOptional<Type.TObject<{
54
+ name: Type.TOptional<Type.TString>;
55
+ }>>;
56
+ dictation: Type.TOptional<Type.TObject<{
57
+ language: Type.TOptional<Type.TString>;
58
+ languages: Type.TOptional<Type.TRecord<"^.*$", Type.TObject<{
59
+ dirName: Type.TString;
60
+ url: Type.TString;
61
+ label: Type.TString;
62
+ }>>>;
63
+ }>>;
64
+ }>;
65
+ export type PixConfigSchemaType = Static<typeof PixConfigSchema>;
@@ -0,0 +1,91 @@
1
+ /**
2
+ * TypeBox JSON Schema definitions for pix.jsonc (~/.config/pi/pix.jsonc).
3
+ *
4
+ * These schemas describe the _user-facing_ config shape — all fields are optional
5
+ * because the runtime applies generous defaults. The generated JSON Schema files
6
+ * include `"additionalProperties": true` so that future fields are not rejected.
7
+ */
8
+ import { Type } from "typebox";
9
+ // ---------------------------------------------------------------------------
10
+ // Shared primitives
11
+ // ---------------------------------------------------------------------------
12
+ const ThinkingLevel = Type.Union(["off", "minimal", "low", "medium", "high", "xhigh"].map((v) => Type.Literal(v)), { description: "Model thinking budget level." });
13
+ // ---------------------------------------------------------------------------
14
+ // Tool renderer
15
+ // ---------------------------------------------------------------------------
16
+ const ToolRendererRule = Type.Object({
17
+ previewLines: Type.Optional(Type.Number({ description: "Lines to show in the tool preview.", minimum: 0 })),
18
+ direction: Type.Optional(Type.Union([Type.Literal("head"), Type.Literal("tail")], { description: "Show preview from head or tail of output." })),
19
+ color: Type.Optional(Type.String({ description: "Theme color name (e.g. 'warning', 'success', 'muted') or hex color." })),
20
+ defaultExpanded: Type.Optional(Type.Boolean({ description: "Whether the tool output is expanded by default." })),
21
+ compactHidden: Type.Optional(Type.Boolean({ description: "Hide tool output but keep a compact one-line placeholder." })),
22
+ hidden: Type.Optional(Type.Boolean({ description: "Completely hide the tool output." })),
23
+ }, { description: "Rendering rule for a specific tool or glob pattern." });
24
+ const ToolRendererConfig = Type.Object({
25
+ default: Type.Optional(ToolRendererRule),
26
+ tools: Type.Optional(Type.Record(Type.String(), ToolRendererRule, { description: "Tool-specific rendering rules keyed by tool name or glob pattern, e.g. 'bash' or 'repo_*'." })),
27
+ }, { description: "Per-tool rendering configuration. Keys in 'tools' support glob patterns like 'repo_*'." });
28
+ // ---------------------------------------------------------------------------
29
+ // Other sections
30
+ // ---------------------------------------------------------------------------
31
+ const OutputFiltersConfig = Type.Object({
32
+ patterns: Type.Optional(Type.Array(Type.String(), { description: "Glob or /regex/ patterns to strip from tool output." })),
33
+ }, { description: "Output filter patterns." });
34
+ const DefaultModelConfig = Type.Object({
35
+ modelRef: Type.Optional(Type.String({ description: "Provider/model identifier, e.g. 'openai-codex/gpt-5.4'." })),
36
+ thinking: Type.Optional(ThinkingLevel),
37
+ }, { description: "Default model selection for new sessions." });
38
+ const PromptEnhancerConfig = Type.Object({
39
+ modelRef: Type.Optional(Type.String({ description: "Model used for prompt enhancement." })),
40
+ }, { description: "Prompt enhancer configuration." });
41
+ const SessionTitleConfig = Type.Object({
42
+ modelRef: Type.Optional(Type.String({ description: "Model used to generate compact session titles." })),
43
+ }, { description: "Automatic session title generation configuration." });
44
+ const AutocompleteConfig = Type.Object({
45
+ modelRef: Type.Optional(Type.String({ description: "Model for inline autocomplete. Empty string disables LLM autocomplete." })),
46
+ debounceMs: Type.Optional(Type.Number({ description: "Delay after typing before requesting completion.", minimum: 100, maximum: 2000 })),
47
+ timeoutMs: Type.Optional(Type.Number({ description: "Hard timeout for completion request.", minimum: 250, maximum: 10000 })),
48
+ maxTokens: Type.Optional(Type.Number({ description: "Maximum output tokens.", minimum: 8, maximum: 256 })),
49
+ maxPromptTokens: Type.Optional(Type.Number({ description: "Maximum input prompt tokens.", minimum: 256, maximum: 16000 })),
50
+ includeRecentMessages: Type.Optional(Type.Number({ description: "Recent messages to include as context.", minimum: 0, maximum: 20 })),
51
+ }, { description: "Inline autocomplete configuration." });
52
+ const ModelColorRulesConfig = Type.Record(Type.String(), Type.String({ description: "Theme color name for matching model references, e.g. 'success', 'warning', or 'modelOpenAI'." }), { description: "Model reference glob pattern → theme color name mapping, e.g. 'zai/*': 'success'." });
53
+ const ModelColorsConfig = Type.Union([
54
+ ModelColorRulesConfig,
55
+ Type.Object({
56
+ rules: Type.Optional(ModelColorRulesConfig),
57
+ }, { description: "Alternative nested form for model color rules." }),
58
+ ], { description: "Model color rules. Keys are glob patterns matching model refs; values are pix theme color names." });
59
+ const IconThemeConfig = Type.Object({
60
+ name: Type.Optional(Type.String({ description: "Icon theme name, e.g. 'nerdFont' or 'fallback'." })),
61
+ }, { description: "Icon theme configuration." });
62
+ const DictationLanguageModelConfig = Type.Object({
63
+ dirName: Type.String({ description: "Vosk model directory name." }),
64
+ url: Type.String({ description: "Download URL for the Vosk model zip." }),
65
+ label: Type.String({ description: "Human-readable language label." }),
66
+ }, { description: "Vosk voice dictation model definition." });
67
+ const DictationConfig = Type.Object({
68
+ language: Type.Optional(Type.String({ description: "Selected language code, e.g. 'en' or 'ru'." })),
69
+ languages: Type.Optional(Type.Record(Type.String(), DictationLanguageModelConfig, { description: "Available language models keyed by language code." })),
70
+ }, { description: "Voice dictation (Vosk) configuration." });
71
+ // ---------------------------------------------------------------------------
72
+ // Top-level schema
73
+ // ---------------------------------------------------------------------------
74
+ export const PixConfigSchema = Type.Object({
75
+ $schema: Type.Optional(Type.String({ description: "JSON Schema URL used by editors for validation and autocomplete." })),
76
+ defaultModel: Type.Optional(DefaultModelConfig),
77
+ toolRenderer: Type.Optional(ToolRendererConfig),
78
+ outputFilters: Type.Optional(OutputFiltersConfig),
79
+ promptEnhancer: Type.Optional(PromptEnhancerConfig),
80
+ autocomplete: Type.Optional(AutocompleteConfig),
81
+ sessionTitle: Type.Optional(SessionTitleConfig),
82
+ modelColors: Type.Optional(ModelColorsConfig),
83
+ iconTheme: Type.Optional(IconThemeConfig),
84
+ dictation: Type.Optional(DictationConfig),
85
+ }, {
86
+ $id: "https://unpkg.com/pi-ui-extend/schemas/pix.json",
87
+ $schema: "https://json-schema.org/draft-07/schema#",
88
+ title: "Pix Configuration",
89
+ description: "Configuration for the pix terminal renderer (~/.config/pi/pix.jsonc).",
90
+ additionalProperties: true,
91
+ });