my-pi 0.1.21 → 0.1.22

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.
@@ -2,12 +2,8 @@ import type {
2
2
  ExtensionAPI,
3
3
  ExtensionCommandContext,
4
4
  } from '@mariozechner/pi-coding-agent';
5
- import {
6
- Container,
7
- SettingsList,
8
- Text,
9
- type SettingItem,
10
- } from '@mariozechner/pi-tui';
5
+ import { type SettingItem } from '@mariozechner/pi-tui';
6
+ import { show_settings_modal } from '@spences10/pi-tui-modal';
11
7
  import {
12
8
  BUILTIN_EXTENSIONS,
13
9
  find_builtin_extension,
@@ -18,8 +14,8 @@ import {
18
14
  type BuiltinExtensionState,
19
15
  } from './config.js';
20
16
 
21
- const ENABLED = '[x]';
22
- const DISABLED = '[ ]';
17
+ const ENABLED = '● enabled';
18
+ const DISABLED = ' disabled';
23
19
 
24
20
  export interface ExtensionsManagerOptions {
25
21
  force_disabled?: Iterable<BuiltinExtensionKey>;
@@ -152,85 +148,32 @@ export function create_extensions_extension(
152
148
  );
153
149
  const current_enabled = new Set(initial_enabled);
154
150
 
155
- await ctx.ui.custom((tui, theme, _kb, done) => {
156
- const items = states.map(to_setting_item);
157
- const container = new Container();
158
-
159
- container.addChild({
160
- render: () => {
161
- const saved_enabled = current_enabled.size;
162
- const saved_disabled = states.length - saved_enabled;
163
- const enabled_now = [...current_enabled].filter(
164
- (key) => !force_disabled.has(key as BuiltinExtensionKey),
165
- ).length;
166
- const disabled_now = states.length - enabled_now;
167
- return [
168
- theme.fg('accent', theme.bold('Built-in extensions')),
169
- theme.fg(
170
- 'muted',
171
- `${saved_enabled} saved enabled ${saved_disabled} saved disabled • ${enabled_now} enabled now • ${disabled_now} disabled now`,
172
- ),
173
- '',
174
- ];
175
- },
176
- invalidate: () => {},
177
- });
178
-
179
- const settings_list = new SettingsList(
180
- items,
181
- Math.min(Math.max(items.length + 4, 8), 16),
182
- {
183
- cursor: theme.fg('accent', '›'),
184
- label: (text, selected) =>
185
- selected ? theme.fg('accent', text) : text,
186
- value: (text, selected) => {
187
- const color = text === ENABLED ? 'success' : 'dim';
188
- const rendered = theme.fg(color, text);
189
- return selected
190
- ? theme.bold(theme.fg('accent', rendered))
191
- : rendered;
192
- },
193
- description: (text) => theme.fg('muted', text),
194
- hint: (text) => theme.fg('dim', text),
195
- },
196
- (id, new_value) => {
197
- const key = id as BuiltinExtensionKey;
198
- const enabled = new_value === ENABLED;
199
- if (enabled) {
200
- current_enabled.add(key);
201
- } else {
202
- current_enabled.delete(key);
203
- }
204
- save_extension_enabled(key, enabled);
205
- },
206
- () => done(undefined),
207
- { enableSearch: true },
208
- );
209
-
210
- container.addChild(settings_list);
211
- container.addChild(
212
- new Text(
213
- theme.fg(
214
- 'dim',
215
- 'esc close • search filters • changes save immediately • CLI --no-* flags still win in this process',
216
- ),
217
- 0,
218
- 1,
219
- ),
220
- );
221
-
222
- return {
223
- render(width: number) {
224
- return container.render(width);
225
- },
226
- invalidate() {
227
- container.invalidate();
228
- },
229
- handleInput(data: string) {
230
- settings_list.handleInput(data);
231
- tui.requestRender();
232
- },
233
- };
151
+ const items = states.map(to_setting_item);
152
+ await show_settings_modal(ctx, {
153
+ title: 'Built-in extensions',
154
+ subtitle: () => {
155
+ const saved_enabled = current_enabled.size;
156
+ const saved_disabled = states.length - saved_enabled;
157
+ const enabled_now = [...current_enabled].filter(
158
+ (key) => !force_disabled.has(key as BuiltinExtensionKey),
159
+ ).length;
160
+ const disabled_now = states.length - enabled_now;
161
+ return `${saved_enabled} saved enabled • ${saved_disabled} saved disabled • ${enabled_now} enabled now • ${disabled_now} disabled now`;
162
+ },
163
+ items,
164
+ enable_search: true,
165
+ footer:
166
+ 'esc close • search filters • changes save immediately • CLI --no-* flags still win in this process',
167
+ on_change: (id, new_value) => {
168
+ const key = id as BuiltinExtensionKey;
169
+ const enabled = new_value === ENABLED;
170
+ if (enabled) {
171
+ current_enabled.add(key);
172
+ } else {
173
+ current_enabled.delete(key);
174
+ }
175
+ save_extension_enabled(key, enabled);
176
+ },
234
177
  });
235
178
 
236
179
  if (!sets_equal(initial_enabled, current_enabled)) {
@@ -6,13 +6,11 @@ import {
6
6
  type ReadonlyFooterDataProvider,
7
7
  } from '@mariozechner/pi-coding-agent';
8
8
  import {
9
- Container,
10
- SettingsList,
11
- Text,
12
9
  truncateToWidth,
13
10
  visibleWidth,
14
11
  type SettingItem,
15
12
  } from '@mariozechner/pi-tui';
13
+ import { show_settings_modal } from '@spences10/pi-tui-modal';
16
14
  import {
17
15
  existsSync,
18
16
  mkdirSync,
@@ -55,10 +53,10 @@ interface PersistedPromptPresetStates {
55
53
 
56
54
  const PRESET_STATE_TYPE = 'prompt-preset-state';
57
55
  export const DEFAULT_BASE_PROMPT_PRESET_NAME = 'terse';
58
- const ENABLED = '[x]';
59
- const DISABLED = '[ ]';
60
- const SELECTED = '(x)';
61
- const UNSELECTED = '( )';
56
+ const ENABLED = '● enabled';
57
+ const DISABLED = ' disabled';
58
+ const SELECTED = '● selected';
59
+ const UNSELECTED = '';
62
60
  const NONE_BASE_ID = '__base_none__';
63
61
 
64
62
  export const DEFAULT_PROMPT_PRESETS: PromptPresetMap = {
@@ -1404,99 +1402,34 @@ export default async function prompt_presets(pi: ExtensionAPI) {
1404
1402
 
1405
1403
  sync_values();
1406
1404
 
1407
- await ctx.ui.custom((tui, theme, _kb, done) => {
1408
- const list = new SettingsList(
1409
- items,
1410
- Math.min(Math.max(items.length + 4, 8), 24),
1411
- {
1412
- cursor: theme.fg('accent', '›'),
1413
- label: (text, selected) => {
1414
- if (text.startsWith('──') && text.endsWith('──')) {
1415
- return theme.fg('dim', theme.bold(text));
1416
- }
1417
- return selected ? theme.fg('accent', text) : text;
1418
- },
1419
- value: (text, selected) => {
1420
- const color =
1421
- text === ENABLED || text === SELECTED
1422
- ? ('success' as const)
1423
- : ('dim' as const);
1424
- const rendered = theme.fg(color, text);
1425
- return selected
1426
- ? theme.bold(theme.fg('accent', rendered))
1427
- : rendered;
1428
- },
1429
- description: (text) => theme.fg('muted', text),
1430
- hint: (text) => theme.fg('dim', text),
1431
- },
1432
- (id, new_value) => {
1433
- if (id.startsWith('__header_')) return;
1434
-
1435
- if (base_ids.has(id)) {
1436
- selected_base =
1437
- new_value === SELECTED && id !== NONE_BASE_ID
1438
- ? id
1439
- : undefined;
1440
- sync_values();
1441
- return;
1442
- }
1405
+ await show_settings_modal(ctx, {
1406
+ title: 'Prompt presets',
1407
+ subtitle: () =>
1408
+ `base: ${selected_base ?? '(none)'} ${enabled_layers.size} layer(s) enabled`,
1409
+ items,
1410
+ max_visible: Math.min(Math.max(items.length + 4, 8), 24),
1411
+ enable_search: true,
1412
+ on_change: (id, new_value) => {
1413
+ if (id.startsWith('__header_')) return;
1414
+
1415
+ if (base_ids.has(id)) {
1416
+ selected_base =
1417
+ new_value === SELECTED && id !== NONE_BASE_ID
1418
+ ? id
1419
+ : undefined;
1420
+ sync_values();
1421
+ return;
1422
+ }
1443
1423
 
1444
- if (layer_ids.has(id)) {
1445
- if (new_value === ENABLED) {
1446
- enabled_layers.add(id);
1447
- } else {
1448
- enabled_layers.delete(id);
1449
- }
1450
- sync_values();
1424
+ if (layer_ids.has(id)) {
1425
+ if (new_value === ENABLED) {
1426
+ enabled_layers.add(id);
1427
+ } else {
1428
+ enabled_layers.delete(id);
1451
1429
  }
1452
- },
1453
- () => done(undefined),
1454
- { enableSearch: true },
1455
- );
1456
-
1457
- const container = new Container();
1458
- container.addChild({
1459
- render: () => [
1460
- theme.fg('accent', theme.bold('Prompt presets')),
1461
- theme.fg(
1462
- 'muted',
1463
- `base: ${selected_base ?? '(none)'} • ${enabled_layers.size} layer(s) enabled`,
1464
- ),
1465
- '',
1466
- ],
1467
- invalidate: () => {},
1468
- });
1469
- container.addChild({
1470
- render(width: number) {
1471
- return list.render(width);
1472
- },
1473
- invalidate() {
1474
- list.invalidate();
1475
- },
1476
- });
1477
- container.addChild(
1478
- new Text(
1479
- theme.fg(
1480
- 'dim',
1481
- 'search filters • enter toggles • esc close',
1482
- ),
1483
- 0,
1484
- 1,
1485
- ),
1486
- );
1487
-
1488
- return {
1489
- render(width: number) {
1490
- return container.render(width);
1491
- },
1492
- invalidate() {
1493
- container.invalidate();
1494
- },
1495
- handleInput(data: string) {
1496
- list.handleInput(data);
1497
- tui.requestRender();
1498
- },
1499
- };
1430
+ sync_values();
1431
+ }
1432
+ },
1500
1433
  });
1501
1434
 
1502
1435
  if (