my-pi 0.1.119 → 0.1.121

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.
package/dist/api.d.ts CHANGED
@@ -1,11 +1,15 @@
1
1
  import { AgentSessionRuntime, CreateAgentSessionFromServicesOptions, ExtensionAPI, ExtensionFactory, ExtensionFactory as ExtensionFactory$1, InlineExtension, InlineExtension as InlineExtension$1, InteractiveMode, InteractiveModeOptions, PrintModeOptions, runPrintMode, runRpcMode } from "@earendil-works/pi-coding-agent";
2
2
  import { Api, Model } from "@earendil-works/pi-ai";
3
+ import "@spences10/pi-footer";
3
4
  //#region src/extensions/startup-screen/index.d.ts
4
5
  declare function startup_screen_extension(pi: ExtensionAPI): void;
5
6
  //#endregion
6
7
  //#region src/extensions/prompt-presets/index.d.ts
7
8
  declare function prompt_presets(pi: ExtensionAPI): Promise<void>;
8
9
  //#endregion
10
+ //#region src/extensions/turn-timer/index.d.ts
11
+ declare function turn_timer(pi: ExtensionAPI): void;
12
+ //#endregion
9
13
  //#region src/extensions/session-name/index.d.ts
10
14
  declare function session_name(pi: ExtensionAPI): Promise<void>;
11
15
  //#endregion
@@ -14,363 +18,379 @@ declare function handoff(pi: ExtensionAPI): void;
14
18
  //#endregion
15
19
  //#region src/extensions/builtin-registry.d.ts
16
20
  declare const BUILTIN_EXTENSION_REGISTRY: readonly [{
17
- readonly key: "context-sidecar";
18
- readonly label: "Context sidecar";
19
- readonly docs_label: "SQLite context sidecar";
20
- readonly description: "Local SQLite FTS sidecar for oversized tool output";
21
+ readonly key: 'context-sidecar';
22
+ readonly label: 'Context sidecar';
23
+ readonly docs_label: 'SQLite context sidecar';
24
+ readonly description: 'Local SQLite FTS sidecar for oversized tool output';
21
25
  readonly default_enabled: true;
22
- readonly option_name: "context_sidecar";
23
- readonly cli_arg: "no-context-sidecar";
24
- readonly cli_flag: "--no-context-sidecar";
25
- readonly cli_description: "Disable SQLite context sidecar for large tool output";
26
+ readonly option_name: 'context_sidecar';
27
+ readonly cli_arg: 'no-context-sidecar';
28
+ readonly cli_flag: '--no-context-sidecar';
29
+ readonly cli_description: 'Disable SQLite context sidecar for large tool output';
26
30
  readonly aliases: readonly ["context-sidecar", "context", "sidecar"];
27
- readonly external_package_name: "@spences10/pi-context";
31
+ readonly external_package_name: '@spences10/pi-context';
28
32
  readonly load: () => Promise<typeof import("@spences10/pi-context").default>;
29
33
  }, {
30
- readonly key: "mcp";
31
- readonly label: "MCP";
32
- readonly docs_label: "MCP";
33
- readonly description: "MCP server integration and /mcp command";
34
+ readonly key: 'mcp';
35
+ readonly label: 'MCP';
36
+ readonly docs_label: 'MCP';
37
+ readonly description: 'MCP server integration and /mcp command';
34
38
  readonly default_enabled: true;
35
- readonly option_name: "mcp";
36
- readonly cli_arg: "no-mcp";
37
- readonly cli_flag: "--no-mcp";
38
- readonly cli_description: "Disable built-in MCP extension";
39
+ readonly option_name: 'mcp';
40
+ readonly cli_arg: 'no-mcp';
41
+ readonly cli_flag: '--no-mcp';
42
+ readonly cli_description: 'Disable built-in MCP extension';
39
43
  readonly aliases: readonly ["mcp"];
40
- readonly external_package_name: "@spences10/pi-mcp";
44
+ readonly external_package_name: '@spences10/pi-mcp';
41
45
  readonly load: () => Promise<typeof import("@spences10/pi-mcp").default>;
42
46
  }, {
43
- readonly key: "openrouter-fusion-config";
44
- readonly label: "OpenRouter Fusion config";
45
- readonly docs_label: "OpenRouter Fusion config guard";
46
- readonly description: "Keeps OpenRouter Fusion off Anthropic by injecting a non-Anthropic panel and judge";
47
+ readonly key: 'openrouter-fusion-config';
48
+ readonly label: 'OpenRouter Fusion config';
49
+ readonly docs_label: 'OpenRouter Fusion config guard';
50
+ readonly description: 'Keeps OpenRouter Fusion off Anthropic by injecting a non-Anthropic panel and judge';
47
51
  readonly default_enabled: true;
48
- readonly option_name: "openrouter_fusion_config";
49
- readonly cli_arg: "no-openrouter-fusion-config";
50
- readonly cli_flag: "--no-openrouter-fusion-config";
51
- readonly cli_description: "Disable OpenRouter Fusion non-Anthropic config";
52
+ readonly option_name: 'openrouter_fusion_config';
53
+ readonly cli_arg: 'no-openrouter-fusion-config';
54
+ readonly cli_flag: '--no-openrouter-fusion-config';
55
+ readonly cli_description: 'Disable OpenRouter Fusion non-Anthropic config';
52
56
  readonly aliases: readonly ["openrouter-fusion-config", "fusion-budget"];
53
57
  readonly load: () => Promise<ExtensionFactory$1>;
54
58
  }, {
55
- readonly key: "umans-provider";
56
- readonly label: "Umans provider";
57
- readonly docs_label: "Umans provider";
58
- readonly description: "Umans.ai Anthropic Messages provider with API key login support";
59
+ readonly key: 'umans-provider';
60
+ readonly label: 'Umans provider';
61
+ readonly docs_label: 'Umans provider';
62
+ readonly description: 'Umans.ai Anthropic Messages provider with API key login support';
59
63
  readonly default_enabled: true;
60
- readonly option_name: "umans_provider";
61
- readonly cli_arg: "no-umans-provider";
62
- readonly cli_flag: "--no-umans-provider";
63
- readonly cli_description: "Disable built-in Umans provider";
64
+ readonly option_name: 'umans_provider';
65
+ readonly cli_arg: 'no-umans-provider';
66
+ readonly cli_flag: '--no-umans-provider';
67
+ readonly cli_description: 'Disable built-in Umans provider';
64
68
  readonly aliases: readonly ["umans-provider", "umans"];
65
69
  readonly load: () => Promise<ExtensionFactory$1>;
66
70
  }, {
67
- readonly key: "footer";
68
- readonly label: "Footer";
69
- readonly docs_label: "Footer";
70
- readonly description: "Configurable interactive footer/statusline";
71
+ readonly key: 'footer';
72
+ readonly label: 'Footer';
73
+ readonly docs_label: 'Footer';
74
+ readonly description: 'Configurable interactive footer/statusline';
71
75
  readonly default_enabled: true;
72
- readonly option_name: "footer";
73
- readonly cli_arg: "no-footer";
74
- readonly cli_flag: "--no-footer";
75
- readonly cli_description: "Disable custom footer/statusline";
76
+ readonly option_name: 'footer';
77
+ readonly cli_arg: 'no-footer';
78
+ readonly cli_flag: '--no-footer';
79
+ readonly cli_description: 'Disable custom footer/statusline';
76
80
  readonly aliases: readonly ["footer", "statusline", "status-line"];
77
81
  readonly mode_constraints: {
78
82
  readonly disabled_in: readonly ["print", "json", "rpc"];
79
- readonly reason: "Footer only renders in the interactive TUI";
83
+ readonly reason: 'Footer only renders in the interactive TUI';
80
84
  };
81
85
  readonly load: () => Promise<typeof import("@spences10/pi-footer").default>;
82
86
  }, {
83
- readonly key: "codex-usage";
84
- readonly label: "Codex usage";
85
- readonly docs_label: "Codex usage status";
86
- readonly description: "OpenAI Codex usage status for the footer";
87
+ readonly key: 'codex-usage';
88
+ readonly label: 'Codex usage';
89
+ readonly docs_label: 'Codex usage status';
90
+ readonly description: 'OpenAI Codex usage status for the footer';
87
91
  readonly default_enabled: true;
88
- readonly option_name: "codex_usage";
89
- readonly cli_arg: "no-codex-usage";
90
- readonly cli_flag: "--no-codex-usage";
91
- readonly cli_description: "Disable Codex usage footer status";
92
+ readonly option_name: 'codex_usage';
93
+ readonly cli_arg: 'no-codex-usage';
94
+ readonly cli_flag: '--no-codex-usage';
95
+ readonly cli_description: 'Disable Codex usage footer status';
92
96
  readonly aliases: readonly ["codex-usage", "codex-status"];
93
- readonly external_package_name: "@spences10/pi-codex-usage";
97
+ readonly external_package_name: '@spences10/pi-codex-usage';
94
98
  readonly load: () => Promise<typeof import("@spences10/pi-codex-usage").default>;
95
99
  }, {
96
- readonly key: "harness";
97
- readonly label: "Harness";
98
- readonly docs_label: "Task harness runtime";
99
- readonly description: "Ephemeral /tmp task harness runtime with tools, enforcement, and bundled skills";
100
+ readonly key: 'harness';
101
+ readonly label: 'Harness';
102
+ readonly docs_label: 'Task harness runtime';
103
+ readonly description: 'Ephemeral /tmp task harness runtime with tools, enforcement, and bundled skills';
100
104
  readonly default_enabled: true;
101
- readonly option_name: "harness";
102
- readonly cli_arg: "no-harness";
103
- readonly cli_flag: "--no-harness";
104
- readonly cli_description: "Disable task harness runtime";
105
+ readonly option_name: 'harness';
106
+ readonly cli_arg: 'no-harness';
107
+ readonly cli_flag: '--no-harness';
108
+ readonly cli_description: 'Disable task harness runtime';
105
109
  readonly aliases: readonly ["harness", "task-harness"];
106
- readonly external_package_name: "@spences10/pi-harness";
110
+ readonly external_package_name: '@spences10/pi-harness';
107
111
  readonly load: () => Promise<typeof import("@spences10/pi-harness").default>;
108
112
  }, {
109
- readonly key: "factory";
110
- readonly label: "Software factory (experimental)";
111
- readonly docs_label: "Experimental software-factory control plane";
112
- readonly description: "Paused experimental workflow control plane; enable explicitly for Factory v1 evaluation only";
113
+ readonly key: 'factory';
114
+ readonly label: 'Software factory (experimental)';
115
+ readonly docs_label: 'Experimental software-factory control plane';
116
+ readonly description: 'Paused experimental workflow control plane; enable explicitly for Factory v1 evaluation only';
113
117
  readonly default_enabled: false;
114
- readonly option_name: "factory";
115
- readonly cli_arg: "no-factory";
116
- readonly cli_flag: "--no-factory";
117
- readonly cli_description: "Disable software-factory control plane";
118
+ readonly option_name: 'factory';
119
+ readonly cli_arg: 'no-factory';
120
+ readonly cli_flag: '--no-factory';
121
+ readonly cli_description: 'Disable software-factory control plane';
118
122
  readonly aliases: readonly ["factory", "software-factory", "control-plane"];
119
- readonly external_package_name: "@spences10/pi-factory";
123
+ readonly external_package_name: '@spences10/pi-factory';
120
124
  readonly load: () => Promise<typeof import("@spences10/pi-factory").default>;
121
125
  }, {
122
- readonly key: "skills";
123
- readonly label: "Skills";
124
- readonly docs_label: "Skills";
125
- readonly description: "Managed pi-native skills and /skills command";
126
+ readonly key: 'skills';
127
+ readonly label: 'Skills';
128
+ readonly docs_label: 'Skills';
129
+ readonly description: 'Managed pi-native skills and /skills command';
126
130
  readonly default_enabled: true;
127
- readonly option_name: "skills";
128
- readonly cli_arg: "no-skills";
129
- readonly cli_flag: "--no-skills";
130
- readonly cli_description: "Disable built-in skills extension";
131
+ readonly option_name: 'skills';
132
+ readonly cli_arg: 'no-skills';
133
+ readonly cli_flag: '--no-skills';
134
+ readonly cli_description: 'Disable built-in skills extension';
131
135
  readonly aliases: readonly ["skills", "skill"];
132
- readonly external_package_name: "@spences10/pi-skills";
136
+ readonly external_package_name: '@spences10/pi-skills';
133
137
  readonly load: () => Promise<typeof import("@spences10/pi-skills").default>;
134
138
  }, {
135
- readonly key: "skill-importer";
136
- readonly label: "Skill importer";
137
- readonly docs_label: "Skill importer";
138
- readonly description: "Import external Claude/plugin skills into Pi-native storage";
139
+ readonly key: 'skill-importer';
140
+ readonly label: 'Skill importer';
141
+ readonly docs_label: 'Skill importer';
142
+ readonly description: 'Import external Claude/plugin skills into Pi-native storage';
139
143
  readonly default_enabled: true;
140
- readonly option_name: "skill_importer";
141
- readonly cli_arg: "no-skill-importer";
142
- readonly cli_flag: "--no-skill-importer";
143
- readonly cli_description: "Disable external skill importer extension";
144
+ readonly option_name: 'skill_importer';
145
+ readonly cli_arg: 'no-skill-importer';
146
+ readonly cli_flag: '--no-skill-importer';
147
+ readonly cli_description: 'Disable external skill importer extension';
144
148
  readonly aliases: readonly ["skill-importer", "import-skills", "skill-import"];
145
- readonly external_package_name: "@spences10/pi-skill-importer";
149
+ readonly external_package_name: '@spences10/pi-skill-importer';
146
150
  readonly load: () => Promise<typeof import("@spences10/pi-skill-importer").default>;
147
151
  }, {
148
- readonly key: "filter-output";
149
- readonly label: "Secret redaction";
150
- readonly docs_label: "Secret redaction";
151
- readonly description: "Redacts secrets from tool output before the model sees them";
152
+ readonly key: 'filter-output';
153
+ readonly label: 'Secret redaction';
154
+ readonly docs_label: 'Secret redaction';
155
+ readonly description: 'Redacts secrets from tool output before the model sees them';
152
156
  readonly default_enabled: true;
153
- readonly option_name: "filter_output";
154
- readonly cli_arg: "no-filter";
155
- readonly cli_flag: "--no-filter";
156
- readonly cli_description: "Disable secret redaction in tool output";
157
+ readonly option_name: 'filter_output';
158
+ readonly cli_arg: 'no-filter';
159
+ readonly cli_flag: '--no-filter';
160
+ readonly cli_description: 'Disable secret redaction in tool output';
157
161
  readonly aliases: readonly ["filter-output", "filter_output", "filter", "redaction", "secret-redaction", "output-redaction"];
158
- readonly external_package_name: "@spences10/pi-redact";
162
+ readonly external_package_name: '@spences10/pi-redact';
159
163
  readonly load: () => Promise<typeof import("@spences10/pi-redact").default>;
160
164
  }, {
161
- readonly key: "recall";
162
- readonly label: "Recall";
163
- readonly docs_label: "Recall";
164
- readonly description: "pirecall reminder and background session sync";
165
+ readonly key: 'recall';
166
+ readonly label: 'Recall';
167
+ readonly docs_label: 'Recall';
168
+ readonly description: 'pirecall reminder and background session sync';
165
169
  readonly default_enabled: true;
166
- readonly option_name: "recall";
167
- readonly cli_arg: "no-recall";
168
- readonly cli_flag: "--no-recall";
169
- readonly cli_description: "Disable recall extension";
170
+ readonly option_name: 'recall';
171
+ readonly cli_arg: 'no-recall';
172
+ readonly cli_flag: '--no-recall';
173
+ readonly cli_description: 'Disable recall extension';
170
174
  readonly aliases: readonly ["recall", "pirecall"];
171
- readonly external_package_name: "@spences10/pi-recall";
175
+ readonly external_package_name: '@spences10/pi-recall';
172
176
  readonly load: () => Promise<typeof import("@spences10/pi-recall").default>;
173
177
  }, {
174
- readonly key: "nopeek";
175
- readonly label: "Nopeek";
176
- readonly docs_label: "Nopeek";
177
- readonly description: "nopeek reminder for secret-safe environment loading";
178
+ readonly key: 'nopeek';
179
+ readonly label: 'Nopeek';
180
+ readonly docs_label: 'Nopeek';
181
+ readonly description: 'nopeek reminder for secret-safe environment loading';
178
182
  readonly default_enabled: true;
179
- readonly option_name: "nopeek";
180
- readonly cli_arg: "no-nopeek";
181
- readonly cli_flag: "--no-nopeek";
182
- readonly cli_description: "Disable nopeek reminder extension";
183
+ readonly option_name: 'nopeek';
184
+ readonly cli_arg: 'no-nopeek';
185
+ readonly cli_flag: '--no-nopeek';
186
+ readonly cli_description: 'Disable nopeek reminder extension';
183
187
  readonly aliases: readonly ["nopeek", "secrets", "secret-loading"];
184
- readonly external_package_name: "@spences10/pi-nopeek";
188
+ readonly external_package_name: '@spences10/pi-nopeek';
185
189
  readonly load: () => Promise<typeof import("@spences10/pi-nopeek").default>;
186
190
  }, {
187
- readonly key: "observability";
188
- readonly label: "Observability";
189
- readonly docs_label: "Live observability";
190
- readonly description: "Optional live event stream and local browser dashboard";
191
+ readonly key: 'observability';
192
+ readonly label: 'Observability';
193
+ readonly docs_label: 'Live observability';
194
+ readonly description: 'Optional live event stream and local browser dashboard';
191
195
  readonly default_enabled: true;
192
- readonly option_name: "observability";
193
- readonly cli_arg: "no-observability";
194
- readonly cli_flag: "--no-observability";
195
- readonly cli_description: "Disable live observability extension";
196
+ readonly option_name: 'observability';
197
+ readonly cli_arg: 'no-observability';
198
+ readonly cli_flag: '--no-observability';
199
+ readonly cli_description: 'Disable live observability extension';
196
200
  readonly aliases: readonly ["observability", "obs", "live-events"];
197
- readonly external_package_name: "@spences10/pi-observability";
201
+ readonly external_package_name: '@spences10/pi-observability';
198
202
  readonly load: () => Promise<typeof import("@spences10/pi-observability").default>;
199
203
  }, {
200
- readonly key: "omnisearch";
201
- readonly label: "Omnisearch";
202
- readonly docs_label: "Omnisearch";
203
- readonly description: "mcp-omnisearch reminder for verified web research";
204
+ readonly key: 'omnisearch';
205
+ readonly label: 'Omnisearch';
206
+ readonly docs_label: 'Omnisearch';
207
+ readonly description: 'mcp-omnisearch reminder for verified web research';
204
208
  readonly default_enabled: true;
205
- readonly option_name: "omnisearch";
206
- readonly cli_arg: "no-omnisearch";
207
- readonly cli_flag: "--no-omnisearch";
208
- readonly cli_description: "Disable mcp-omnisearch reminder extension";
209
+ readonly option_name: 'omnisearch';
210
+ readonly cli_arg: 'no-omnisearch';
211
+ readonly cli_flag: '--no-omnisearch';
212
+ readonly cli_description: 'Disable mcp-omnisearch reminder extension';
209
213
  readonly aliases: readonly ["omnisearch", "search", "web-search", "research"];
210
- readonly external_package_name: "@spences10/pi-omnisearch";
214
+ readonly external_package_name: '@spences10/pi-omnisearch';
211
215
  readonly load: () => Promise<typeof import("@spences10/pi-omnisearch").default>;
212
216
  }, {
213
- readonly key: "sqlite-tools";
214
- readonly label: "SQLite tools";
215
- readonly docs_label: "SQLite tools";
216
- readonly description: "mcp-sqlite-tools reminder for safer SQLite database work";
217
+ readonly key: 'sqlite-tools';
218
+ readonly label: 'SQLite tools';
219
+ readonly docs_label: 'SQLite tools';
220
+ readonly description: 'mcp-sqlite-tools reminder for safer SQLite database work';
217
221
  readonly default_enabled: true;
218
- readonly option_name: "sqlite_tools";
219
- readonly cli_arg: "no-sqlite-tools";
220
- readonly cli_flag: "--no-sqlite-tools";
221
- readonly cli_description: "Disable mcp-sqlite-tools reminder extension";
222
+ readonly option_name: 'sqlite_tools';
223
+ readonly cli_arg: 'no-sqlite-tools';
224
+ readonly cli_flag: '--no-sqlite-tools';
225
+ readonly cli_description: 'Disable mcp-sqlite-tools reminder extension';
222
226
  readonly aliases: readonly ["sqlite-tools", "sqlite", "mcp-sqlite-tools"];
223
- readonly external_package_name: "@spences10/pi-sqlite-tools";
227
+ readonly external_package_name: '@spences10/pi-sqlite-tools';
224
228
  readonly load: () => Promise<typeof import("@spences10/pi-sqlite-tools").default>;
225
229
  }, {
226
- readonly key: "startup-screen";
227
- readonly label: "Startup screen";
228
- readonly docs_label: "Startup screen";
229
- readonly description: "Pixel-art gradient startup header for interactive sessions";
230
+ readonly key: 'startup-screen';
231
+ readonly label: 'Startup screen';
232
+ readonly docs_label: 'Startup screen';
233
+ readonly description: 'Pixel-art gradient startup header for interactive sessions';
230
234
  readonly default_enabled: true;
231
- readonly option_name: "startup_screen";
232
- readonly cli_arg: "no-startup-screen";
233
- readonly cli_flag: "--no-startup-screen";
234
- readonly cli_description: "Disable the custom startup screen";
235
+ readonly option_name: 'startup_screen';
236
+ readonly cli_arg: 'no-startup-screen';
237
+ readonly cli_flag: '--no-startup-screen';
238
+ readonly cli_description: 'Disable the custom startup screen';
235
239
  readonly aliases: readonly ["startup-screen", "startup", "header", "splash"];
236
240
  readonly mode_constraints: {
237
241
  readonly disabled_in: readonly ["print", "json", "rpc"];
238
- readonly reason: "Startup screen only renders in the interactive TUI";
242
+ readonly reason: 'Startup screen only renders in the interactive TUI';
239
243
  };
240
244
  readonly load: () => Promise<typeof startup_screen_extension>;
241
245
  }, {
242
- readonly key: "prompt-presets";
243
- readonly label: "Prompt presets";
244
- readonly docs_label: "Prompt presets";
245
- readonly description: "Runtime prompt preset selection and /prompt-preset command";
246
+ readonly key: 'prompt-presets';
247
+ readonly label: 'Prompt presets';
248
+ readonly docs_label: 'Prompt presets';
249
+ readonly description: 'Runtime prompt preset selection and /prompt-preset command';
246
250
  readonly default_enabled: true;
247
- readonly option_name: "prompt_presets";
248
- readonly cli_arg: "no-prompt-presets";
249
- readonly cli_flag: "--no-prompt-presets";
250
- readonly cli_description: "Disable prompt presets extension";
251
+ readonly option_name: 'prompt_presets';
252
+ readonly cli_arg: 'no-prompt-presets';
253
+ readonly cli_flag: '--no-prompt-presets';
254
+ readonly cli_description: 'Disable prompt presets extension';
251
255
  readonly aliases: readonly ["prompt-preset", "preset", "presets"];
252
256
  readonly load: () => Promise<typeof prompt_presets>;
253
257
  }, {
254
- readonly key: "git-ui";
255
- readonly label: "Git UI";
256
- readonly docs_label: "Git staging UI";
257
- readonly description: "Interactive source control staging panel";
258
+ readonly key: 'turn-timer';
259
+ readonly label: 'Turn timer';
260
+ readonly docs_label: 'Turn timer';
261
+ readonly description: 'Live elapsed timer beside the working spinner with persisted turn durations';
262
+ readonly default_enabled: true;
263
+ readonly option_name: 'turn_timer';
264
+ readonly cli_arg: 'no-turn-timer';
265
+ readonly cli_flag: '--no-turn-timer';
266
+ readonly cli_description: 'Disable the working spinner turn timer';
267
+ readonly aliases: readonly ["turn-timer", "timer", "elapsed-time"];
268
+ readonly mode_constraints: {
269
+ readonly disabled_in: readonly ["print", "json", "rpc"];
270
+ readonly reason: 'The live timer is only useful in the interactive TUI';
271
+ };
272
+ readonly load: () => Promise<typeof turn_timer>;
273
+ }, {
274
+ readonly key: 'git-ui';
275
+ readonly label: 'Git UI';
276
+ readonly docs_label: 'Git staging UI';
277
+ readonly description: 'Interactive source control staging panel';
258
278
  readonly default_enabled: true;
259
- readonly option_name: "git_ui";
260
- readonly cli_arg: "no-git-ui";
261
- readonly cli_flag: "--no-git-ui";
262
- readonly cli_description: "Disable built-in Git staging UI";
279
+ readonly option_name: 'git_ui';
280
+ readonly cli_arg: 'no-git-ui';
281
+ readonly cli_flag: '--no-git-ui';
282
+ readonly cli_description: 'Disable built-in Git staging UI';
263
283
  readonly aliases: readonly ["git-ui", "git", "source-control", "scm"];
264
284
  readonly mode_constraints: {
265
285
  readonly disabled_in: readonly ["print", "json", "rpc"];
266
- readonly reason: "Git UI is only useful in interactive mode";
286
+ readonly reason: 'Git UI is only useful in interactive mode';
267
287
  };
268
- readonly external_package_name: "@spences10/pi-git-ui";
288
+ readonly external_package_name: '@spences10/pi-git-ui';
269
289
  readonly load: () => Promise<typeof import("@spences10/pi-git-ui").default>;
270
290
  }, {
271
- readonly key: "lsp";
272
- readonly label: "LSP";
273
- readonly docs_label: "LSP";
274
- readonly description: "Language Server Protocol tools (diagnostics, hover, definition, references)";
291
+ readonly key: 'lsp';
292
+ readonly label: 'LSP';
293
+ readonly docs_label: 'LSP';
294
+ readonly description: 'Language Server Protocol tools (diagnostics, hover, definition, references)';
275
295
  readonly default_enabled: true;
276
- readonly option_name: "lsp";
277
- readonly cli_arg: "no-lsp";
278
- readonly cli_flag: "--no-lsp";
279
- readonly cli_description: "Disable LSP extension";
296
+ readonly option_name: 'lsp';
297
+ readonly cli_arg: 'no-lsp';
298
+ readonly cli_flag: '--no-lsp';
299
+ readonly cli_description: 'Disable LSP extension';
280
300
  readonly aliases: readonly ["lsp", "language-server"];
281
- readonly external_package_name: "@spences10/pi-lsp";
301
+ readonly external_package_name: '@spences10/pi-lsp';
282
302
  readonly load: () => Promise<(pi: import("@earendil-works/pi-coding-agent").ExtensionAPI) => Promise<void>>;
283
303
  }, {
284
- readonly key: "session-name";
285
- readonly label: "Session name";
286
- readonly docs_label: "Session auto-naming";
287
- readonly description: "AI-powered session auto-naming and /session-name command";
304
+ readonly key: 'session-name';
305
+ readonly label: 'Session name';
306
+ readonly docs_label: 'Session auto-naming';
307
+ readonly description: 'AI-powered session auto-naming and /session-name command';
288
308
  readonly default_enabled: true;
289
- readonly option_name: "session_name";
290
- readonly cli_arg: "no-session-name";
291
- readonly cli_flag: "--no-session-name";
292
- readonly cli_description: "Disable session name extension";
309
+ readonly option_name: 'session_name';
310
+ readonly cli_arg: 'no-session-name';
311
+ readonly cli_flag: '--no-session-name';
312
+ readonly cli_description: 'Disable session name extension';
293
313
  readonly aliases: readonly ["session-name", "session", "auto-name"];
294
314
  readonly mode_constraints: {
295
315
  readonly disabled_in: readonly ["print", "json", "rpc"];
296
- readonly reason: "UI-only session naming is only useful in interactive mode";
316
+ readonly reason: 'UI-only session naming is only useful in interactive mode';
297
317
  };
298
318
  readonly load: () => Promise<typeof session_name>;
299
319
  }, {
300
- readonly key: "confirm-destructive";
301
- readonly label: "Confirm destructive";
302
- readonly docs_label: "Destructive action confirmation";
303
- readonly description: "Prompt before destructive tool calls like file deletes, overwrites, and hard resets";
320
+ readonly key: 'confirm-destructive';
321
+ readonly label: 'Confirm destructive';
322
+ readonly docs_label: 'Destructive action confirmation';
323
+ readonly description: 'Prompt before destructive tool calls like file deletes, overwrites, and hard resets';
304
324
  readonly default_enabled: true;
305
- readonly option_name: "confirm_destructive";
306
- readonly cli_arg: "no-confirm-destructive";
307
- readonly cli_flag: "--no-confirm-destructive";
308
- readonly cli_description: "Disable destructive action confirmations";
325
+ readonly option_name: 'confirm_destructive';
326
+ readonly cli_arg: 'no-confirm-destructive';
327
+ readonly cli_flag: '--no-confirm-destructive';
328
+ readonly cli_description: 'Disable destructive action confirmations';
309
329
  readonly aliases: readonly ["confirm-destructive", "confirm"];
310
- readonly external_package_name: "@spences10/pi-confirm-destructive";
330
+ readonly external_package_name: '@spences10/pi-confirm-destructive';
311
331
  readonly load: () => Promise<typeof import("@spences10/pi-confirm-destructive").default>;
312
332
  }, {
313
- readonly key: "hooks-resolution";
314
- readonly label: "Hooks resolution";
315
- readonly docs_label: "Hooks resolution";
316
- readonly description: "Claude Code style PreToolUse and PostToolUse hook compatibility from .claude, .rulesync, and .pi configs";
333
+ readonly key: 'hooks-resolution';
334
+ readonly label: 'Hooks resolution';
335
+ readonly docs_label: 'Hooks resolution';
336
+ readonly description: 'Claude Code style PreToolUse and PostToolUse hook compatibility from .claude, .rulesync, and .pi configs';
317
337
  readonly default_enabled: true;
318
- readonly option_name: "hooks_resolution";
319
- readonly cli_arg: "no-hooks";
320
- readonly cli_flag: "--no-hooks";
321
- readonly cli_description: "Disable Claude-style hook execution";
338
+ readonly option_name: 'hooks_resolution';
339
+ readonly cli_arg: 'no-hooks';
340
+ readonly cli_flag: '--no-hooks';
341
+ readonly cli_description: 'Disable Claude-style hook execution';
322
342
  readonly aliases: readonly ["hooks-resolution", "hooks"];
323
343
  readonly load: () => Promise<ExtensionFactory$1>;
324
344
  }, {
325
- readonly key: "svelte-guardrails";
326
- readonly label: "Svelte guardrails";
327
- readonly docs_label: "Svelte guardrails";
328
- readonly description: "Blocks discouraged Svelte patterns like $effect before agents write them";
345
+ readonly key: 'svelte-guardrails';
346
+ readonly label: 'Svelte guardrails';
347
+ readonly docs_label: 'Svelte guardrails';
348
+ readonly description: 'Blocks discouraged Svelte patterns like $effect before agents write them';
329
349
  readonly default_enabled: true;
330
- readonly option_name: "svelte_guardrails";
331
- readonly cli_arg: "no-svelte-guardrails";
332
- readonly cli_flag: "--no-svelte-guardrails";
333
- readonly cli_description: "Disable Svelte guardrails";
350
+ readonly option_name: 'svelte_guardrails';
351
+ readonly cli_arg: 'no-svelte-guardrails';
352
+ readonly cli_flag: '--no-svelte-guardrails';
353
+ readonly cli_description: 'Disable Svelte guardrails';
334
354
  readonly aliases: readonly ["svelte-guardrails", "svelte"];
335
- readonly external_package_name: "@spences10/pi-svelte-guardrails";
355
+ readonly external_package_name: '@spences10/pi-svelte-guardrails';
336
356
  readonly load: () => Promise<typeof import("@spences10/pi-svelte-guardrails").default>;
337
357
  }, {
338
- readonly key: "coding-preferences";
339
- readonly label: "Coding preferences";
340
- readonly docs_label: "Coding preferences";
341
- readonly description: "Blocks configured coding workflow anti-patterns from JSON preferences";
358
+ readonly key: 'coding-preferences';
359
+ readonly label: 'Coding preferences';
360
+ readonly docs_label: 'Coding preferences';
361
+ readonly description: 'Blocks configured coding workflow anti-patterns from JSON preferences';
342
362
  readonly default_enabled: true;
343
- readonly option_name: "coding_preferences";
344
- readonly cli_arg: "no-coding-preferences";
345
- readonly cli_flag: "--no-coding-preferences";
346
- readonly cli_description: "Disable coding preferences guardrails";
363
+ readonly option_name: 'coding_preferences';
364
+ readonly cli_arg: 'no-coding-preferences';
365
+ readonly cli_flag: '--no-coding-preferences';
366
+ readonly cli_description: 'Disable coding preferences guardrails';
347
367
  readonly aliases: readonly ["coding-preferences", "preferences", "prefs"];
348
- readonly external_package_name: "@spences10/pi-coding-preferences";
368
+ readonly external_package_name: '@spences10/pi-coding-preferences';
349
369
  readonly load: () => Promise<typeof import("@spences10/pi-coding-preferences").default>;
350
370
  }, {
351
- readonly key: "handoff";
352
- readonly label: "Handoff";
353
- readonly docs_label: "Handoff";
354
- readonly description: "Help command for Pi continuation primitives like /fork, /tree, /export, /import, and /share";
371
+ readonly key: 'handoff';
372
+ readonly label: 'Handoff';
373
+ readonly docs_label: 'Handoff';
374
+ readonly description: 'Help command for Pi continuation primitives like /fork, /tree, /export, /import, and /share';
355
375
  readonly default_enabled: true;
356
- readonly option_name: "handoff";
357
- readonly cli_arg: "no-handoff";
358
- readonly cli_flag: "--no-handoff";
359
- readonly cli_description: "Disable handoff helper command";
376
+ readonly option_name: 'handoff';
377
+ readonly cli_arg: 'no-handoff';
378
+ readonly cli_flag: '--no-handoff';
379
+ readonly cli_description: 'Disable handoff helper command';
360
380
  readonly aliases: readonly ["handoff", "continuation"];
361
381
  readonly load: () => Promise<typeof handoff>;
362
382
  }, {
363
- readonly key: "team-mode";
364
- readonly label: "Team mode";
365
- readonly docs_label: "Team mode";
366
- readonly description: "Peer coordination between independently opened Pi sessions with groups, artifacts, and durable mailboxes";
383
+ readonly key: 'team-mode';
384
+ readonly label: 'Team mode';
385
+ readonly docs_label: 'Team mode';
386
+ readonly description: 'Peer coordination between independently opened Pi sessions with groups, artifacts, and durable mailboxes';
367
387
  readonly default_enabled: true;
368
- readonly option_name: "team_mode";
369
- readonly cli_arg: "no-team-mode";
370
- readonly cli_flag: "--no-team-mode";
371
- readonly cli_description: "Disable peer-session team mode extension";
388
+ readonly option_name: 'team_mode';
389
+ readonly cli_arg: 'no-team-mode';
390
+ readonly cli_flag: '--no-team-mode';
391
+ readonly cli_description: 'Disable peer-session team mode extension';
372
392
  readonly aliases: readonly ["team-mode", "team", "teammates"];
373
- readonly external_package_name: "@spences10/pi-team-mode";
393
+ readonly external_package_name: '@spences10/pi-team-mode';
374
394
  readonly load: () => Promise<typeof import("@spences10/pi-team-mode").default>;
375
395
  }];
376
396
  type BuiltinExtensionKey = (typeof BUILTIN_EXTENSION_REGISTRY)[number]['key'];
package/dist/api.js CHANGED
@@ -1,4 +1,4 @@
1
- import { n as BUILTIN_EXTENSION_REGISTRY, t as BUILTIN_EXTENSIONS } from "./builtin-registry-CFKfijEc.js";
1
+ import { n as BUILTIN_EXTENSION_REGISTRY, t as BUILTIN_EXTENSIONS } from "./builtin-registry-BFjcVSDi.js";
2
2
  import { n as save_settings, t as load_settings } from "./settings-CTk0ws43.js";
3
3
  import { createRequire } from "node:module";
4
4
  import { existsSync, readdirSync } from "node:fs";
@@ -312,6 +312,31 @@ const BUILTIN_EXTENSION_REGISTRY = [
312
312
  ],
313
313
  load: async () => (await import("./prompt-presets-Lb8mMDHY.js")).default
314
314
  },
315
+ {
316
+ key: "turn-timer",
317
+ label: "Turn timer",
318
+ docs_label: "Turn timer",
319
+ description: "Live elapsed timer beside the working spinner with persisted turn durations",
320
+ default_enabled: true,
321
+ option_name: "turn_timer",
322
+ cli_arg: "no-turn-timer",
323
+ cli_flag: "--no-turn-timer",
324
+ cli_description: "Disable the working spinner turn timer",
325
+ aliases: [
326
+ "turn-timer",
327
+ "timer",
328
+ "elapsed-time"
329
+ ],
330
+ mode_constraints: {
331
+ disabled_in: [
332
+ "print",
333
+ "json",
334
+ "rpc"
335
+ ],
336
+ reason: "The live timer is only useful in the interactive TUI"
337
+ },
338
+ load: async () => (await import("./turn-timer-CoyDI4gQ.js")).default
339
+ },
315
340
  {
316
341
  key: "git-ui",
317
342
  label: "Git UI",
@@ -473,4 +498,4 @@ const BUILTIN_EXTENSIONS = BUILTIN_EXTENSION_REGISTRY.map(({ load: _load, ...ext
473
498
  //#endregion
474
499
  export { BUILTIN_EXTENSION_REGISTRY as n, BUILTIN_EXTENSIONS as t };
475
500
 
476
- //# sourceMappingURL=builtin-registry-CFKfijEc.js.map
501
+ //# sourceMappingURL=builtin-registry-BFjcVSDi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"builtin-registry-CFKfijEc.js","names":[],"sources":["../src/extensions/builtin-registry.ts"],"sourcesContent":["import type { ExtensionFactory } from '@earendil-works/pi-coding-agent';\n\nexport type BuiltinExtensionRuntimeMode =\n\t| 'interactive'\n\t| 'print'\n\t| 'json'\n\t| 'rpc';\n\ntype BuiltinExtensionLoader = () => Promise<ExtensionFactory>;\n\nexport interface BuiltinExtensionManifestEntry {\n\tkey: string;\n\tlabel: string;\n\tdocs_label: string;\n\tdescription: string;\n\tdefault_enabled: boolean;\n\toption_name: string;\n\tcli_arg: string;\n\tcli_flag: `--${string}`;\n\tcli_description: string;\n\taliases: readonly string[];\n\tmode_constraints?: {\n\t\tdisabled_in: readonly BuiltinExtensionRuntimeMode[];\n\t\treason: string;\n\t};\n\texternal_package_name?: string;\n\tload: BuiltinExtensionLoader;\n}\n\nexport const BUILTIN_EXTENSION_REGISTRY = [\n\t{\n\t\tkey: 'context-sidecar',\n\t\tlabel: 'Context sidecar',\n\t\tdocs_label: 'SQLite context sidecar',\n\t\tdescription: 'Local SQLite FTS sidecar for oversized tool output',\n\t\tdefault_enabled: true,\n\t\toption_name: 'context_sidecar',\n\t\tcli_arg: 'no-context-sidecar',\n\t\tcli_flag: '--no-context-sidecar',\n\t\tcli_description:\n\t\t\t'Disable SQLite context sidecar for large tool output',\n\t\taliases: ['context-sidecar', 'context', 'sidecar'],\n\t\texternal_package_name: '@spences10/pi-context',\n\t\tload: async () => (await import('@spences10/pi-context')).default,\n\t},\n\t{\n\t\tkey: 'mcp',\n\t\tlabel: 'MCP',\n\t\tdocs_label: 'MCP',\n\t\tdescription: 'MCP server integration and /mcp command',\n\t\tdefault_enabled: true,\n\t\toption_name: 'mcp',\n\t\tcli_arg: 'no-mcp',\n\t\tcli_flag: '--no-mcp',\n\t\tcli_description: 'Disable built-in MCP extension',\n\t\taliases: ['mcp'],\n\t\texternal_package_name: '@spences10/pi-mcp',\n\t\tload: async () => (await import('@spences10/pi-mcp')).default,\n\t},\n\t{\n\t\tkey: 'openrouter-fusion-config',\n\t\tlabel: 'OpenRouter Fusion config',\n\t\tdocs_label: 'OpenRouter Fusion config guard',\n\t\tdescription:\n\t\t\t'Keeps OpenRouter Fusion off Anthropic by injecting a non-Anthropic panel and judge',\n\t\tdefault_enabled: true,\n\t\toption_name: 'openrouter_fusion_config',\n\t\tcli_arg: 'no-openrouter-fusion-config',\n\t\tcli_flag: '--no-openrouter-fusion-config',\n\t\tcli_description: 'Disable OpenRouter Fusion non-Anthropic config',\n\t\taliases: ['openrouter-fusion-config', 'fusion-budget'],\n\t\tload: async () =>\n\t\t\t(await import('./openrouter-fusion-config/index.js')).default,\n\t},\n\t{\n\t\tkey: 'umans-provider',\n\t\tlabel: 'Umans provider',\n\t\tdocs_label: 'Umans provider',\n\t\tdescription:\n\t\t\t'Umans.ai Anthropic Messages provider with API key login support',\n\t\tdefault_enabled: true,\n\t\toption_name: 'umans_provider',\n\t\tcli_arg: 'no-umans-provider',\n\t\tcli_flag: '--no-umans-provider',\n\t\tcli_description: 'Disable built-in Umans provider',\n\t\taliases: ['umans-provider', 'umans'],\n\t\tload: async () =>\n\t\t\t(await import('./umans-provider/index.js')).default,\n\t},\n\t{\n\t\tkey: 'footer',\n\t\tlabel: 'Footer',\n\t\tdocs_label: 'Footer',\n\t\tdescription: 'Configurable interactive footer/statusline',\n\t\tdefault_enabled: true,\n\t\toption_name: 'footer',\n\t\tcli_arg: 'no-footer',\n\t\tcli_flag: '--no-footer',\n\t\tcli_description: 'Disable custom footer/statusline',\n\t\taliases: ['footer', 'statusline', 'status-line'],\n\t\tmode_constraints: {\n\t\t\tdisabled_in: ['print', 'json', 'rpc'],\n\t\t\treason: 'Footer only renders in the interactive TUI',\n\t\t},\n\t\tload: async () => (await import('./footer/index.js')).default,\n\t},\n\t{\n\t\tkey: 'codex-usage',\n\t\tlabel: 'Codex usage',\n\t\tdocs_label: 'Codex usage status',\n\t\tdescription: 'OpenAI Codex usage status for the footer',\n\t\tdefault_enabled: true,\n\t\toption_name: 'codex_usage',\n\t\tcli_arg: 'no-codex-usage',\n\t\tcli_flag: '--no-codex-usage',\n\t\tcli_description: 'Disable Codex usage footer status',\n\t\taliases: ['codex-usage', 'codex-status'],\n\t\texternal_package_name: '@spences10/pi-codex-usage',\n\t\tload: async () =>\n\t\t\t(await import('@spences10/pi-codex-usage')).default,\n\t},\n\t{\n\t\tkey: 'harness',\n\t\tlabel: 'Harness',\n\t\tdocs_label: 'Task harness runtime',\n\t\tdescription:\n\t\t\t'Ephemeral /tmp task harness runtime with tools, enforcement, and bundled skills',\n\t\tdefault_enabled: true,\n\t\toption_name: 'harness',\n\t\tcli_arg: 'no-harness',\n\t\tcli_flag: '--no-harness',\n\t\tcli_description: 'Disable task harness runtime',\n\t\taliases: ['harness', 'task-harness'],\n\t\texternal_package_name: '@spences10/pi-harness',\n\t\tload: async () => (await import('@spences10/pi-harness')).default,\n\t},\n\t{\n\t\tkey: 'factory',\n\t\tlabel: 'Software factory (experimental)',\n\t\tdocs_label: 'Experimental software-factory control plane',\n\t\tdescription:\n\t\t\t'Paused experimental workflow control plane; enable explicitly for Factory v1 evaluation only',\n\t\tdefault_enabled: false,\n\t\toption_name: 'factory',\n\t\tcli_arg: 'no-factory',\n\t\tcli_flag: '--no-factory',\n\t\tcli_description: 'Disable software-factory control plane',\n\t\taliases: ['factory', 'software-factory', 'control-plane'],\n\t\texternal_package_name: '@spences10/pi-factory',\n\t\tload: async () => (await import('@spences10/pi-factory')).default,\n\t},\n\t{\n\t\tkey: 'skills',\n\t\tlabel: 'Skills',\n\t\tdocs_label: 'Skills',\n\t\tdescription: 'Managed pi-native skills and /skills command',\n\t\tdefault_enabled: true,\n\t\toption_name: 'skills',\n\t\tcli_arg: 'no-skills',\n\t\tcli_flag: '--no-skills',\n\t\tcli_description: 'Disable built-in skills extension',\n\t\taliases: ['skills', 'skill'],\n\t\texternal_package_name: '@spences10/pi-skills',\n\t\tload: async () => (await import('@spences10/pi-skills')).default,\n\t},\n\t{\n\t\tkey: 'skill-importer',\n\t\tlabel: 'Skill importer',\n\t\tdocs_label: 'Skill importer',\n\t\tdescription:\n\t\t\t'Import external Claude/plugin skills into Pi-native storage',\n\t\tdefault_enabled: true,\n\t\toption_name: 'skill_importer',\n\t\tcli_arg: 'no-skill-importer',\n\t\tcli_flag: '--no-skill-importer',\n\t\tcli_description: 'Disable external skill importer extension',\n\t\taliases: ['skill-importer', 'import-skills', 'skill-import'],\n\t\texternal_package_name: '@spences10/pi-skill-importer',\n\t\tload: async () =>\n\t\t\t(await import('@spences10/pi-skill-importer')).default,\n\t},\n\t{\n\t\tkey: 'filter-output',\n\t\tlabel: 'Secret redaction',\n\t\tdocs_label: 'Secret redaction',\n\t\tdescription:\n\t\t\t'Redacts secrets from tool output before the model sees them',\n\t\tdefault_enabled: true,\n\t\toption_name: 'filter_output',\n\t\tcli_arg: 'no-filter',\n\t\tcli_flag: '--no-filter',\n\t\tcli_description: 'Disable secret redaction in tool output',\n\t\taliases: [\n\t\t\t'filter-output',\n\t\t\t'filter_output',\n\t\t\t'filter',\n\t\t\t'redaction',\n\t\t\t'secret-redaction',\n\t\t\t'output-redaction',\n\t\t],\n\t\texternal_package_name: '@spences10/pi-redact',\n\t\tload: async () => (await import('@spences10/pi-redact')).default,\n\t},\n\t{\n\t\tkey: 'recall',\n\t\tlabel: 'Recall',\n\t\tdocs_label: 'Recall',\n\t\tdescription: 'pirecall reminder and background session sync',\n\t\tdefault_enabled: true,\n\t\toption_name: 'recall',\n\t\tcli_arg: 'no-recall',\n\t\tcli_flag: '--no-recall',\n\t\tcli_description: 'Disable recall extension',\n\t\taliases: ['recall', 'pirecall'],\n\t\texternal_package_name: '@spences10/pi-recall',\n\t\tload: async () => (await import('@spences10/pi-recall')).default,\n\t},\n\t{\n\t\tkey: 'nopeek',\n\t\tlabel: 'Nopeek',\n\t\tdocs_label: 'Nopeek',\n\t\tdescription:\n\t\t\t'nopeek reminder for secret-safe environment loading',\n\t\tdefault_enabled: true,\n\t\toption_name: 'nopeek',\n\t\tcli_arg: 'no-nopeek',\n\t\tcli_flag: '--no-nopeek',\n\t\tcli_description: 'Disable nopeek reminder extension',\n\t\taliases: ['nopeek', 'secrets', 'secret-loading'],\n\t\texternal_package_name: '@spences10/pi-nopeek',\n\t\tload: async () => (await import('@spences10/pi-nopeek')).default,\n\t},\n\t{\n\t\tkey: 'observability',\n\t\tlabel: 'Observability',\n\t\tdocs_label: 'Live observability',\n\t\tdescription:\n\t\t\t'Optional live event stream and local browser dashboard',\n\t\tdefault_enabled: true,\n\t\toption_name: 'observability',\n\t\tcli_arg: 'no-observability',\n\t\tcli_flag: '--no-observability',\n\t\tcli_description: 'Disable live observability extension',\n\t\taliases: ['observability', 'obs', 'live-events'],\n\t\texternal_package_name: '@spences10/pi-observability',\n\t\tload: async () =>\n\t\t\t(await import('@spences10/pi-observability')).default,\n\t},\n\t{\n\t\tkey: 'omnisearch',\n\t\tlabel: 'Omnisearch',\n\t\tdocs_label: 'Omnisearch',\n\t\tdescription: 'mcp-omnisearch reminder for verified web research',\n\t\tdefault_enabled: true,\n\t\toption_name: 'omnisearch',\n\t\tcli_arg: 'no-omnisearch',\n\t\tcli_flag: '--no-omnisearch',\n\t\tcli_description: 'Disable mcp-omnisearch reminder extension',\n\t\taliases: ['omnisearch', 'search', 'web-search', 'research'],\n\t\texternal_package_name: '@spences10/pi-omnisearch',\n\t\tload: async () =>\n\t\t\t(await import('@spences10/pi-omnisearch')).default,\n\t},\n\t{\n\t\tkey: 'sqlite-tools',\n\t\tlabel: 'SQLite tools',\n\t\tdocs_label: 'SQLite tools',\n\t\tdescription:\n\t\t\t'mcp-sqlite-tools reminder for safer SQLite database work',\n\t\tdefault_enabled: true,\n\t\toption_name: 'sqlite_tools',\n\t\tcli_arg: 'no-sqlite-tools',\n\t\tcli_flag: '--no-sqlite-tools',\n\t\tcli_description: 'Disable mcp-sqlite-tools reminder extension',\n\t\taliases: ['sqlite-tools', 'sqlite', 'mcp-sqlite-tools'],\n\t\texternal_package_name: '@spences10/pi-sqlite-tools',\n\t\tload: async () =>\n\t\t\t(await import('@spences10/pi-sqlite-tools')).default,\n\t},\n\t{\n\t\tkey: 'startup-screen',\n\t\tlabel: 'Startup screen',\n\t\tdocs_label: 'Startup screen',\n\t\tdescription:\n\t\t\t'Pixel-art gradient startup header for interactive sessions',\n\t\tdefault_enabled: true,\n\t\toption_name: 'startup_screen',\n\t\tcli_arg: 'no-startup-screen',\n\t\tcli_flag: '--no-startup-screen',\n\t\tcli_description: 'Disable the custom startup screen',\n\t\taliases: ['startup-screen', 'startup', 'header', 'splash'],\n\t\tmode_constraints: {\n\t\t\tdisabled_in: ['print', 'json', 'rpc'],\n\t\t\treason: 'Startup screen only renders in the interactive TUI',\n\t\t},\n\t\tload: async () =>\n\t\t\t(await import('./startup-screen/index.js')).default,\n\t},\n\t{\n\t\tkey: 'prompt-presets',\n\t\tlabel: 'Prompt presets',\n\t\tdocs_label: 'Prompt presets',\n\t\tdescription:\n\t\t\t'Runtime prompt preset selection and /prompt-preset command',\n\t\tdefault_enabled: true,\n\t\toption_name: 'prompt_presets',\n\t\tcli_arg: 'no-prompt-presets',\n\t\tcli_flag: '--no-prompt-presets',\n\t\tcli_description: 'Disable prompt presets extension',\n\t\taliases: ['prompt-preset', 'preset', 'presets'],\n\t\tload: async () =>\n\t\t\t(await import('./prompt-presets/index.js')).default,\n\t},\n\t{\n\t\tkey: 'git-ui',\n\t\tlabel: 'Git UI',\n\t\tdocs_label: 'Git staging UI',\n\t\tdescription: 'Interactive source control staging panel',\n\t\tdefault_enabled: true,\n\t\toption_name: 'git_ui',\n\t\tcli_arg: 'no-git-ui',\n\t\tcli_flag: '--no-git-ui',\n\t\tcli_description: 'Disable built-in Git staging UI',\n\t\taliases: ['git-ui', 'git', 'source-control', 'scm'],\n\t\tmode_constraints: {\n\t\t\tdisabled_in: ['print', 'json', 'rpc'],\n\t\t\treason: 'Git UI is only useful in interactive mode',\n\t\t},\n\t\texternal_package_name: '@spences10/pi-git-ui',\n\t\tload: async () => (await import('@spences10/pi-git-ui')).default,\n\t},\n\t{\n\t\tkey: 'lsp',\n\t\tlabel: 'LSP',\n\t\tdocs_label: 'LSP',\n\t\tdescription:\n\t\t\t'Language Server Protocol tools (diagnostics, hover, definition, references)',\n\t\tdefault_enabled: true,\n\t\toption_name: 'lsp',\n\t\tcli_arg: 'no-lsp',\n\t\tcli_flag: '--no-lsp',\n\t\tcli_description: 'Disable LSP extension',\n\t\taliases: ['lsp', 'language-server'],\n\t\texternal_package_name: '@spences10/pi-lsp',\n\t\tload: async () => (await import('@spences10/pi-lsp')).default,\n\t},\n\t{\n\t\tkey: 'session-name',\n\t\tlabel: 'Session name',\n\t\tdocs_label: 'Session auto-naming',\n\t\tdescription:\n\t\t\t'AI-powered session auto-naming and /session-name command',\n\t\tdefault_enabled: true,\n\t\toption_name: 'session_name',\n\t\tcli_arg: 'no-session-name',\n\t\tcli_flag: '--no-session-name',\n\t\tcli_description: 'Disable session name extension',\n\t\taliases: ['session-name', 'session', 'auto-name'],\n\t\tmode_constraints: {\n\t\t\tdisabled_in: ['print', 'json', 'rpc'],\n\t\t\treason:\n\t\t\t\t'UI-only session naming is only useful in interactive mode',\n\t\t},\n\t\tload: async () =>\n\t\t\t(await import('./session-name/index.js')).default,\n\t},\n\t{\n\t\tkey: 'confirm-destructive',\n\t\tlabel: 'Confirm destructive',\n\t\tdocs_label: 'Destructive action confirmation',\n\t\tdescription:\n\t\t\t'Prompt before destructive tool calls like file deletes, overwrites, and hard resets',\n\t\tdefault_enabled: true,\n\t\toption_name: 'confirm_destructive',\n\t\tcli_arg: 'no-confirm-destructive',\n\t\tcli_flag: '--no-confirm-destructive',\n\t\tcli_description: 'Disable destructive action confirmations',\n\t\taliases: ['confirm-destructive', 'confirm'],\n\t\texternal_package_name: '@spences10/pi-confirm-destructive',\n\t\tload: async () =>\n\t\t\t(await import('@spences10/pi-confirm-destructive')).default,\n\t},\n\t{\n\t\tkey: 'hooks-resolution',\n\t\tlabel: 'Hooks resolution',\n\t\tdocs_label: 'Hooks resolution',\n\t\tdescription:\n\t\t\t'Claude Code style PreToolUse and PostToolUse hook compatibility from .claude, .rulesync, and .pi configs',\n\t\tdefault_enabled: true,\n\t\toption_name: 'hooks_resolution',\n\t\tcli_arg: 'no-hooks',\n\t\tcli_flag: '--no-hooks',\n\t\tcli_description: 'Disable Claude-style hook execution',\n\t\taliases: ['hooks-resolution', 'hooks'],\n\t\tload: async () =>\n\t\t\t(await import('./hooks-resolution/index.js')).default,\n\t},\n\t{\n\t\tkey: 'svelte-guardrails',\n\t\tlabel: 'Svelte guardrails',\n\t\tdocs_label: 'Svelte guardrails',\n\t\tdescription:\n\t\t\t'Blocks discouraged Svelte patterns like $effect before agents write them',\n\t\tdefault_enabled: true,\n\t\toption_name: 'svelte_guardrails',\n\t\tcli_arg: 'no-svelte-guardrails',\n\t\tcli_flag: '--no-svelte-guardrails',\n\t\tcli_description: 'Disable Svelte guardrails',\n\t\taliases: ['svelte-guardrails', 'svelte'],\n\t\texternal_package_name: '@spences10/pi-svelte-guardrails',\n\t\tload: async () =>\n\t\t\t(await import('@spences10/pi-svelte-guardrails')).default,\n\t},\n\t{\n\t\tkey: 'coding-preferences',\n\t\tlabel: 'Coding preferences',\n\t\tdocs_label: 'Coding preferences',\n\t\tdescription:\n\t\t\t'Blocks configured coding workflow anti-patterns from JSON preferences',\n\t\tdefault_enabled: true,\n\t\toption_name: 'coding_preferences',\n\t\tcli_arg: 'no-coding-preferences',\n\t\tcli_flag: '--no-coding-preferences',\n\t\tcli_description: 'Disable coding preferences guardrails',\n\t\taliases: ['coding-preferences', 'preferences', 'prefs'],\n\t\texternal_package_name: '@spences10/pi-coding-preferences',\n\t\tload: async () =>\n\t\t\t(await import('@spences10/pi-coding-preferences')).default,\n\t},\n\t{\n\t\tkey: 'handoff',\n\t\tlabel: 'Handoff',\n\t\tdocs_label: 'Handoff',\n\t\tdescription:\n\t\t\t'Help command for Pi continuation primitives like /fork, /tree, /export, /import, and /share',\n\t\tdefault_enabled: true,\n\t\toption_name: 'handoff',\n\t\tcli_arg: 'no-handoff',\n\t\tcli_flag: '--no-handoff',\n\t\tcli_description: 'Disable handoff helper command',\n\t\taliases: ['handoff', 'continuation'],\n\t\tload: async () => (await import('./handoff/index.js')).default,\n\t},\n\t{\n\t\tkey: 'team-mode',\n\t\tlabel: 'Team mode',\n\t\tdocs_label: 'Team mode',\n\t\tdescription:\n\t\t\t'Peer coordination between independently opened Pi sessions with groups, artifacts, and durable mailboxes',\n\t\tdefault_enabled: true,\n\t\toption_name: 'team_mode',\n\t\tcli_arg: 'no-team-mode',\n\t\tcli_flag: '--no-team-mode',\n\t\tcli_description: 'Disable peer-session team mode extension',\n\t\taliases: ['team-mode', 'team', 'teammates'],\n\t\texternal_package_name: '@spences10/pi-team-mode',\n\t\tload: async () =>\n\t\t\t(await import('@spences10/pi-team-mode')).default,\n\t},\n] as const satisfies readonly BuiltinExtensionManifestEntry[];\n\nexport type BuiltinExtensionKey =\n\t(typeof BUILTIN_EXTENSION_REGISTRY)[number]['key'];\n\nexport type BuiltinExtensionOptionName =\n\t(typeof BUILTIN_EXTENSION_REGISTRY)[number]['option_name'];\n\nexport type BuiltinExtensionInfo = Omit<\n\tBuiltinExtensionManifestEntry,\n\t'load'\n> & {\n\tkey: BuiltinExtensionKey;\n\toption_name: BuiltinExtensionOptionName;\n};\n\nexport const BUILTIN_EXTENSIONS: BuiltinExtensionInfo[] =\n\tBUILTIN_EXTENSION_REGISTRY.map(\n\t\t({ load: _load, ...extension }) => extension,\n\t);\n"],"mappings":"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"}
1
+ {"version":3,"file":"builtin-registry-BFjcVSDi.js","names":[],"sources":["../src/extensions/builtin-registry.ts"],"sourcesContent":["import type { ExtensionFactory } from '@earendil-works/pi-coding-agent';\n\nexport type BuiltinExtensionRuntimeMode =\n\t| 'interactive'\n\t| 'print'\n\t| 'json'\n\t| 'rpc';\n\ntype BuiltinExtensionLoader = () => Promise<ExtensionFactory>;\n\nexport interface BuiltinExtensionManifestEntry {\n\tkey: string;\n\tlabel: string;\n\tdocs_label: string;\n\tdescription: string;\n\tdefault_enabled: boolean;\n\toption_name: string;\n\tcli_arg: string;\n\tcli_flag: `--${string}`;\n\tcli_description: string;\n\taliases: readonly string[];\n\tmode_constraints?: {\n\t\tdisabled_in: readonly BuiltinExtensionRuntimeMode[];\n\t\treason: string;\n\t};\n\texternal_package_name?: string;\n\tload: BuiltinExtensionLoader;\n}\n\nexport const BUILTIN_EXTENSION_REGISTRY = [\n\t{\n\t\tkey: 'context-sidecar',\n\t\tlabel: 'Context sidecar',\n\t\tdocs_label: 'SQLite context sidecar',\n\t\tdescription: 'Local SQLite FTS sidecar for oversized tool output',\n\t\tdefault_enabled: true,\n\t\toption_name: 'context_sidecar',\n\t\tcli_arg: 'no-context-sidecar',\n\t\tcli_flag: '--no-context-sidecar',\n\t\tcli_description:\n\t\t\t'Disable SQLite context sidecar for large tool output',\n\t\taliases: ['context-sidecar', 'context', 'sidecar'],\n\t\texternal_package_name: '@spences10/pi-context',\n\t\tload: async () => (await import('@spences10/pi-context')).default,\n\t},\n\t{\n\t\tkey: 'mcp',\n\t\tlabel: 'MCP',\n\t\tdocs_label: 'MCP',\n\t\tdescription: 'MCP server integration and /mcp command',\n\t\tdefault_enabled: true,\n\t\toption_name: 'mcp',\n\t\tcli_arg: 'no-mcp',\n\t\tcli_flag: '--no-mcp',\n\t\tcli_description: 'Disable built-in MCP extension',\n\t\taliases: ['mcp'],\n\t\texternal_package_name: '@spences10/pi-mcp',\n\t\tload: async () => (await import('@spences10/pi-mcp')).default,\n\t},\n\t{\n\t\tkey: 'openrouter-fusion-config',\n\t\tlabel: 'OpenRouter Fusion config',\n\t\tdocs_label: 'OpenRouter Fusion config guard',\n\t\tdescription:\n\t\t\t'Keeps OpenRouter Fusion off Anthropic by injecting a non-Anthropic panel and judge',\n\t\tdefault_enabled: true,\n\t\toption_name: 'openrouter_fusion_config',\n\t\tcli_arg: 'no-openrouter-fusion-config',\n\t\tcli_flag: '--no-openrouter-fusion-config',\n\t\tcli_description: 'Disable OpenRouter Fusion non-Anthropic config',\n\t\taliases: ['openrouter-fusion-config', 'fusion-budget'],\n\t\tload: async () =>\n\t\t\t(await import('./openrouter-fusion-config/index.js')).default,\n\t},\n\t{\n\t\tkey: 'umans-provider',\n\t\tlabel: 'Umans provider',\n\t\tdocs_label: 'Umans provider',\n\t\tdescription:\n\t\t\t'Umans.ai Anthropic Messages provider with API key login support',\n\t\tdefault_enabled: true,\n\t\toption_name: 'umans_provider',\n\t\tcli_arg: 'no-umans-provider',\n\t\tcli_flag: '--no-umans-provider',\n\t\tcli_description: 'Disable built-in Umans provider',\n\t\taliases: ['umans-provider', 'umans'],\n\t\tload: async () =>\n\t\t\t(await import('./umans-provider/index.js')).default,\n\t},\n\t{\n\t\tkey: 'footer',\n\t\tlabel: 'Footer',\n\t\tdocs_label: 'Footer',\n\t\tdescription: 'Configurable interactive footer/statusline',\n\t\tdefault_enabled: true,\n\t\toption_name: 'footer',\n\t\tcli_arg: 'no-footer',\n\t\tcli_flag: '--no-footer',\n\t\tcli_description: 'Disable custom footer/statusline',\n\t\taliases: ['footer', 'statusline', 'status-line'],\n\t\tmode_constraints: {\n\t\t\tdisabled_in: ['print', 'json', 'rpc'],\n\t\t\treason: 'Footer only renders in the interactive TUI',\n\t\t},\n\t\tload: async () => (await import('./footer/index.js')).default,\n\t},\n\t{\n\t\tkey: 'codex-usage',\n\t\tlabel: 'Codex usage',\n\t\tdocs_label: 'Codex usage status',\n\t\tdescription: 'OpenAI Codex usage status for the footer',\n\t\tdefault_enabled: true,\n\t\toption_name: 'codex_usage',\n\t\tcli_arg: 'no-codex-usage',\n\t\tcli_flag: '--no-codex-usage',\n\t\tcli_description: 'Disable Codex usage footer status',\n\t\taliases: ['codex-usage', 'codex-status'],\n\t\texternal_package_name: '@spences10/pi-codex-usage',\n\t\tload: async () =>\n\t\t\t(await import('@spences10/pi-codex-usage')).default,\n\t},\n\t{\n\t\tkey: 'harness',\n\t\tlabel: 'Harness',\n\t\tdocs_label: 'Task harness runtime',\n\t\tdescription:\n\t\t\t'Ephemeral /tmp task harness runtime with tools, enforcement, and bundled skills',\n\t\tdefault_enabled: true,\n\t\toption_name: 'harness',\n\t\tcli_arg: 'no-harness',\n\t\tcli_flag: '--no-harness',\n\t\tcli_description: 'Disable task harness runtime',\n\t\taliases: ['harness', 'task-harness'],\n\t\texternal_package_name: '@spences10/pi-harness',\n\t\tload: async () => (await import('@spences10/pi-harness')).default,\n\t},\n\t{\n\t\tkey: 'factory',\n\t\tlabel: 'Software factory (experimental)',\n\t\tdocs_label: 'Experimental software-factory control plane',\n\t\tdescription:\n\t\t\t'Paused experimental workflow control plane; enable explicitly for Factory v1 evaluation only',\n\t\tdefault_enabled: false,\n\t\toption_name: 'factory',\n\t\tcli_arg: 'no-factory',\n\t\tcli_flag: '--no-factory',\n\t\tcli_description: 'Disable software-factory control plane',\n\t\taliases: ['factory', 'software-factory', 'control-plane'],\n\t\texternal_package_name: '@spences10/pi-factory',\n\t\tload: async () => (await import('@spences10/pi-factory')).default,\n\t},\n\t{\n\t\tkey: 'skills',\n\t\tlabel: 'Skills',\n\t\tdocs_label: 'Skills',\n\t\tdescription: 'Managed pi-native skills and /skills command',\n\t\tdefault_enabled: true,\n\t\toption_name: 'skills',\n\t\tcli_arg: 'no-skills',\n\t\tcli_flag: '--no-skills',\n\t\tcli_description: 'Disable built-in skills extension',\n\t\taliases: ['skills', 'skill'],\n\t\texternal_package_name: '@spences10/pi-skills',\n\t\tload: async () => (await import('@spences10/pi-skills')).default,\n\t},\n\t{\n\t\tkey: 'skill-importer',\n\t\tlabel: 'Skill importer',\n\t\tdocs_label: 'Skill importer',\n\t\tdescription:\n\t\t\t'Import external Claude/plugin skills into Pi-native storage',\n\t\tdefault_enabled: true,\n\t\toption_name: 'skill_importer',\n\t\tcli_arg: 'no-skill-importer',\n\t\tcli_flag: '--no-skill-importer',\n\t\tcli_description: 'Disable external skill importer extension',\n\t\taliases: ['skill-importer', 'import-skills', 'skill-import'],\n\t\texternal_package_name: '@spences10/pi-skill-importer',\n\t\tload: async () =>\n\t\t\t(await import('@spences10/pi-skill-importer')).default,\n\t},\n\t{\n\t\tkey: 'filter-output',\n\t\tlabel: 'Secret redaction',\n\t\tdocs_label: 'Secret redaction',\n\t\tdescription:\n\t\t\t'Redacts secrets from tool output before the model sees them',\n\t\tdefault_enabled: true,\n\t\toption_name: 'filter_output',\n\t\tcli_arg: 'no-filter',\n\t\tcli_flag: '--no-filter',\n\t\tcli_description: 'Disable secret redaction in tool output',\n\t\taliases: [\n\t\t\t'filter-output',\n\t\t\t'filter_output',\n\t\t\t'filter',\n\t\t\t'redaction',\n\t\t\t'secret-redaction',\n\t\t\t'output-redaction',\n\t\t],\n\t\texternal_package_name: '@spences10/pi-redact',\n\t\tload: async () => (await import('@spences10/pi-redact')).default,\n\t},\n\t{\n\t\tkey: 'recall',\n\t\tlabel: 'Recall',\n\t\tdocs_label: 'Recall',\n\t\tdescription: 'pirecall reminder and background session sync',\n\t\tdefault_enabled: true,\n\t\toption_name: 'recall',\n\t\tcli_arg: 'no-recall',\n\t\tcli_flag: '--no-recall',\n\t\tcli_description: 'Disable recall extension',\n\t\taliases: ['recall', 'pirecall'],\n\t\texternal_package_name: '@spences10/pi-recall',\n\t\tload: async () => (await import('@spences10/pi-recall')).default,\n\t},\n\t{\n\t\tkey: 'nopeek',\n\t\tlabel: 'Nopeek',\n\t\tdocs_label: 'Nopeek',\n\t\tdescription:\n\t\t\t'nopeek reminder for secret-safe environment loading',\n\t\tdefault_enabled: true,\n\t\toption_name: 'nopeek',\n\t\tcli_arg: 'no-nopeek',\n\t\tcli_flag: '--no-nopeek',\n\t\tcli_description: 'Disable nopeek reminder extension',\n\t\taliases: ['nopeek', 'secrets', 'secret-loading'],\n\t\texternal_package_name: '@spences10/pi-nopeek',\n\t\tload: async () => (await import('@spences10/pi-nopeek')).default,\n\t},\n\t{\n\t\tkey: 'observability',\n\t\tlabel: 'Observability',\n\t\tdocs_label: 'Live observability',\n\t\tdescription:\n\t\t\t'Optional live event stream and local browser dashboard',\n\t\tdefault_enabled: true,\n\t\toption_name: 'observability',\n\t\tcli_arg: 'no-observability',\n\t\tcli_flag: '--no-observability',\n\t\tcli_description: 'Disable live observability extension',\n\t\taliases: ['observability', 'obs', 'live-events'],\n\t\texternal_package_name: '@spences10/pi-observability',\n\t\tload: async () =>\n\t\t\t(await import('@spences10/pi-observability')).default,\n\t},\n\t{\n\t\tkey: 'omnisearch',\n\t\tlabel: 'Omnisearch',\n\t\tdocs_label: 'Omnisearch',\n\t\tdescription: 'mcp-omnisearch reminder for verified web research',\n\t\tdefault_enabled: true,\n\t\toption_name: 'omnisearch',\n\t\tcli_arg: 'no-omnisearch',\n\t\tcli_flag: '--no-omnisearch',\n\t\tcli_description: 'Disable mcp-omnisearch reminder extension',\n\t\taliases: ['omnisearch', 'search', 'web-search', 'research'],\n\t\texternal_package_name: '@spences10/pi-omnisearch',\n\t\tload: async () =>\n\t\t\t(await import('@spences10/pi-omnisearch')).default,\n\t},\n\t{\n\t\tkey: 'sqlite-tools',\n\t\tlabel: 'SQLite tools',\n\t\tdocs_label: 'SQLite tools',\n\t\tdescription:\n\t\t\t'mcp-sqlite-tools reminder for safer SQLite database work',\n\t\tdefault_enabled: true,\n\t\toption_name: 'sqlite_tools',\n\t\tcli_arg: 'no-sqlite-tools',\n\t\tcli_flag: '--no-sqlite-tools',\n\t\tcli_description: 'Disable mcp-sqlite-tools reminder extension',\n\t\taliases: ['sqlite-tools', 'sqlite', 'mcp-sqlite-tools'],\n\t\texternal_package_name: '@spences10/pi-sqlite-tools',\n\t\tload: async () =>\n\t\t\t(await import('@spences10/pi-sqlite-tools')).default,\n\t},\n\t{\n\t\tkey: 'startup-screen',\n\t\tlabel: 'Startup screen',\n\t\tdocs_label: 'Startup screen',\n\t\tdescription:\n\t\t\t'Pixel-art gradient startup header for interactive sessions',\n\t\tdefault_enabled: true,\n\t\toption_name: 'startup_screen',\n\t\tcli_arg: 'no-startup-screen',\n\t\tcli_flag: '--no-startup-screen',\n\t\tcli_description: 'Disable the custom startup screen',\n\t\taliases: ['startup-screen', 'startup', 'header', 'splash'],\n\t\tmode_constraints: {\n\t\t\tdisabled_in: ['print', 'json', 'rpc'],\n\t\t\treason: 'Startup screen only renders in the interactive TUI',\n\t\t},\n\t\tload: async () =>\n\t\t\t(await import('./startup-screen/index.js')).default,\n\t},\n\t{\n\t\tkey: 'prompt-presets',\n\t\tlabel: 'Prompt presets',\n\t\tdocs_label: 'Prompt presets',\n\t\tdescription:\n\t\t\t'Runtime prompt preset selection and /prompt-preset command',\n\t\tdefault_enabled: true,\n\t\toption_name: 'prompt_presets',\n\t\tcli_arg: 'no-prompt-presets',\n\t\tcli_flag: '--no-prompt-presets',\n\t\tcli_description: 'Disable prompt presets extension',\n\t\taliases: ['prompt-preset', 'preset', 'presets'],\n\t\tload: async () =>\n\t\t\t(await import('./prompt-presets/index.js')).default,\n\t},\n\t{\n\t\tkey: 'turn-timer',\n\t\tlabel: 'Turn timer',\n\t\tdocs_label: 'Turn timer',\n\t\tdescription:\n\t\t\t'Live elapsed timer beside the working spinner with persisted turn durations',\n\t\tdefault_enabled: true,\n\t\toption_name: 'turn_timer',\n\t\tcli_arg: 'no-turn-timer',\n\t\tcli_flag: '--no-turn-timer',\n\t\tcli_description: 'Disable the working spinner turn timer',\n\t\taliases: ['turn-timer', 'timer', 'elapsed-time'],\n\t\tmode_constraints: {\n\t\t\tdisabled_in: ['print', 'json', 'rpc'],\n\t\t\treason: 'The live timer is only useful in the interactive TUI',\n\t\t},\n\t\tload: async () => (await import('./turn-timer/index.js')).default,\n\t},\n\t{\n\t\tkey: 'git-ui',\n\t\tlabel: 'Git UI',\n\t\tdocs_label: 'Git staging UI',\n\t\tdescription: 'Interactive source control staging panel',\n\t\tdefault_enabled: true,\n\t\toption_name: 'git_ui',\n\t\tcli_arg: 'no-git-ui',\n\t\tcli_flag: '--no-git-ui',\n\t\tcli_description: 'Disable built-in Git staging UI',\n\t\taliases: ['git-ui', 'git', 'source-control', 'scm'],\n\t\tmode_constraints: {\n\t\t\tdisabled_in: ['print', 'json', 'rpc'],\n\t\t\treason: 'Git UI is only useful in interactive mode',\n\t\t},\n\t\texternal_package_name: '@spences10/pi-git-ui',\n\t\tload: async () => (await import('@spences10/pi-git-ui')).default,\n\t},\n\t{\n\t\tkey: 'lsp',\n\t\tlabel: 'LSP',\n\t\tdocs_label: 'LSP',\n\t\tdescription:\n\t\t\t'Language Server Protocol tools (diagnostics, hover, definition, references)',\n\t\tdefault_enabled: true,\n\t\toption_name: 'lsp',\n\t\tcli_arg: 'no-lsp',\n\t\tcli_flag: '--no-lsp',\n\t\tcli_description: 'Disable LSP extension',\n\t\taliases: ['lsp', 'language-server'],\n\t\texternal_package_name: '@spences10/pi-lsp',\n\t\tload: async () => (await import('@spences10/pi-lsp')).default,\n\t},\n\t{\n\t\tkey: 'session-name',\n\t\tlabel: 'Session name',\n\t\tdocs_label: 'Session auto-naming',\n\t\tdescription:\n\t\t\t'AI-powered session auto-naming and /session-name command',\n\t\tdefault_enabled: true,\n\t\toption_name: 'session_name',\n\t\tcli_arg: 'no-session-name',\n\t\tcli_flag: '--no-session-name',\n\t\tcli_description: 'Disable session name extension',\n\t\taliases: ['session-name', 'session', 'auto-name'],\n\t\tmode_constraints: {\n\t\t\tdisabled_in: ['print', 'json', 'rpc'],\n\t\t\treason:\n\t\t\t\t'UI-only session naming is only useful in interactive mode',\n\t\t},\n\t\tload: async () =>\n\t\t\t(await import('./session-name/index.js')).default,\n\t},\n\t{\n\t\tkey: 'confirm-destructive',\n\t\tlabel: 'Confirm destructive',\n\t\tdocs_label: 'Destructive action confirmation',\n\t\tdescription:\n\t\t\t'Prompt before destructive tool calls like file deletes, overwrites, and hard resets',\n\t\tdefault_enabled: true,\n\t\toption_name: 'confirm_destructive',\n\t\tcli_arg: 'no-confirm-destructive',\n\t\tcli_flag: '--no-confirm-destructive',\n\t\tcli_description: 'Disable destructive action confirmations',\n\t\taliases: ['confirm-destructive', 'confirm'],\n\t\texternal_package_name: '@spences10/pi-confirm-destructive',\n\t\tload: async () =>\n\t\t\t(await import('@spences10/pi-confirm-destructive')).default,\n\t},\n\t{\n\t\tkey: 'hooks-resolution',\n\t\tlabel: 'Hooks resolution',\n\t\tdocs_label: 'Hooks resolution',\n\t\tdescription:\n\t\t\t'Claude Code style PreToolUse and PostToolUse hook compatibility from .claude, .rulesync, and .pi configs',\n\t\tdefault_enabled: true,\n\t\toption_name: 'hooks_resolution',\n\t\tcli_arg: 'no-hooks',\n\t\tcli_flag: '--no-hooks',\n\t\tcli_description: 'Disable Claude-style hook execution',\n\t\taliases: ['hooks-resolution', 'hooks'],\n\t\tload: async () =>\n\t\t\t(await import('./hooks-resolution/index.js')).default,\n\t},\n\t{\n\t\tkey: 'svelte-guardrails',\n\t\tlabel: 'Svelte guardrails',\n\t\tdocs_label: 'Svelte guardrails',\n\t\tdescription:\n\t\t\t'Blocks discouraged Svelte patterns like $effect before agents write them',\n\t\tdefault_enabled: true,\n\t\toption_name: 'svelte_guardrails',\n\t\tcli_arg: 'no-svelte-guardrails',\n\t\tcli_flag: '--no-svelte-guardrails',\n\t\tcli_description: 'Disable Svelte guardrails',\n\t\taliases: ['svelte-guardrails', 'svelte'],\n\t\texternal_package_name: '@spences10/pi-svelte-guardrails',\n\t\tload: async () =>\n\t\t\t(await import('@spences10/pi-svelte-guardrails')).default,\n\t},\n\t{\n\t\tkey: 'coding-preferences',\n\t\tlabel: 'Coding preferences',\n\t\tdocs_label: 'Coding preferences',\n\t\tdescription:\n\t\t\t'Blocks configured coding workflow anti-patterns from JSON preferences',\n\t\tdefault_enabled: true,\n\t\toption_name: 'coding_preferences',\n\t\tcli_arg: 'no-coding-preferences',\n\t\tcli_flag: '--no-coding-preferences',\n\t\tcli_description: 'Disable coding preferences guardrails',\n\t\taliases: ['coding-preferences', 'preferences', 'prefs'],\n\t\texternal_package_name: '@spences10/pi-coding-preferences',\n\t\tload: async () =>\n\t\t\t(await import('@spences10/pi-coding-preferences')).default,\n\t},\n\t{\n\t\tkey: 'handoff',\n\t\tlabel: 'Handoff',\n\t\tdocs_label: 'Handoff',\n\t\tdescription:\n\t\t\t'Help command for Pi continuation primitives like /fork, /tree, /export, /import, and /share',\n\t\tdefault_enabled: true,\n\t\toption_name: 'handoff',\n\t\tcli_arg: 'no-handoff',\n\t\tcli_flag: '--no-handoff',\n\t\tcli_description: 'Disable handoff helper command',\n\t\taliases: ['handoff', 'continuation'],\n\t\tload: async () => (await import('./handoff/index.js')).default,\n\t},\n\t{\n\t\tkey: 'team-mode',\n\t\tlabel: 'Team mode',\n\t\tdocs_label: 'Team mode',\n\t\tdescription:\n\t\t\t'Peer coordination between independently opened Pi sessions with groups, artifacts, and durable mailboxes',\n\t\tdefault_enabled: true,\n\t\toption_name: 'team_mode',\n\t\tcli_arg: 'no-team-mode',\n\t\tcli_flag: '--no-team-mode',\n\t\tcli_description: 'Disable peer-session team mode extension',\n\t\taliases: ['team-mode', 'team', 'teammates'],\n\t\texternal_package_name: '@spences10/pi-team-mode',\n\t\tload: async () =>\n\t\t\t(await import('@spences10/pi-team-mode')).default,\n\t},\n] as const satisfies readonly BuiltinExtensionManifestEntry[];\n\nexport type BuiltinExtensionKey =\n\t(typeof BUILTIN_EXTENSION_REGISTRY)[number]['key'];\n\nexport type BuiltinExtensionOptionName =\n\t(typeof BUILTIN_EXTENSION_REGISTRY)[number]['option_name'];\n\nexport type BuiltinExtensionInfo = Omit<\n\tBuiltinExtensionManifestEntry,\n\t'load'\n> & {\n\tkey: BuiltinExtensionKey;\n\toption_name: BuiltinExtensionOptionName;\n};\n\nexport const BUILTIN_EXTENSIONS: BuiltinExtensionInfo[] =\n\tBUILTIN_EXTENSION_REGISTRY.map(\n\t\t({ load: _load, ...extension }) => extension,\n\t);\n"],"mappings":";AA6BA,MAAa,6BAA6B;CACzC;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aAAa;EACb,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBACC;EACD,SAAS;GAAC;GAAmB;GAAW;EAAS;EACjD,uBAAuB;EACvB,MAAM,aAAa,MAAM,OAAO,yBAAA,CAA0B;CAC3D;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aAAa;EACb,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS,CAAC,KAAK;EACf,uBAAuB;EACvB,MAAM,aAAa,MAAM,OAAO,qBAAA,CAAsB;CACvD;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aACC;EACD,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS,CAAC,4BAA4B,eAAe;EACrD,MAAM,aACJ,MAAM,OAAO,0CAAA,CAAwC;CACxD;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aACC;EACD,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS,CAAC,kBAAkB,OAAO;EACnC,MAAM,aACJ,MAAM,OAAO,gCAAA,CAA8B;CAC9C;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aAAa;EACb,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS;GAAC;GAAU;GAAc;EAAa;EAC/C,kBAAkB;GACjB,aAAa;IAAC;IAAS;IAAQ;GAAK;GACpC,QAAQ;EACT;EACA,MAAM,aAAa,MAAM,OAAO,wBAAA,CAAsB;CACvD;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aAAa;EACb,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS,CAAC,eAAe,cAAc;EACvC,uBAAuB;EACvB,MAAM,aACJ,MAAM,OAAO,6BAAA,CAA8B;CAC9C;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aACC;EACD,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS,CAAC,WAAW,cAAc;EACnC,uBAAuB;EACvB,MAAM,aAAa,MAAM,OAAO,yBAAA,CAA0B;CAC3D;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aACC;EACD,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS;GAAC;GAAW;GAAoB;EAAe;EACxD,uBAAuB;EACvB,MAAM,aAAa,MAAM,OAAO,yBAAA,CAA0B;CAC3D;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aAAa;EACb,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS,CAAC,UAAU,OAAO;EAC3B,uBAAuB;EACvB,MAAM,aAAa,MAAM,OAAO,wBAAA,CAAyB;CAC1D;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aACC;EACD,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS;GAAC;GAAkB;GAAiB;EAAc;EAC3D,uBAAuB;EACvB,MAAM,aACJ,MAAM,OAAO,gCAAA,CAAiC;CACjD;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aACC;EACD,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS;GACR;GACA;GACA;GACA;GACA;GACA;EACD;EACA,uBAAuB;EACvB,MAAM,aAAa,MAAM,OAAO,wBAAA,CAAyB;CAC1D;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aAAa;EACb,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS,CAAC,UAAU,UAAU;EAC9B,uBAAuB;EACvB,MAAM,aAAa,MAAM,OAAO,wBAAA,CAAyB;CAC1D;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aACC;EACD,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS;GAAC;GAAU;GAAW;EAAgB;EAC/C,uBAAuB;EACvB,MAAM,aAAa,MAAM,OAAO,wBAAA,CAAyB;CAC1D;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aACC;EACD,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS;GAAC;GAAiB;GAAO;EAAa;EAC/C,uBAAuB;EACvB,MAAM,aACJ,MAAM,OAAO,+BAAA,CAAgC;CAChD;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aAAa;EACb,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS;GAAC;GAAc;GAAU;GAAc;EAAU;EAC1D,uBAAuB;EACvB,MAAM,aACJ,MAAM,OAAO,4BAAA,CAA6B;CAC7C;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aACC;EACD,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS;GAAC;GAAgB;GAAU;EAAkB;EACtD,uBAAuB;EACvB,MAAM,aACJ,MAAM,OAAO,8BAAA,CAA+B;CAC/C;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aACC;EACD,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS;GAAC;GAAkB;GAAW;GAAU;EAAQ;EACzD,kBAAkB;GACjB,aAAa;IAAC;IAAS;IAAQ;GAAK;GACpC,QAAQ;EACT;EACA,MAAM,aACJ,MAAM,OAAO,gCAAA,CAA8B;CAC9C;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aACC;EACD,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS;GAAC;GAAiB;GAAU;EAAS;EAC9C,MAAM,aACJ,MAAM,OAAO,gCAAA,CAA8B;CAC9C;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aACC;EACD,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS;GAAC;GAAc;GAAS;EAAc;EAC/C,kBAAkB;GACjB,aAAa;IAAC;IAAS;IAAQ;GAAK;GACpC,QAAQ;EACT;EACA,MAAM,aAAa,MAAM,OAAO,4BAAA,CAA0B;CAC3D;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aAAa;EACb,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS;GAAC;GAAU;GAAO;GAAkB;EAAK;EAClD,kBAAkB;GACjB,aAAa;IAAC;IAAS;IAAQ;GAAK;GACpC,QAAQ;EACT;EACA,uBAAuB;EACvB,MAAM,aAAa,MAAM,OAAO,wBAAA,CAAyB;CAC1D;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aACC;EACD,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS,CAAC,OAAO,iBAAiB;EAClC,uBAAuB;EACvB,MAAM,aAAa,MAAM,OAAO,qBAAA,CAAsB;CACvD;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aACC;EACD,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS;GAAC;GAAgB;GAAW;EAAW;EAChD,kBAAkB;GACjB,aAAa;IAAC;IAAS;IAAQ;GAAK;GACpC,QACC;EACF;EACA,MAAM,aACJ,MAAM,OAAO,8BAAA,CAA4B;CAC5C;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aACC;EACD,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS,CAAC,uBAAuB,SAAS;EAC1C,uBAAuB;EACvB,MAAM,aACJ,MAAM,OAAO,qCAAA,CAAsC;CACtD;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aACC;EACD,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS,CAAC,oBAAoB,OAAO;EACrC,MAAM,aACJ,MAAM,OAAO,kCAAA,CAAgC;CAChD;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aACC;EACD,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS,CAAC,qBAAqB,QAAQ;EACvC,uBAAuB;EACvB,MAAM,aACJ,MAAM,OAAO,mCAAA,CAAoC;CACpD;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aACC;EACD,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS;GAAC;GAAsB;GAAe;EAAO;EACtD,uBAAuB;EACvB,MAAM,aACJ,MAAM,OAAO,oCAAA,CAAqC;CACrD;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aACC;EACD,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS,CAAC,WAAW,cAAc;EACnC,MAAM,aAAa,MAAM,OAAO,yBAAA,CAAuB;CACxD;CACA;EACC,KAAK;EACL,OAAO;EACP,YAAY;EACZ,aACC;EACD,iBAAiB;EACjB,aAAa;EACb,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,SAAS;GAAC;GAAa;GAAQ;EAAW;EAC1C,uBAAuB;EACvB,MAAM,aACJ,MAAM,OAAO,2BAAA,CAA4B;CAC5C;AACD;AAgBA,MAAa,qBACZ,2BAA2B,KACzB,EAAE,MAAM,OAAO,GAAG,gBAAgB,SACpC"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as BUILTIN_EXTENSIONS } from "./builtin-registry-CFKfijEc.js";
2
+ import { t as BUILTIN_EXTENSIONS } from "./builtin-registry-BFjcVSDi.js";
3
3
  import { defineCommand, renderUsage, runMain } from "citty";
4
4
  import { existsSync, readFileSync } from "node:fs";
5
5
  import { dirname, join, resolve } from "node:path";
@@ -0,0 +1,64 @@
1
+ import { Text } from "@earendil-works/pi-tui";
2
+ //#region src/extensions/turn-timer/index.ts
3
+ const TURN_TIMER_ENTRY = "turn-timer";
4
+ function format_clock(duration_ms) {
5
+ const total_seconds = Math.max(0, Math.floor(duration_ms / 1e3));
6
+ const hours = Math.floor(total_seconds / 3600);
7
+ const minutes = Math.floor(total_seconds % 3600 / 60);
8
+ const seconds = total_seconds % 60;
9
+ return hours > 0 ? `${hours.toString().padStart(2, "0")}:${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}` : `${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`;
10
+ }
11
+ function format_duration(duration_ms) {
12
+ if (duration_ms < 1e3) return `${Math.max(0, Math.round(duration_ms))}ms`;
13
+ if (duration_ms < 6e4) return `${(duration_ms / 1e3).toFixed(1)}s`;
14
+ return format_clock(duration_ms);
15
+ }
16
+ function turn_timer(pi) {
17
+ let started_at;
18
+ let refresh_timer;
19
+ let active_context;
20
+ const clear_timer = () => {
21
+ if (refresh_timer) clearInterval(refresh_timer);
22
+ refresh_timer = void 0;
23
+ };
24
+ const render_timer = () => {
25
+ if (started_at === void 0 || !active_context) return;
26
+ const timer = active_context.ui.theme.fg("success", format_clock(Date.now() - started_at));
27
+ active_context.ui.setWorkingMessage(`Working... ${timer}`);
28
+ };
29
+ const reset = () => {
30
+ clear_timer();
31
+ if (active_context?.mode === "tui") active_context.ui.setWorkingMessage(void 0);
32
+ started_at = void 0;
33
+ active_context = void 0;
34
+ };
35
+ pi.registerEntryRenderer(TURN_TIMER_ENTRY, (entry, _options, theme) => {
36
+ if (!entry.data || typeof entry.data.duration_ms !== "number" || !Number.isFinite(entry.data.duration_ms)) return;
37
+ return new Text(theme.fg("success", `⏱ Completed in ${format_duration(entry.data.duration_ms)}`), 0, 0);
38
+ });
39
+ pi.on("agent_start", async (_event, ctx) => {
40
+ if (started_at !== void 0) return;
41
+ started_at = Date.now();
42
+ active_context = ctx;
43
+ if (ctx.mode !== "tui") return;
44
+ render_timer();
45
+ refresh_timer = setInterval(render_timer, 1e3);
46
+ refresh_timer.unref?.();
47
+ });
48
+ pi.on("agent_settled", async () => {
49
+ if (started_at === void 0) return;
50
+ const duration_ms = Date.now() - started_at;
51
+ reset();
52
+ pi.appendEntry(TURN_TIMER_ENTRY, {
53
+ duration_ms,
54
+ completed_at: (/* @__PURE__ */ new Date()).toISOString()
55
+ });
56
+ });
57
+ pi.on("session_shutdown", async () => {
58
+ reset();
59
+ });
60
+ }
61
+ //#endregion
62
+ export { turn_timer as default };
63
+
64
+ //# sourceMappingURL=turn-timer-CoyDI4gQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-timer-CoyDI4gQ.js","names":[],"sources":["../src/extensions/turn-timer/index.ts"],"sourcesContent":["import type {\n\tExtensionAPI,\n\tExtensionContext,\n} from '@earendil-works/pi-coding-agent';\nimport { Text } from '@earendil-works/pi-tui';\n\nexport const TURN_TIMER_ENTRY = 'turn-timer';\nexport interface TurnTimerEntry {\n\tduration_ms: number;\n\tcompleted_at: string;\n}\n\nexport function format_clock(duration_ms: number): string {\n\tconst total_seconds = Math.max(0, Math.floor(duration_ms / 1_000));\n\tconst hours = Math.floor(total_seconds / 3_600);\n\tconst minutes = Math.floor((total_seconds % 3_600) / 60);\n\tconst seconds = total_seconds % 60;\n\n\treturn hours > 0\n\t\t? `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`\n\t\t: `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n}\n\nexport function format_duration(duration_ms: number): string {\n\tif (duration_ms < 1_000)\n\t\treturn `${Math.max(0, Math.round(duration_ms))}ms`;\n\tif (duration_ms < 60_000)\n\t\treturn `${(duration_ms / 1_000).toFixed(1)}s`;\n\treturn format_clock(duration_ms);\n}\n\nexport default function turn_timer(pi: ExtensionAPI): void {\n\tlet started_at: number | undefined;\n\tlet refresh_timer: NodeJS.Timeout | undefined;\n\tlet active_context: ExtensionContext | undefined;\n\n\tconst clear_timer = (): void => {\n\t\tif (refresh_timer) clearInterval(refresh_timer);\n\t\trefresh_timer = undefined;\n\t};\n\n\tconst render_timer = (): void => {\n\t\tif (started_at === undefined || !active_context) return;\n\t\tconst timer = active_context.ui.theme.fg(\n\t\t\t'success',\n\t\t\tformat_clock(Date.now() - started_at),\n\t\t);\n\t\tactive_context.ui.setWorkingMessage(`Working... ${timer}`);\n\t};\n\n\tconst reset = (): void => {\n\t\tclear_timer();\n\t\tif (active_context?.mode === 'tui') {\n\t\t\tactive_context.ui.setWorkingMessage(undefined);\n\t\t}\n\t\tstarted_at = undefined;\n\t\tactive_context = undefined;\n\t};\n\n\tpi.registerEntryRenderer<TurnTimerEntry>(\n\t\tTURN_TIMER_ENTRY,\n\t\t(entry, _options, theme) => {\n\t\t\tif (\n\t\t\t\t!entry.data ||\n\t\t\t\ttypeof entry.data.duration_ms !== 'number' ||\n\t\t\t\t!Number.isFinite(entry.data.duration_ms)\n\t\t\t) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn new Text(\n\t\t\t\ttheme.fg(\n\t\t\t\t\t'success',\n\t\t\t\t\t`⏱ Completed in ${format_duration(entry.data.duration_ms)}`,\n\t\t\t\t),\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t);\n\t\t},\n\t);\n\n\tpi.on('agent_start', async (_event, ctx) => {\n\t\tif (started_at !== undefined) return;\n\t\tstarted_at = Date.now();\n\t\tactive_context = ctx;\n\n\t\tif (ctx.mode !== 'tui') return;\n\t\trender_timer();\n\t\trefresh_timer = setInterval(render_timer, 1_000);\n\t\trefresh_timer.unref?.();\n\t});\n\n\tpi.on('agent_settled', async () => {\n\t\tif (started_at === undefined) return;\n\t\tconst duration_ms = Date.now() - started_at;\n\t\treset();\n\t\tpi.appendEntry<TurnTimerEntry>(TURN_TIMER_ENTRY, {\n\t\t\tduration_ms,\n\t\t\tcompleted_at: new Date().toISOString(),\n\t\t});\n\t});\n\n\tpi.on('session_shutdown', async () => {\n\t\treset();\n\t});\n}\n"],"mappings":";;AAMA,MAAa,mBAAmB;AAMhC,SAAgB,aAAa,aAA6B;CACzD,MAAM,gBAAgB,KAAK,IAAI,GAAG,KAAK,MAAM,cAAc,GAAK,CAAC;CACjE,MAAM,QAAQ,KAAK,MAAM,gBAAgB,IAAK;CAC9C,MAAM,UAAU,KAAK,MAAO,gBAAgB,OAAS,EAAE;CACvD,MAAM,UAAU,gBAAgB;CAEhC,OAAO,QAAQ,IACZ,GAAG,MAAM,SAAS,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE,GAAG,QAAQ,SAAS,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE,GAAG,QAAQ,SAAS,CAAC,CAAC,SAAS,GAAG,GAAG,MACjH,GAAG,QAAQ,SAAS,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE,GAAG,QAAQ,SAAS,CAAC,CAAC,SAAS,GAAG,GAAG;AAChF;AAEA,SAAgB,gBAAgB,aAA6B;CAC5D,IAAI,cAAc,KACjB,OAAO,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,WAAW,CAAC,EAAE;CAChD,IAAI,cAAc,KACjB,OAAO,IAAI,cAAc,IAAA,CAAO,QAAQ,CAAC,EAAE;CAC5C,OAAO,aAAa,WAAW;AAChC;AAEA,SAAwB,WAAW,IAAwB;CAC1D,IAAI;CACJ,IAAI;CACJ,IAAI;CAEJ,MAAM,oBAA0B;EAC/B,IAAI,eAAe,cAAc,aAAa;EAC9C,gBAAgB,KAAA;CACjB;CAEA,MAAM,qBAA2B;EAChC,IAAI,eAAe,KAAA,KAAa,CAAC,gBAAgB;EACjD,MAAM,QAAQ,eAAe,GAAG,MAAM,GACrC,WACA,aAAa,KAAK,IAAI,IAAI,UAAU,CACrC;EACA,eAAe,GAAG,kBAAkB,cAAc,OAAO;CAC1D;CAEA,MAAM,cAAoB;EACzB,YAAY;EACZ,IAAI,gBAAgB,SAAS,OAC5B,eAAe,GAAG,kBAAkB,KAAA,CAAS;EAE9C,aAAa,KAAA;EACb,iBAAiB,KAAA;CAClB;CAEA,GAAG,sBACF,mBACC,OAAO,UAAU,UAAU;EAC3B,IACC,CAAC,MAAM,QACP,OAAO,MAAM,KAAK,gBAAgB,YAClC,CAAC,OAAO,SAAS,MAAM,KAAK,WAAW,GAEvC;EAED,OAAO,IAAI,KACV,MAAM,GACL,WACA,kBAAkB,gBAAgB,MAAM,KAAK,WAAW,GACzD,GACA,GACA,CACD;CACD,CACD;CAEA,GAAG,GAAG,eAAe,OAAO,QAAQ,QAAQ;EAC3C,IAAI,eAAe,KAAA,GAAW;EAC9B,aAAa,KAAK,IAAI;EACtB,iBAAiB;EAEjB,IAAI,IAAI,SAAS,OAAO;EACxB,aAAa;EACb,gBAAgB,YAAY,cAAc,GAAK;EAC/C,cAAc,QAAQ;CACvB,CAAC;CAED,GAAG,GAAG,iBAAiB,YAAY;EAClC,IAAI,eAAe,KAAA,GAAW;EAC9B,MAAM,cAAc,KAAK,IAAI,IAAI;EACjC,MAAM;EACN,GAAG,YAA4B,kBAAkB;GAChD;GACA,+BAAc,IAAI,KAAK,EAAA,CAAE,YAAY;EACtC,CAAC;CACF,CAAC;CAED,GAAG,GAAG,oBAAoB,YAAY;EACrC,MAAM;CACP,CAAC;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "my-pi",
3
- "version": "0.1.119",
3
+ "version": "0.1.121",
4
4
  "description": "Composable pi coding agent with MCP, LSP, prompt presets, and local eval telemetry",
5
5
  "keywords": [
6
6
  "cli",
@@ -48,8 +48,8 @@
48
48
  "@earendil-works/pi-tui": "0.80.10",
49
49
  "citty": "^0.2.2",
50
50
  "@spences10/pi-project-trust": "0.0.19",
51
- "@spences10/pi-themes": "0.0.10",
52
51
  "@spences10/pi-settings": "0.0.3",
52
+ "@spences10/pi-themes": "0.0.10",
53
53
  "@spences10/pi-tui-modal": "0.0.24"
54
54
  },
55
55
  "devDependencies": {
@@ -62,26 +62,26 @@
62
62
  },
63
63
  "optionalDependencies": {
64
64
  "@spences10/pi-child-env": "0.1.9",
65
- "@spences10/pi-codex-usage": "0.0.1",
66
65
  "@spences10/pi-coding-preferences": "0.0.15",
67
66
  "@spences10/pi-confirm-destructive": "0.0.20",
68
- "@spences10/pi-factory": "0.0.9",
69
- "@spences10/pi-context": "0.1.12",
67
+ "@spences10/pi-codex-usage": "0.0.1",
68
+ "@spences10/pi-factory": "0.0.10",
70
69
  "@spences10/pi-git-ui": "0.0.16",
71
70
  "@spences10/pi-harness": "0.0.7",
71
+ "@spences10/pi-context": "0.1.12",
72
72
  "@spences10/pi-footer": "0.0.15",
73
- "@spences10/pi-mcp": "0.0.54",
74
73
  "@spences10/pi-lsp": "0.0.42",
75
- "@spences10/pi-nopeek": "0.0.15",
74
+ "@spences10/pi-mcp": "0.0.54",
76
75
  "@spences10/pi-observability": "0.0.22",
77
- "@spences10/pi-omnisearch": "0.0.15",
76
+ "@spences10/pi-nopeek": "0.0.15",
78
77
  "@spences10/pi-recall": "0.0.16",
78
+ "@spences10/pi-omnisearch": "0.0.15",
79
79
  "@spences10/pi-redact": "0.0.14",
80
80
  "@spences10/pi-skill-importer": "0.0.13",
81
- "@spences10/pi-skills": "0.0.36",
82
81
  "@spences10/pi-sqlite-tools": "0.0.15",
83
82
  "@spences10/pi-svelte-guardrails": "0.0.16",
84
- "@spences10/pi-team-mode": "0.0.53",
83
+ "@spences10/pi-skills": "0.0.36",
84
+ "@spences10/pi-team-mode": "0.0.54",
85
85
  "@spences10/pi-telemetry": "0.0.32"
86
86
  },
87
87
  "engines": {