@pi-unipi/unipi 2.6.0 → 2.6.2

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 (205) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/package.json +21 -22
  3. package/packages/ask-user/package.json +2 -2
  4. package/packages/ask-user/settings-tui.ts +18 -34
  5. package/packages/autocomplete/package.json +1 -1
  6. package/packages/autocomplete/src/constants.ts +2 -15
  7. package/packages/autocomplete/src/provider.ts +3 -17
  8. package/packages/btw/extensions/btw.ts +18 -45
  9. package/packages/btw/package.json +2 -2
  10. package/packages/compactor/README.md +2 -2
  11. package/packages/compactor/package.json +3 -3
  12. package/packages/compactor/skills/compactor/SKILL.md +1 -1
  13. package/packages/compactor/skills/compactor-detail/SKILL.md +3 -5
  14. package/packages/compactor/skills/compactor-doctor/SKILL.md +1 -1
  15. package/packages/compactor/skills/compactor-stats/SKILL.md +1 -1
  16. package/packages/compactor/src/commands/index.ts +47 -78
  17. package/packages/compactor/src/compaction/brief.ts +161 -90
  18. package/packages/compactor/src/compaction/build-sections.ts +3 -4
  19. package/packages/compactor/src/compaction/compact-args.ts +86 -0
  20. package/packages/compactor/src/compaction/cut.ts +270 -28
  21. package/packages/compactor/src/compaction/drill-down.ts +261 -0
  22. package/packages/compactor/src/compaction/format-recall.ts +96 -0
  23. package/packages/compactor/src/compaction/format.ts +8 -3
  24. package/packages/compactor/src/compaction/hooks.ts +248 -72
  25. package/packages/compactor/src/compaction/merge.ts +34 -4
  26. package/packages/compactor/src/compaction/rank.ts +270 -0
  27. package/packages/compactor/src/compaction/recall-scope.ts +28 -0
  28. package/packages/compactor/src/compaction/search-entries.ts +333 -96
  29. package/packages/compactor/src/compaction/skill-collapse.ts +35 -0
  30. package/packages/compactor/src/compaction/summarize.ts +37 -6
  31. package/packages/compactor/src/compaction/token-estimate.ts +104 -0
  32. package/packages/compactor/src/compaction/touched-files.ts +35 -0
  33. package/packages/compactor/src/config/manager.ts +2 -27
  34. package/packages/compactor/src/config/presets.ts +0 -2
  35. package/packages/compactor/src/config/schema.ts +2 -16
  36. package/packages/compactor/src/executor/executor.ts +6 -15
  37. package/packages/compactor/src/executor/runtime.ts +2 -12
  38. package/packages/compactor/src/index.ts +4 -121
  39. package/packages/compactor/src/info-screen.ts +3 -10
  40. package/packages/compactor/src/security/evaluator.ts +0 -53
  41. package/packages/compactor/src/security/policy.ts +7 -8
  42. package/packages/compactor/src/session/db.ts +0 -6
  43. package/packages/compactor/src/tools/ctx-execute-file.ts +0 -5
  44. package/packages/compactor/src/tools/register.ts +27 -50
  45. package/packages/compactor/src/tools/vcc-recall.ts +86 -48
  46. package/packages/compactor/src/tui/settings-overlay.ts +20 -40
  47. package/packages/compactor/src/types.ts +43 -100
  48. package/packages/core/constants.ts +1 -28
  49. package/packages/core/events.ts +1 -83
  50. package/packages/core/index.ts +1 -0
  51. package/packages/core/model-cache.ts +18 -12
  52. package/packages/core/package.json +3 -1
  53. package/packages/core/tui-overlay.ts +89 -0
  54. package/packages/core/tui-width.ts +18 -0
  55. package/packages/core/utils.ts +43 -0
  56. package/packages/footer/package.json +2 -2
  57. package/packages/footer/src/help.ts +2 -2
  58. package/packages/footer/src/index.ts +9 -10
  59. package/packages/footer/src/presets.ts +1 -27
  60. package/packages/footer/src/registry/index.ts +0 -23
  61. package/packages/footer/src/rendering/icons.ts +0 -13
  62. package/packages/footer/src/rendering/renderer.ts +5 -40
  63. package/packages/footer/src/rendering/separators.ts +0 -10
  64. package/packages/footer/src/rendering/theme.ts +1 -15
  65. package/packages/footer/src/segments/compactor.ts +7 -14
  66. package/packages/footer/src/segments/core.ts +15 -54
  67. package/packages/footer/src/segments/kanboard.ts +5 -5
  68. package/packages/footer/src/segments/mcp.ts +5 -5
  69. package/packages/footer/src/segments/memory.ts +4 -4
  70. package/packages/footer/src/segments/notify.ts +2 -2
  71. package/packages/footer/src/segments/ralph.ts +3 -3
  72. package/packages/footer/src/segments/status-ext.ts +1 -1
  73. package/packages/footer/src/segments/workflow.ts +3 -3
  74. package/packages/footer/src/tps-tracker.ts +0 -8
  75. package/packages/footer/src/tui/settings-tui.ts +14 -31
  76. package/packages/footer/src/types.ts +0 -15
  77. package/packages/image/package.json +2 -2
  78. package/packages/image/src/register-providers.ts +0 -11
  79. package/packages/image/src/tools.ts +0 -3
  80. package/packages/image/src/tui/model-selector.ts +36 -71
  81. package/packages/info-screen/config.ts +0 -16
  82. package/packages/info-screen/core-groups.ts +0 -10
  83. package/packages/info-screen/index.ts +22 -13
  84. package/packages/info-screen/package.json +2 -2
  85. package/packages/info-screen/registry.ts +1 -72
  86. package/packages/info-screen/tui/info-overlay.ts +85 -100
  87. package/packages/info-screen/usage-parser.ts +12 -47
  88. package/packages/input-shortcuts/package.json +2 -2
  89. package/packages/input-shortcuts/src/index.ts +3 -3
  90. package/packages/input-shortcuts/src/registers.ts +0 -8
  91. package/packages/input-shortcuts/src/settings-overlay.ts +4 -13
  92. package/packages/input-shortcuts/src/undo-redo.ts +0 -12
  93. package/packages/kanboard/package.json +2 -2
  94. package/packages/mcp/package.json +2 -2
  95. package/packages/mcp/src/bridge/client.ts +0 -15
  96. package/packages/mcp/src/config/manager.ts +0 -38
  97. package/packages/mcp/src/config/schema.ts +0 -27
  98. package/packages/mcp/src/config/sync.ts +0 -29
  99. package/packages/mcp/src/index.ts +1 -1
  100. package/packages/mcp/src/tui/add-overlay.ts +6 -6
  101. package/packages/mcp/src/types.ts +0 -6
  102. package/packages/memory/embedding.ts +0 -31
  103. package/packages/memory/mempalace.ts +0 -16
  104. package/packages/memory/package.json +4 -8
  105. package/packages/memory/storage.ts +56 -753
  106. package/packages/milestone/hooks.ts +1 -6
  107. package/packages/milestone/milestone.ts +2 -41
  108. package/packages/milestone/package.json +2 -2
  109. package/packages/notify/README.md +1 -0
  110. package/packages/notify/commands.ts +61 -3
  111. package/packages/notify/events.ts +0 -10
  112. package/packages/notify/package.json +2 -2
  113. package/packages/notify/settings.ts +0 -19
  114. package/packages/notify/tui/gotify-setup.ts +108 -143
  115. package/packages/notify/tui/ntfy-setup.ts +137 -172
  116. package/packages/notify/tui/recap-model-selector.ts +107 -101
  117. package/packages/notify/tui/settings-overlay.ts +94 -117
  118. package/packages/notify/tui/telegram-setup.ts +48 -79
  119. package/packages/notify/types.ts +0 -2
  120. package/packages/ralph/index.ts +11 -35
  121. package/packages/ralph/package.json +3 -3
  122. package/packages/ralph/ralph-loop.ts +3 -44
  123. package/packages/subagents/package.json +2 -1
  124. package/packages/subagents/src/agent-manager.ts +0 -51
  125. package/packages/subagents/src/agent-runner.ts +6 -80
  126. package/packages/subagents/src/conversation-viewer.ts +1 -19
  127. package/packages/subagents/src/core-compat.ts +8 -25
  128. package/packages/subagents/src/custom-agents.ts +0 -1
  129. package/packages/subagents/src/index.ts +3 -48
  130. package/packages/subagents/src/types.ts +0 -11
  131. package/packages/subagents/src/widget.ts +5 -5
  132. package/packages/unipi/bundled.js +4468 -7769
  133. package/packages/unipi/index.ts +6 -3
  134. package/packages/updater/package.json +2 -2
  135. package/packages/updater/src/changelog.ts +1 -16
  136. package/packages/updater/src/index.ts +0 -5
  137. package/packages/updater/src/installer.ts +4 -26
  138. package/packages/updater/src/markdown.ts +6 -152
  139. package/packages/updater/src/settings.ts +0 -15
  140. package/packages/updater/src/tui/changelog-overlay.ts +42 -234
  141. package/packages/updater/src/tui/list-detail-overlay.ts +260 -0
  142. package/packages/updater/src/tui/readme-overlay.ts +53 -210
  143. package/packages/updater/src/tui/settings-overlay.ts +13 -26
  144. package/packages/updater/src/version.ts +2 -31
  145. package/packages/utility/package.json +2 -4
  146. package/packages/utility/src/commands.ts +4 -5
  147. package/packages/utility/src/herdr-sync.ts +136 -0
  148. package/packages/utility/src/index.ts +11 -68
  149. package/packages/utility/src/lifecycle/cleanup.ts +2 -16
  150. package/packages/utility/src/{diff/settings.ts → settings.ts} +42 -80
  151. package/packages/utility/src/tools/env.ts +0 -0
  152. package/packages/utility/src/tui/name-badge-state.ts +18 -2
  153. package/packages/utility/src/tui/name-badge.ts +5 -4
  154. package/packages/utility/src/tui/util-settings-tui.ts +41 -224
  155. package/packages/web-api/package.json +2 -6
  156. package/packages/web-api/src/engine/dependencies.ts +13 -134
  157. package/packages/web-api/src/engine/extract.ts +9 -99
  158. package/packages/web-api/src/engine/format.ts +0 -75
  159. package/packages/web-api/src/engine/types.ts +0 -39
  160. package/packages/web-api/src/index.ts +1 -2
  161. package/packages/web-api/src/providers/base.ts +0 -10
  162. package/packages/web-api/src/providers/duckduckgo.ts +0 -1
  163. package/packages/web-api/src/providers/firecrawl.ts +0 -9
  164. package/packages/web-api/src/providers/jina-reader.ts +0 -9
  165. package/packages/web-api/src/providers/jina-search.ts +0 -9
  166. package/packages/web-api/src/providers/perplexity.ts +0 -9
  167. package/packages/web-api/src/providers/registry.ts +0 -80
  168. package/packages/web-api/src/providers/serpapi.ts +0 -9
  169. package/packages/web-api/src/providers/tavily.ts +0 -9
  170. package/packages/web-api/src/providers/wigolo-client.ts +0 -30
  171. package/packages/web-api/src/providers/wigolo.ts +0 -1
  172. package/packages/web-api/src/settings.ts +17 -77
  173. package/packages/web-api/src/tools.ts +21 -24
  174. package/packages/web-api/src/tui/settings-dialog.ts +0 -1
  175. package/packages/workflow/commands.ts +38 -122
  176. package/packages/workflow/index.ts +1 -5
  177. package/packages/workflow/package.json +2 -2
  178. package/packages/cocoindex/README.md +0 -94
  179. package/packages/cocoindex/bridge.ts +0 -842
  180. package/packages/cocoindex/commands.ts +0 -175
  181. package/packages/cocoindex/index.ts +0 -48
  182. package/packages/cocoindex/installer.ts +0 -397
  183. package/packages/cocoindex/package.json +0 -49
  184. package/packages/cocoindex/skills/cocoindex/SKILL.md +0 -88
  185. package/packages/cocoindex/tools.ts +0 -157
  186. package/packages/compactor/src/display/diff-renderer.ts +0 -281
  187. package/packages/compactor/src/display/line-width-safety.ts +0 -28
  188. package/packages/compactor/src/display/render-utils.ts +0 -52
  189. package/packages/compactor/src/display/thinking-label.ts +0 -18
  190. package/packages/compactor/src/display/tool-overrides.ts +0 -136
  191. package/packages/compactor/src/tools/compact.ts +0 -20
  192. package/packages/subagents/src/file-lock.ts +0 -102
  193. package/packages/utility/src/cache/ttl-cache.ts +0 -311
  194. package/packages/utility/src/diff/highlighter.ts +0 -352
  195. package/packages/utility/src/diff/parser.ts +0 -191
  196. package/packages/utility/src/diff/renderer.ts +0 -395
  197. package/packages/utility/src/diff/theme.ts +0 -316
  198. package/packages/utility/src/diff/wrapper.ts +0 -339
  199. package/packages/utility/src/display/capabilities.ts +0 -214
  200. package/packages/utility/src/display/width.ts +0 -226
  201. package/packages/utility/src/tools/batch.ts +0 -229
  202. package/packages/utility/src/tui/badge-settings-tui.ts +0 -388
  203. package/packages/utility/src/tui/badge-settings.ts +0 -67
  204. package/packages/utility/src/tui/settings-inspector.ts +0 -303
  205. package/packages/web-api/src/providers/llm-summarize.ts +0 -71
@@ -1,388 +0,0 @@
1
- /**
2
- * @pi-unipi/utility — Badge Settings TUI Overlay
3
- *
4
- * Interactive settings overlay for badge configuration.
5
- * Three settings: auto-generate toggle, badge-enabled toggle, generation model selector.
6
- * Model list loaded from shared model cache (~/.unipi/config/models-cache.json).
7
- */
8
-
9
- import type { Component } from "@earendil-works/pi-tui";
10
- import { truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
11
- import type { CachedModel } from "@pi-unipi/core";
12
- import { readModelCache, boxInnerWidth } from "@pi-unipi/core";
13
- import {
14
- readBadgeSettings,
15
- writeBadgeSettings,
16
- type BadgeSettings,
17
- } from "./badge-settings.js";
18
-
19
- /** ANSI escape codes */
20
- const ansi = {
21
- reset: "\x1b[0m",
22
- bold: "\x1b[1m",
23
- dim: "\x1b[2m",
24
- cyan: "\x1b[36m",
25
- green: "\x1b[32m",
26
- yellow: "\x1b[33m",
27
- red: "\x1b[31m",
28
- gray: "\x1b[90m",
29
- white: "\x1b[37m",
30
- };
31
-
32
- /** Toggle symbols */
33
- const TOGGLE_ON = `${ansi.green}●${ansi.reset}`;
34
- const TOGGLE_OFF = `${ansi.dim}○${ansi.reset}`;
35
-
36
- /** Active mode */
37
- type Mode = "settings" | "model-picker";
38
-
39
- /** Setting row types */
40
- interface BooleanSetting {
41
- type: "boolean";
42
- key: keyof BadgeSettings;
43
- label: string;
44
- description: string;
45
- getValue: (s: BadgeSettings) => boolean;
46
- }
47
-
48
- interface ModelSetting {
49
- type: "model";
50
- key: "generationModel";
51
- label: string;
52
- description: string;
53
- }
54
-
55
- type SettingItem = BooleanSetting | ModelSetting;
56
-
57
- /** Settings list */
58
- const SETTINGS: SettingItem[] = [
59
- {
60
- type: "boolean",
61
- key: "autoGen",
62
- label: "Auto generate",
63
- description: "Generate session name on first user message",
64
- getValue: (s) => s.autoGen,
65
- },
66
- {
67
- type: "boolean",
68
- key: "badgeEnabled",
69
- label: "Badge enabled",
70
- description: "Show the name badge overlay",
71
- getValue: (s) => s.badgeEnabled,
72
- },
73
- {
74
- type: "model",
75
- key: "generationModel",
76
- label: "Generation model",
77
- description: "Model to use for badge name generation",
78
- },
79
- ];
80
-
81
- /**
82
- * Badge Settings TUI overlay.
83
- * Implements the Component interface for use with ctx.ui.custom().
84
- */
85
- export class BadgeSettingsTui implements Component {
86
- private settings: BadgeSettings;
87
- private mode: Mode = "settings";
88
- private selectedIndex = 0;
89
- private modelScrollOffset = 0;
90
- private models: CachedModel[] = [];
91
-
92
- /** Theme reference for rendering (set externally) */
93
- private _theme: any = null;
94
-
95
- /** Callback when overlay should close */
96
- onClose?: () => void;
97
-
98
- /** Callback to request a re-render */
99
- requestRender?: () => void;
100
-
101
- constructor() {
102
- this.settings = readBadgeSettings();
103
- this.models = readModelCache();
104
- }
105
-
106
- /**
107
- * Set the pi-tui theme for styled rendering.
108
- */
109
- setTheme(theme: any): void {
110
- this._theme = theme;
111
- }
112
-
113
- /**
114
- * Invalidate cached render state.
115
- */
116
- invalidate(): void {
117
- // No cached state to invalidate
118
- }
119
-
120
- /**
121
- * Handle keyboard input.
122
- */
123
- handleInput(data: string): void {
124
- if (this.mode === "settings") {
125
- this.handleSettingsInput(data);
126
- } else {
127
- this.handleModelPickerInput(data);
128
- }
129
- }
130
-
131
- /**
132
- * Handle input in settings mode.
133
- */
134
- private handleSettingsInput(data: string): void {
135
- switch (data) {
136
- case "\x1b[A": // Up arrow
137
- case "k":
138
- this.selectedIndex =
139
- (this.selectedIndex - 1 + SETTINGS.length) % SETTINGS.length;
140
- break;
141
- case "\x1b[B": // Down arrow
142
- case "j":
143
- this.selectedIndex = (this.selectedIndex + 1) % SETTINGS.length;
144
- break;
145
- case " ": // Space — toggle boolean settings
146
- this.toggleCurrentSetting();
147
- break;
148
- case "\r": // Enter — open model picker or toggle
149
- if (SETTINGS[this.selectedIndex].type === "model") {
150
- this.enterModelPicker();
151
- } else {
152
- this.toggleCurrentSetting();
153
- }
154
- break;
155
- case "\x1b": // Escape — close and save
156
- this.save();
157
- this.onClose?.();
158
- break;
159
- }
160
- }
161
-
162
- /**
163
- * Handle input in model picker mode.
164
- */
165
- private handleModelPickerInput(data: string): void {
166
- const allModels = this.getModelList();
167
-
168
- switch (data) {
169
- case "\x1b[A": // Up arrow
170
- case "k":
171
- this.selectedIndex =
172
- (this.selectedIndex - 1 + allModels.length) % allModels.length;
173
- this.adjustModelScroll(allModels.length);
174
- break;
175
- case "\x1b[B": // Down arrow
176
- case "j":
177
- this.selectedIndex = (this.selectedIndex + 1) % allModels.length;
178
- this.adjustModelScroll(allModels.length);
179
- break;
180
- case "\r": // Enter — select model
181
- this.selectModel();
182
- break;
183
- case "\x1b": // Escape — cancel picker
184
- this.mode = "settings";
185
- this.selectedIndex = SETTINGS.findIndex(
186
- (s) => s.key === "generationModel",
187
- );
188
- break;
189
- }
190
- }
191
-
192
- /**
193
- * Toggle the currently selected boolean setting.
194
- */
195
- private toggleCurrentSetting(): void {
196
- const item = SETTINGS[this.selectedIndex];
197
- if (item.type !== "boolean") return;
198
-
199
- const current = item.getValue(this.settings);
200
- (this.settings as any)[item.key] = !current;
201
- this.save();
202
- }
203
-
204
- /**
205
- * Enter model picker mode.
206
- */
207
- private enterModelPicker(): void {
208
- this.mode = "model-picker";
209
- const allModels = this.getModelList();
210
- const currentModel = this.settings.generationModel;
211
- this.selectedIndex = allModels.findIndex((m) => m.id === currentModel);
212
- if (this.selectedIndex < 0) this.selectedIndex = 0;
213
- this.modelScrollOffset = 0;
214
- this.adjustModelScroll(allModels.length);
215
- }
216
-
217
- /**
218
- * Select the current model in the picker.
219
- */
220
- private selectModel(): void {
221
- const allModels = this.getModelList();
222
- const selected = allModels[this.selectedIndex];
223
- if (selected) {
224
- this.settings.generationModel = selected.id;
225
- this.save();
226
- }
227
- this.mode = "settings";
228
- this.selectedIndex = SETTINGS.findIndex((s) => s.key === "generationModel");
229
- }
230
-
231
- /**
232
- * Get model list with "inherit" as first entry.
233
- */
234
- private getModelList(): Array<{ id: string; label: string }> {
235
- const list: Array<{ id: string; label: string }> = [
236
- { id: "inherit", label: "inherit (use parent model)" },
237
- ];
238
- for (const m of this.models) {
239
- const fullId = `${m.provider}/${m.id}`;
240
- list.push({
241
- id: fullId,
242
- label: m.name ? `${fullId} (${m.name})` : fullId,
243
- });
244
- }
245
- return list;
246
- }
247
-
248
- /**
249
- * Adjust scroll offset so the selected item is visible.
250
- */
251
- private adjustModelScroll(totalItems: number): void {
252
- // Reserve ~10 lines for visible model list
253
- const visibleLines = 10;
254
- if (this.selectedIndex < this.modelScrollOffset) {
255
- this.modelScrollOffset = this.selectedIndex;
256
- } else if (this.selectedIndex >= this.modelScrollOffset + visibleLines) {
257
- this.modelScrollOffset = this.selectedIndex - visibleLines + 1;
258
- }
259
- // Clamp
260
- this.modelScrollOffset = Math.max(
261
- 0,
262
- Math.min(this.modelScrollOffset, totalItems - visibleLines),
263
- );
264
- }
265
-
266
- /**
267
- * Save settings to disk.
268
- */
269
- private save(): void {
270
- writeBadgeSettings(this.settings);
271
- }
272
-
273
- /**
274
- * Render the overlay.
275
- */
276
- render(width: number): string[] {
277
- const lines: string[] = [];
278
- const innerWidth = boxInnerWidth(width);
279
-
280
- const padVisible = (content: string, targetWidth: number): string => {
281
- const vw = visibleWidth(content);
282
- const pad = Math.max(0, targetWidth - vw);
283
- return content + " ".repeat(pad);
284
- };
285
-
286
- const add = (s: string) =>
287
- lines.push(
288
- `${ansi.cyan}│${ansi.reset}` +
289
- padVisible(truncateToWidth(s, innerWidth), innerWidth) +
290
- `${ansi.cyan}│${ansi.reset}`,
291
- );
292
-
293
- const addEmpty = () =>
294
- lines.push(
295
- `${ansi.cyan}│${ansi.reset}` +
296
- " ".repeat(innerWidth) +
297
- `${ansi.cyan}│${ansi.reset}`,
298
- );
299
-
300
- // Top border
301
- lines.push(`${ansi.cyan}╭${"─".repeat(innerWidth)}╮${ansi.reset}`);
302
-
303
- // Header
304
- add(`${ansi.bold}${ansi.cyan}Badge Settings${ansi.reset}`);
305
- add(`${ansi.dim}Configure badge generation behavior${ansi.reset}`);
306
- addEmpty();
307
-
308
- // Settings list
309
- for (let i = 0; i < SETTINGS.length; i++) {
310
- const item = SETTINGS[i];
311
- const isSelected = i === this.selectedIndex && this.mode === "settings";
312
- const selector = isSelected ? `${ansi.cyan}▸${ansi.reset}` : " ";
313
-
314
- if (item.type === "boolean") {
315
- const value = item.getValue(this.settings);
316
- const toggle = value ? TOGGLE_ON : TOGGLE_OFF;
317
- const labelColor = isSelected ? ansi.bold : ansi.dim;
318
-
319
- add(
320
- `${selector} ${toggle} ${labelColor}${item.label}${ansi.reset}`,
321
- );
322
- add(` ${ansi.gray}${item.description}${ansi.reset}`);
323
- } else if (item.type === "model") {
324
- const labelColor = isSelected ? ansi.bold : ansi.dim;
325
- const modelDisplay = this.settings.generationModel;
326
-
327
- add(
328
- `${selector} ${ansi.yellow}⚙${ansi.reset} ${labelColor}${item.label}${ansi.reset}: ${ansi.white}${modelDisplay}${ansi.reset}`,
329
- );
330
- add(` ${ansi.gray}${item.description}${ansi.reset}`);
331
- add(` ${ansi.dim}Enter to select model${ansi.reset}`);
332
- }
333
- }
334
-
335
- // Model picker (inline)
336
- if (this.mode === "model-picker") {
337
- addEmpty();
338
- add(`${ansi.bold}${ansi.cyan}── Available Models ──${ansi.reset}`);
339
-
340
- const allModels = this.getModelList();
341
- const visibleLines = 10;
342
- const start = this.modelScrollOffset;
343
- const end = Math.min(start + visibleLines, allModels.length);
344
-
345
- // Scroll indicator up
346
- if (start > 0) {
347
- add(` ${ansi.dim}▲ ${start} more above${ansi.reset}`);
348
- }
349
-
350
- for (let i = start; i < end; i++) {
351
- const m = allModels[i];
352
- const isSelected = i === this.selectedIndex;
353
- const selector = isSelected ? `${ansi.cyan}▸${ansi.reset}` : " ";
354
- const labelColor = isSelected ? ansi.bold + ansi.white : ansi.dim;
355
-
356
- add(
357
- `${selector} ${labelColor}${m.label}${ansi.reset}`,
358
- );
359
- }
360
-
361
- // Scroll indicator down
362
- if (end < allModels.length) {
363
- add(
364
- ` ${ansi.dim}▼ ${allModels.length - end} more below${ansi.reset}`,
365
- );
366
- }
367
- }
368
-
369
- // Footer
370
- addEmpty();
371
-
372
- if (this.mode === "model-picker") {
373
- add(
374
- `${ansi.dim}↑↓ navigate • Enter select • Esc cancel${ansi.reset}`,
375
- );
376
- } else {
377
- add(
378
- `${ansi.dim}↑↓ navigate • Space toggle • Enter select model • Esc close${ansi.reset}`,
379
- );
380
- add(`${ansi.dim}Config: .unipi/config/badge.json${ansi.reset}`);
381
- }
382
-
383
- // Bottom border
384
- lines.push(`${ansi.cyan}╰${"─".repeat(innerWidth)}╯${ansi.reset}`);
385
-
386
- return lines;
387
- }
388
- }
@@ -1,67 +0,0 @@
1
- /**
2
- * @pi-unipi/utility — Badge Settings Manager
3
- *
4
- * Thin wrappers over the unified settings manager (util-settings.json).
5
- * Existing callers continue to work unchanged.
6
- */
7
-
8
- import {
9
- readUtilSettings,
10
- writeUtilSettings,
11
- type BadgeSettingsSection,
12
- } from "../diff/settings.js";
13
-
14
- /** Badge settings interface (re-exports BadgeSettingsSection for backward compat) */
15
- export type BadgeSettings = BadgeSettingsSection;
16
-
17
- /** Default badge settings for formatBadgeSettings display */
18
- const BADGE_CONFIG_FILE = ".unipi/config/util-settings.json";
19
-
20
- /**
21
- * Read badge settings from unified config.
22
- * Returns defaults if file doesn't exist or is malformed.
23
- */
24
- export function readBadgeSettings(): BadgeSettings {
25
- return readUtilSettings().badge;
26
- }
27
-
28
- /**
29
- * Write badge settings to unified config.
30
- */
31
- export function writeBadgeSettings(settings: BadgeSettings): void {
32
- const util = readUtilSettings();
33
- util.badge = settings;
34
- writeUtilSettings(util);
35
- }
36
-
37
- /**
38
- * Update a single badge setting.
39
- */
40
- export function updateBadgeSetting<K extends keyof BadgeSettings>(
41
- key: K,
42
- value: BadgeSettings[K],
43
- ): BadgeSettings {
44
- const settings = readBadgeSettings();
45
- settings[key] = value;
46
- writeBadgeSettings(settings);
47
- return settings;
48
- }
49
-
50
- /**
51
- * Format badge settings for display.
52
- */
53
- export function formatBadgeSettings(settings: BadgeSettings): string {
54
- const toggle = (v: boolean) => (v ? "✓ enabled" : "✗ disabled");
55
- return [
56
- "## Badge Settings",
57
- "",
58
- `| Setting | Status | Description |`,
59
- `|---------|--------|-------------|`,
60
- `| Auto Generate | ${toggle(settings.autoGen)} | Generate name on first message |`,
61
- `| Badge Enabled | ${toggle(settings.badgeEnabled)} | Show badge overlay |`,
62
- `| Agent Tool | ${toggle(settings.agentTool)} | Allow agents to call set_session_name |`,
63
- `| Generation Model | ${settings.generationModel} | Model for badge name generation |`,
64
- "",
65
- `Config: \`${BADGE_CONFIG_FILE}\``,
66
- ].join("\n");
67
- }