my-pi 0.3.5 → 0.3.6
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 +0 -22
- package/dist/api.js +9 -16
- package/dist/api.js.map +1 -1
- package/dist/{builtin-registry-wSfsQBi4.js → builtin-registry-C0CQdd45.js} +10 -11
- package/dist/{builtin-registry-wSfsQBi4.js.map → builtin-registry-C0CQdd45.js.map} +1 -1
- package/dist/{handoff-C6wR2mSG.js → handoff-B2wpybTf.js} +2 -3
- package/dist/{handoff-C6wR2mSG.js.map → handoff-B2wpybTf.js.map} +1 -1
- package/dist/{hooks-resolution-qlhPfMFJ.js → hooks-resolution-kzoVsQAX.js} +8 -15
- package/dist/{hooks-resolution-qlhPfMFJ.js.map → hooks-resolution-kzoVsQAX.js.map} +1 -1
- package/dist/index.js +5 -9
- package/dist/index.js.map +1 -1
- package/dist/{openrouter-fusion-config-BWsHBPQv.js → openrouter-fusion-config-CPXLfmCA.js} +3 -4
- package/dist/{openrouter-fusion-config-BWsHBPQv.js.map → openrouter-fusion-config-CPXLfmCA.js.map} +1 -1
- package/dist/{prompt-presets-XraV03Ed.js → prompt-presets-DOn1oZFJ.js} +11 -21
- package/dist/{prompt-presets-XraV03Ed.js.map → prompt-presets-DOn1oZFJ.js.map} +1 -1
- package/dist/{session-name-CD6TVRnh.js → session-name-qyrX-OES.js} +2 -3
- package/dist/{session-name-CD6TVRnh.js.map → session-name-qyrX-OES.js.map} +1 -1
- package/dist/{settings-BCn3P9qH.js → settings-UYlhEo3S.js} +6 -11
- package/dist/{settings-BCn3P9qH.js.map → settings-UYlhEo3S.js.map} +1 -1
- package/dist/{startup-screen-DUeBWuAc.js → startup-screen-D5YGuwge.js} +2 -3
- package/dist/{startup-screen-DUeBWuAc.js.map → startup-screen-D5YGuwge.js.map} +1 -1
- package/dist/{turn-timer-CoyDI4gQ.js → turn-timer-mowT6nwv.js} +2 -3
- package/dist/{turn-timer-CoyDI4gQ.js.map → turn-timer-mowT6nwv.js.map} +1 -1
- package/dist/{umans-provider-C2UJ4qkO.js → umans-provider-DIupQTRK.js} +2 -3
- package/dist/{umans-provider-C2UJ4qkO.js.map → umans-provider-DIupQTRK.js.map} +1 -1
- package/package.json +10 -10
package/dist/api.d.ts
CHANGED
|
@@ -1,22 +1,11 @@
|
|
|
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
3
|
import "@spences10/pi-footer";
|
|
4
|
-
//#region src/extensions/startup-screen/index.d.ts
|
|
5
4
|
declare function startup_screen_extension(pi: ExtensionAPI): void;
|
|
6
|
-
//#endregion
|
|
7
|
-
//#region src/extensions/prompt-presets/index.d.ts
|
|
8
5
|
declare function prompt_presets(pi: ExtensionAPI): Promise<void>;
|
|
9
|
-
//#endregion
|
|
10
|
-
//#region src/extensions/turn-timer/index.d.ts
|
|
11
6
|
declare function turn_timer(pi: ExtensionAPI): void;
|
|
12
|
-
//#endregion
|
|
13
|
-
//#region src/extensions/session-name/index.d.ts
|
|
14
7
|
declare function session_name(pi: ExtensionAPI): Promise<void>;
|
|
15
|
-
//#endregion
|
|
16
|
-
//#region src/extensions/handoff/index.d.ts
|
|
17
8
|
declare function handoff(pi: ExtensionAPI): void;
|
|
18
|
-
//#endregion
|
|
19
|
-
//#region src/extensions/builtin-registry.d.ts
|
|
20
9
|
declare const BUILTIN_EXTENSION_REGISTRY: readonly [{
|
|
21
10
|
readonly key: 'context-sidecar';
|
|
22
11
|
readonly label: 'Context sidecar';
|
|
@@ -442,8 +431,6 @@ declare const BUILTIN_EXTENSION_REGISTRY: readonly [{
|
|
|
442
431
|
}];
|
|
443
432
|
type BuiltinExtensionKey = (typeof BUILTIN_EXTENSION_REGISTRY)[number]['key'];
|
|
444
433
|
type BuiltinExtensionOptionName = (typeof BUILTIN_EXTENSION_REGISTRY)[number]['option_name'];
|
|
445
|
-
//#endregion
|
|
446
|
-
//#region src/api/options.d.ts
|
|
447
434
|
type MyPiRuntimeMode = 'interactive' | 'print' | 'json' | 'rpc';
|
|
448
435
|
type MyPiThinkingLevel = NonNullable<CreateAgentSessionFromServicesOptions['thinkingLevel']>;
|
|
449
436
|
type BuiltinExtensionOptions = Partial<Record<BuiltinExtensionOptionName, boolean>>;
|
|
@@ -470,25 +457,16 @@ interface CreateMyPiOptions extends BuiltinExtensionOptions {
|
|
|
470
457
|
append_system_prompt?: string;
|
|
471
458
|
untrusted_repo?: boolean;
|
|
472
459
|
}
|
|
473
|
-
//#endregion
|
|
474
|
-
//#region src/api/builtin-extensions.d.ts
|
|
475
460
|
type BuiltinExtensionLoader = () => Promise<ExtensionFactory$1>;
|
|
476
461
|
export declare function get_force_disabled_builtins(options: Pick<CreateMyPiOptions, 'runtime_mode'> & BuiltinExtensionOptions): Set<BuiltinExtensionKey>;
|
|
477
462
|
export declare function get_externally_installed_builtin_extensions(agent_dir: string): Set<BuiltinExtensionKey>;
|
|
478
463
|
export declare function create_lazy_builtin_extension_factory(key: BuiltinExtensionKey, load_extension: BuiltinExtensionLoader, force_disabled: ReadonlySet<BuiltinExtensionKey>): ExtensionFactory$1;
|
|
479
|
-
//#endregion
|
|
480
|
-
//#region src/api/env.d.ts
|
|
481
464
|
export declare function apply_untrusted_repo_defaults(env?: NodeJS.ProcessEnv): string[];
|
|
482
|
-
//#endregion
|
|
483
|
-
//#region src/api/models.d.ts
|
|
484
465
|
interface ModelsLike {
|
|
485
466
|
getModels(): readonly Model<Api>[];
|
|
486
467
|
}
|
|
487
468
|
export declare function resolve_model_reference(model_reference: string | undefined, models_runtime: ModelsLike): Model<Api> | undefined;
|
|
488
469
|
export declare function resolve_effective_thinking_level(model: Model<Api> | undefined, thinking: MyPiThinkingLevel | undefined): MyPiThinkingLevel | undefined;
|
|
489
|
-
//#endregion
|
|
490
|
-
//#region src/api.d.ts
|
|
491
470
|
export declare function create_my_pi(options?: CreateMyPiOptions): Promise<import("@earendil-works/pi-coding-agent").AgentSessionRuntime>;
|
|
492
|
-
//#endregion
|
|
493
471
|
export { type AgentSessionRuntime, type CreateMyPiOptions, type ExtensionFactory, type InlineExtension, InteractiveMode, type InteractiveModeOptions, type MyPiRuntimeMode, type MyPiThinkingLevel, type PrintModeOptions, runPrintMode, runRpcMode };
|
|
494
472
|
//# sourceMappingURL=api.d.ts.map
|
package/dist/api.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { n as BUILTIN_EXTENSION_REGISTRY, t as BUILTIN_EXTENSIONS } from "./builtin-registry-
|
|
2
|
-
import { n as save_settings, t as load_settings } from "./settings-
|
|
1
|
+
import { n as BUILTIN_EXTENSION_REGISTRY, t as BUILTIN_EXTENSIONS } from "./builtin-registry-C0CQdd45.js";
|
|
2
|
+
import { n as save_settings, t as load_settings } from "./settings-UYlhEo3S.js";
|
|
3
3
|
import { createRequire } from "node:module";
|
|
4
4
|
import { existsSync, readdirSync } from "node:fs";
|
|
5
5
|
import { basename, dirname, isAbsolute, join, resolve } from "node:path";
|
|
@@ -7,7 +7,7 @@ import { InteractiveMode, SessionManager, createAgentSessionFromServices, create
|
|
|
7
7
|
import { apply_project_trust_untrusted_defaults } from "@spences10/pi-project-trust";
|
|
8
8
|
import { clampThinkingLevel } from "@earendil-works/pi-ai";
|
|
9
9
|
import { show_settings_modal } from "@spences10/pi-tui-modal";
|
|
10
|
-
|
|
10
|
+
// src/extensions/manager/config.ts
|
|
11
11
|
function load_builtin_extensions_config() {
|
|
12
12
|
const settings = load_settings();
|
|
13
13
|
const enabled = {};
|
|
@@ -57,8 +57,7 @@ function find_builtin_extension(query) {
|
|
|
57
57
|
...extension.aliases
|
|
58
58
|
].some((value) => value.toLowerCase() === normalized));
|
|
59
59
|
}
|
|
60
|
-
|
|
61
|
-
//#region src/api/builtin-extensions.ts
|
|
60
|
+
// src/api/builtin-extensions.ts
|
|
62
61
|
const require = createRequire(import.meta.url);
|
|
63
62
|
const PACKAGE_THEME_DIR = resolve(dirname(require.resolve("@spences10/pi-themes/package.json")), "themes");
|
|
64
63
|
const MANAGED_INLINE_EXTENSION_NAME_PREFIX = "my-pi-";
|
|
@@ -122,8 +121,7 @@ function create_extensions_override(managed_extension_paths) {
|
|
|
122
121
|
};
|
|
123
122
|
};
|
|
124
123
|
}
|
|
125
|
-
|
|
126
|
-
//#region src/api/env.ts
|
|
124
|
+
// src/api/env.ts
|
|
127
125
|
const PI_AGENT_DIR_ENV = "PI_CODING_AGENT_DIR";
|
|
128
126
|
const MY_PI_RUNTIME_MODE_ENV = "MY_PI_RUNTIME_MODE";
|
|
129
127
|
function snapshot_env(env, keys) {
|
|
@@ -181,8 +179,7 @@ function is_resource_enabled(value) {
|
|
|
181
179
|
function resolve_agent_dir(cwd, agent_dir) {
|
|
182
180
|
return agent_dir ? resolve(cwd, agent_dir) : getAgentDir();
|
|
183
181
|
}
|
|
184
|
-
|
|
185
|
-
//#region src/api/models.ts
|
|
182
|
+
// src/api/models.ts
|
|
186
183
|
function resolve_model_reference(model_reference, models_runtime) {
|
|
187
184
|
if (!model_reference) return void 0;
|
|
188
185
|
const models = models_runtime.getModels();
|
|
@@ -207,8 +204,7 @@ function resolve_effective_thinking_level(model, thinking) {
|
|
|
207
204
|
if (!thinking || !model) return thinking;
|
|
208
205
|
return clampThinkingLevel(model, thinking);
|
|
209
206
|
}
|
|
210
|
-
|
|
211
|
-
//#region src/api/session.ts
|
|
207
|
+
// src/api/session.ts
|
|
212
208
|
function resolve_session_file(cwd, session_dir, session_ref) {
|
|
213
209
|
if (!session_ref) return void 0;
|
|
214
210
|
const explicit_path = isAbsolute(session_ref) ? session_ref : resolve(cwd, session_ref);
|
|
@@ -227,8 +223,7 @@ function create_session_manager(options) {
|
|
|
227
223
|
if (options.startup_session_name && session_manager.getSessionName() !== options.startup_session_name) session_manager.appendSessionInfo(options.startup_session_name);
|
|
228
224
|
return session_manager;
|
|
229
225
|
}
|
|
230
|
-
|
|
231
|
-
//#region src/extensions/manager/index.ts
|
|
226
|
+
// src/extensions/manager/index.ts
|
|
232
227
|
const ENABLED = "● enabled";
|
|
233
228
|
const DISABLED = "○ disabled";
|
|
234
229
|
function to_force_disabled_set(force_disabled) {
|
|
@@ -402,8 +397,7 @@ function create_extensions_extension(options = {}) {
|
|
|
402
397
|
};
|
|
403
398
|
}
|
|
404
399
|
create_extensions_extension();
|
|
405
|
-
|
|
406
|
-
//#region src/api.ts
|
|
400
|
+
// src/api.ts
|
|
407
401
|
async function create_my_pi(options = {}) {
|
|
408
402
|
const { cwd = process.cwd(), agent_dir, extensions = [], extensionFactories: user_factories = [], extension_flag_values, runtime_mode = "interactive", telemetry, telemetry_db_path, model, thinking, selected_tools, excluded_tools, selected_skills, session, session_id, startup_session_name, session_dir, system_prompt, append_system_prompt, untrusted_repo = false } = options;
|
|
409
403
|
assert_unreserved_inline_extension_names(user_factories);
|
|
@@ -526,7 +520,6 @@ async function create_my_pi(options = {}) {
|
|
|
526
520
|
throw error;
|
|
527
521
|
}
|
|
528
522
|
}
|
|
529
|
-
//#endregion
|
|
530
523
|
export { InteractiveMode, apply_untrusted_repo_defaults, create_lazy_builtin_extension_factory, create_my_pi, get_externally_installed_builtin_extensions, get_force_disabled_builtins, resolve_effective_thinking_level, resolve_model_reference, runPrintMode, runRpcMode };
|
|
531
524
|
|
|
532
525
|
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","names":[],"sources":["../src/extensions/manager/config.ts","../src/api/builtin-extensions.ts","../src/api/env.ts","../src/api/models.ts","../src/api/session.ts","../src/extensions/manager/index.ts","../src/api.ts"],"sourcesContent":["import {\n\tBUILTIN_EXTENSIONS,\n\ttype BuiltinExtensionInfo,\n\ttype BuiltinExtensionKey,\n} from '../builtin-registry.js';\nimport {\n\tget_settings_path,\n\tload_settings,\n\tsave_settings,\n} from '../../settings/index.js';\n\nexport { BUILTIN_EXTENSIONS };\nexport type { BuiltinExtensionInfo, BuiltinExtensionKey };\n\nexport interface BuiltinExtensionsConfig {\n\tversion: number;\n\tenabled: Partial<Record<BuiltinExtensionKey, boolean>>;\n}\n\nexport interface BuiltinExtensionState extends BuiltinExtensionInfo {\n\tsaved_enabled: boolean;\n\teffective_enabled: boolean;\n\tforced_disabled: boolean;\n}\n\nexport function get_builtin_extensions_config_path(): string {\n\treturn get_settings_path();\n}\n\nexport function load_builtin_extensions_config(): BuiltinExtensionsConfig {\n\tconst settings = load_settings();\n\tconst enabled: BuiltinExtensionsConfig['enabled'] = {};\n\tfor (const extension of BUILTIN_EXTENSIONS) {\n\t\tconst value = settings.extensions.enabled[extension.key];\n\t\tif (typeof value === 'boolean') enabled[extension.key] = value;\n\t}\n\treturn { version: 1, enabled };\n}\n\nexport function save_builtin_extensions_config(\n\tconfig: BuiltinExtensionsConfig,\n): void {\n\tconst settings = load_settings();\n\tsave_settings({\n\t\t...settings,\n\t\textensions: {\n\t\t\t...settings.extensions,\n\t\t\tenabled: config.enabled,\n\t\t},\n\t});\n}\n\nexport function is_builtin_extension_enabled(\n\tconfig: BuiltinExtensionsConfig,\n\tkey: BuiltinExtensionKey,\n): boolean {\n\treturn config.enabled[key] ?? true;\n}\n\nexport function is_builtin_extension_active(\n\tconfig: BuiltinExtensionsConfig,\n\tkey: BuiltinExtensionKey,\n\tforce_disabled: ReadonlySet<BuiltinExtensionKey> = new Set(),\n): boolean {\n\treturn (\n\t\tis_builtin_extension_enabled(config, key) &&\n\t\t!force_disabled.has(key)\n\t);\n}\n\nexport function resolve_builtin_extension_states(\n\tforce_disabled: ReadonlySet<BuiltinExtensionKey> = new Set(),\n\tconfig: BuiltinExtensionsConfig = load_builtin_extensions_config(),\n): BuiltinExtensionState[] {\n\treturn BUILTIN_EXTENSIONS.map((extension) => {\n\t\tconst saved_enabled = is_builtin_extension_enabled(\n\t\t\tconfig,\n\t\t\textension.key,\n\t\t);\n\t\tconst forced = force_disabled.has(extension.key);\n\t\treturn {\n\t\t\t...extension,\n\t\t\tsaved_enabled,\n\t\t\teffective_enabled: saved_enabled && !forced,\n\t\t\tforced_disabled: forced,\n\t\t};\n\t});\n}\n\nexport function find_builtin_extension(\n\tquery: string,\n): BuiltinExtensionInfo | undefined {\n\tconst normalized = query.trim().toLowerCase();\n\tif (!normalized) return undefined;\n\n\treturn BUILTIN_EXTENSIONS.find((extension) =>\n\t\t[extension.key, extension.label, ...extension.aliases].some(\n\t\t\t(value) => value.toLowerCase() === normalized,\n\t\t),\n\t);\n}\n","import type {\n\tExtensionFactory,\n\tInlineExtension,\n\tLoadExtensionsResult,\n} from '@earendil-works/pi-coding-agent';\nimport { existsSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { dirname, join, resolve } from 'node:path';\nimport {\n\tBUILTIN_EXTENSION_REGISTRY,\n\ttype BuiltinExtensionKey,\n} from '../extensions/builtin-registry.js';\nimport {\n\tis_builtin_extension_active,\n\tload_builtin_extensions_config,\n} from '../extensions/manager/config.js';\nimport type {\n\tBuiltinExtensionOptions,\n\tCreateMyPiOptions,\n\tMyPiRuntimeMode,\n} from './options.js';\n\ntype BuiltinExtensionLoader = () => Promise<ExtensionFactory>;\n\nconst require = createRequire(import.meta.url);\nexport const PACKAGE_THEME_DIR = resolve(\n\tdirname(require.resolve('@spences10/pi-themes/package.json')),\n\t'themes',\n);\n\nexport const MANAGED_INLINE_EXTENSION_NAME_PREFIX = 'my-pi-';\n\nexport function assert_unreserved_inline_extension_names(\n\textensions: readonly InlineExtension[],\n): void {\n\tfor (const extension of extensions) {\n\t\tif (\n\t\t\ttypeof extension !== 'function' &&\n\t\t\textension.name.startsWith(MANAGED_INLINE_EXTENSION_NAME_PREFIX)\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t`Inline extension name \"${extension.name}\" is reserved for my-pi managed extensions; choose a name that does not start with \"${MANAGED_INLINE_EXTENSION_NAME_PREFIX}\".`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nexport function get_force_disabled_builtins(\n\toptions: Pick<CreateMyPiOptions, 'runtime_mode'> &\n\t\tBuiltinExtensionOptions,\n): Set<BuiltinExtensionKey> {\n\tconst force_disabled = new Set<BuiltinExtensionKey>();\n\tfor (const extension of BUILTIN_EXTENSION_REGISTRY) {\n\t\tconst enabled =\n\t\t\toptions[extension.option_name] ?? extension.default_enabled;\n\t\tif (!enabled) force_disabled.add(extension.key);\n\t\tconst disabled_in =\n\t\t\t'mode_constraints' in extension\n\t\t\t\t? extension.mode_constraints.disabled_in\n\t\t\t\t: undefined;\n\t\tif (\n\t\t\toptions.runtime_mode &&\n\t\t\t(\n\t\t\t\tdisabled_in as readonly MyPiRuntimeMode[] | undefined\n\t\t\t)?.includes(options.runtime_mode)\n\t\t) {\n\t\t\tforce_disabled.add(extension.key);\n\t\t}\n\t}\n\treturn force_disabled;\n}\n\nfunction is_agent_dir_package_installed(\n\tagent_dir: string,\n\tpackage_name: string,\n): boolean {\n\treturn existsSync(\n\t\tjoin(agent_dir, 'npm', 'node_modules', package_name),\n\t);\n}\n\nexport function get_externally_installed_builtin_extensions(\n\tagent_dir: string,\n): Set<BuiltinExtensionKey> {\n\tconst installed = new Set<BuiltinExtensionKey>();\n\tfor (const extension of BUILTIN_EXTENSION_REGISTRY) {\n\t\tconst external_package_name = (\n\t\t\textension as { external_package_name?: string }\n\t\t).external_package_name;\n\t\tif (\n\t\t\texternal_package_name &&\n\t\t\tis_agent_dir_package_installed(agent_dir, external_package_name)\n\t\t) {\n\t\t\tinstalled.add(extension.key);\n\t\t}\n\t}\n\treturn installed;\n}\n\nexport function warn_builtin_extension_unavailable(\n\tkey: BuiltinExtensionKey | 'telemetry',\n\terror: unknown,\n): void {\n\tconst reason =\n\t\terror instanceof Error ? error.message : String(error);\n\tprocess.emitWarning(\n\t\t`Built-in extension \"${key}\" is unavailable and was skipped: ${reason}`,\n\t\t{ code: 'MY_PI_BUILTIN_EXTENSION_UNAVAILABLE' },\n\t);\n}\n\nexport function create_lazy_builtin_extension_factory(\n\tkey: BuiltinExtensionKey,\n\tload_extension: BuiltinExtensionLoader,\n\tforce_disabled: ReadonlySet<BuiltinExtensionKey>,\n): ExtensionFactory {\n\treturn async (pi) => {\n\t\tconst config = load_builtin_extensions_config();\n\t\tif (!is_builtin_extension_active(config, key, force_disabled)) {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst extension = await load_extension();\n\t\t\tawait extension(pi);\n\t\t} catch (error) {\n\t\t\twarn_builtin_extension_unavailable(key, error);\n\t\t}\n\t};\n}\n\nexport function create_lazy_telemetry_extension(options: {\n\tenabled?: boolean;\n\tdb_path?: string;\n\tcwd?: string;\n}): ExtensionFactory {\n\treturn async (pi) => {\n\t\ttry {\n\t\t\tconst { create_telemetry_extension } =\n\t\t\t\tawait import('@spences10/pi-telemetry');\n\t\t\tawait create_telemetry_extension(options)(pi);\n\t\t} catch (error) {\n\t\t\twarn_builtin_extension_unavailable('telemetry', error);\n\t\t}\n\t};\n}\n\nexport function create_extensions_override(\n\tmanaged_extension_paths: readonly string[],\n): (base: LoadExtensionsResult) => LoadExtensionsResult {\n\treturn (base) => {\n\t\t// Pi names inline extensions but still loads discovered paths first.\n\t\t// Move only the first matching managed instance to preserve precedence.\n\t\tconst remaining = [...base.extensions];\n\t\tconst ordered_managed = managed_extension_paths.flatMap(\n\t\t\t(path) => {\n\t\t\t\tconst index = remaining.findIndex(\n\t\t\t\t\t(extension) => extension.path === path,\n\t\t\t\t);\n\t\t\t\treturn index === -1 ? [] : remaining.splice(index, 1);\n\t\t\t},\n\t\t);\n\t\treturn {\n\t\t\t...base,\n\t\t\textensions: [...ordered_managed, ...remaining],\n\t\t};\n\t};\n}\n","import { getAgentDir } from '@earendil-works/pi-coding-agent';\nimport { apply_project_trust_untrusted_defaults } from '@spences10/pi-project-trust';\nimport { resolve } from 'node:path';\n\nexport const PI_AGENT_DIR_ENV = 'PI_CODING_AGENT_DIR';\nexport const MY_PI_RUNTIME_MODE_ENV = 'MY_PI_RUNTIME_MODE';\n\ntype EnvSnapshot = Map<string, string | undefined>;\n\nexport function snapshot_env(\n\tenv: NodeJS.ProcessEnv,\n\tkeys: Iterable<string>,\n): EnvSnapshot {\n\treturn new Map(Array.from(keys, (key) => [key, env[key]]));\n}\n\nexport function restore_env(\n\tenv: NodeJS.ProcessEnv,\n\tsnapshot: EnvSnapshot,\n): void {\n\tfor (const [key, value] of snapshot) {\n\t\tif (value === undefined) delete env[key];\n\t\telse env[key] = value;\n\t}\n}\n\nexport function wrap_runtime_env_restore<\n\tT extends { dispose(): Promise<void> },\n>(runtime: T, restore: () => void): T {\n\tconst dispose = runtime.dispose.bind(runtime);\n\tlet restored = false;\n\tconst restore_once = () => {\n\t\tif (restored) return;\n\t\trestored = true;\n\t\trestore();\n\t};\n\n\truntime.dispose = (async () => {\n\t\ttry {\n\t\t\tawait dispose();\n\t\t} finally {\n\t\t\trestore_once();\n\t\t}\n\t}) as T['dispose'];\n\n\treturn runtime;\n}\n\nconst UNTRUSTED_CHILD_ENV_DEFAULTS: Record<string, string> = {\n\tMY_PI_CHILD_ENV_ALLOWLIST: '',\n\tMY_PI_MCP_ENV_ALLOWLIST: '',\n\tMY_PI_LSP_ENV_ALLOWLIST: '',\n\tMY_PI_HOOKS_ENV_ALLOWLIST: '',\n\tMY_PI_TEAM_MODE_ENV_ALLOWLIST: '',\n};\n\nexport function apply_untrusted_repo_defaults(\n\tenv: NodeJS.ProcessEnv = process.env,\n): string[] {\n\tconst applied = apply_project_trust_untrusted_defaults(env);\n\tfor (const [key, value] of Object.entries(\n\t\tUNTRUSTED_CHILD_ENV_DEFAULTS,\n\t)) {\n\t\tif (env[key] !== undefined) continue;\n\t\tenv[key] = value;\n\t\tapplied.push(key);\n\t}\n\treturn applied;\n}\n\nexport function is_resource_enabled(\n\tvalue: string | undefined,\n): boolean {\n\tconst normalized = value?.trim().toLowerCase();\n\tif (!normalized) return true;\n\tif (['0', 'false', 'no', 'skip', 'disable'].includes(normalized)) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nexport function resolve_agent_dir(\n\tcwd: string,\n\tagent_dir?: string,\n): string {\n\treturn agent_dir ? resolve(cwd, agent_dir) : getAgentDir();\n}\n","import {\n\tclampThinkingLevel,\n\ttype Api,\n\ttype Model,\n} from '@earendil-works/pi-ai';\nimport type { MyPiThinkingLevel } from './options.js';\n\ninterface ModelsLike {\n\tgetModels(): readonly Model<Api>[];\n}\n\nexport function resolve_model_reference(\n\tmodel_reference: string | undefined,\n\tmodels_runtime: ModelsLike,\n): Model<Api> | undefined {\n\tif (!model_reference) return undefined;\n\tconst models = models_runtime.getModels();\n\tconst lower_reference = model_reference.toLowerCase();\n\tconst slash_index = model_reference.indexOf('/');\n\n\tif (slash_index !== -1) {\n\t\tconst maybe_provider = model_reference.slice(0, slash_index);\n\t\tconst model_id = model_reference.slice(slash_index + 1);\n\t\tconst provider = models.find(\n\t\t\t(model) =>\n\t\t\t\tmodel.provider.toLowerCase() === maybe_provider.toLowerCase(),\n\t\t)?.provider;\n\n\t\tif (provider) {\n\t\t\tconst provider_match = models.find(\n\t\t\t\t(model) =>\n\t\t\t\t\tmodel.provider === provider &&\n\t\t\t\t\tmodel.id.toLowerCase() === model_id.toLowerCase(),\n\t\t\t);\n\t\t\tif (provider_match) return provider_match;\n\t\t}\n\t}\n\n\treturn models.find((model) => {\n\t\tconst id = model.id.toLowerCase();\n\t\tconst full_id = `${model.provider}/${model.id}`.toLowerCase();\n\t\treturn id === lower_reference || full_id === lower_reference;\n\t});\n}\n\nexport function resolve_effective_thinking_level(\n\tmodel: Model<Api> | undefined,\n\tthinking: MyPiThinkingLevel | undefined,\n): MyPiThinkingLevel | undefined {\n\tif (!thinking || !model) return thinking;\n\treturn clampThinkingLevel(model, thinking);\n}\n","import { SessionManager } from '@earendil-works/pi-coding-agent';\nimport { existsSync, readdirSync } from 'node:fs';\nimport { basename, isAbsolute, join, resolve } from 'node:path';\n\nfunction resolve_session_file(\n\tcwd: string,\n\tsession_dir: string | undefined,\n\tsession_ref: string | undefined,\n): string | undefined {\n\tif (!session_ref) return undefined;\n\tconst explicit_path = isAbsolute(session_ref)\n\t\t? session_ref\n\t\t: resolve(cwd, session_ref);\n\tif (existsSync(explicit_path)) return explicit_path;\n\tif (session_ref.endsWith('.jsonl')) return explicit_path;\n\n\tconst dir = session_dir ? resolve(cwd, session_dir) : undefined;\n\tif (!dir || !existsSync(dir)) return undefined;\n\tconst matches = readdirSync(dir)\n\t\t.filter(\n\t\t\t(file) =>\n\t\t\t\tfile.endsWith('.jsonl') &&\n\t\t\t\t(basename(file, '.jsonl').endsWith(session_ref) ||\n\t\t\t\t\tfile.includes(session_ref)),\n\t\t)\n\t\t.sort();\n\tconst match = matches.at(-1);\n\treturn match ? join(dir, match) : undefined;\n}\n\nexport function create_session_manager(options: {\n\tcwd: string;\n\tsession_dir?: string;\n\tsession?: string;\n\tsession_id?: string;\n\tstartup_session_name?: string;\n}): SessionManager {\n\tconst resolved_session_dir = options.session_dir\n\t\t? resolve(options.cwd, options.session_dir)\n\t\t: SessionManager.create(options.cwd).getSessionDir();\n\tconst session_ref = options.session ?? options.session_id;\n\tconst session_file = resolve_session_file(\n\t\toptions.cwd,\n\t\tresolved_session_dir,\n\t\tsession_ref,\n\t);\n\tconst session_manager = session_file\n\t\t? SessionManager.open(\n\t\t\t\tsession_file,\n\t\t\t\tresolved_session_dir,\n\t\t\t\toptions.cwd,\n\t\t\t)\n\t\t: SessionManager.create(\n\t\t\t\toptions.cwd,\n\t\t\t\tresolved_session_dir,\n\t\t\t\toptions.session_id ? { id: options.session_id } : {},\n\t\t\t);\n\tif (\n\t\toptions.startup_session_name &&\n\t\tsession_manager.getSessionName() !== options.startup_session_name\n\t) {\n\t\tsession_manager.appendSessionInfo(options.startup_session_name);\n\t}\n\treturn session_manager;\n}\n","import type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n} from '@earendil-works/pi-coding-agent';\nimport { type SettingItem } from '@earendil-works/pi-tui';\nimport { show_settings_modal } from '@spences10/pi-tui-modal';\nimport {\n\tBUILTIN_EXTENSIONS,\n\tfind_builtin_extension,\n\tload_builtin_extensions_config,\n\tresolve_builtin_extension_states,\n\tsave_builtin_extensions_config,\n\ttype BuiltinExtensionKey,\n\ttype BuiltinExtensionState,\n} from './config.js';\n\nconst ENABLED = '● enabled';\nconst DISABLED = '○ disabled';\n\nexport interface ExtensionsManagerOptions {\n\tforce_disabled?: Iterable<BuiltinExtensionKey>;\n}\n\nfunction to_force_disabled_set(\n\tforce_disabled?: Iterable<BuiltinExtensionKey>,\n): ReadonlySet<BuiltinExtensionKey> {\n\treturn new Set(force_disabled ?? []);\n}\n\nfunction format_effective_state(\n\tstate: BuiltinExtensionState,\n): string {\n\tif (state.effective_enabled) {\n\t\treturn 'enabled';\n\t}\n\tif (state.forced_disabled) {\n\t\treturn `disabled in this process by ${state.cli_flag}`;\n\t}\n\treturn 'disabled';\n}\n\nfunction format_extension_lines(\n\tstates: BuiltinExtensionState[],\n\toptions?: { heading?: string },\n): string {\n\tconst lines: string[] = [];\n\tif (options?.heading) {\n\t\tlines.push(options.heading, '');\n\t}\n\n\tconst enabled_now = states.filter(\n\t\t(state) => state.effective_enabled,\n\t).length;\n\tconst disabled_now = states.length - enabled_now;\n\tlines.push(\n\t\t`${states.length} built-in extensions (${enabled_now} enabled now, ${disabled_now} disabled now)`,\n\t\t'',\n\t);\n\n\tfor (const state of states) {\n\t\tlines.push(\n\t\t\t`${state.saved_enabled ? ENABLED : DISABLED} ${state.label}`,\n\t\t);\n\t\tlines.push(` key: ${state.key}`);\n\t\tlines.push(\n\t\t\t` saved config: ${state.saved_enabled ? 'enabled' : 'disabled'}`,\n\t\t);\n\t\tlines.push(\n\t\t\t` current process: ${format_effective_state(state)}`,\n\t\t);\n\t\tlines.push(` ${state.description}`);\n\t}\n\n\treturn lines.join('\\n');\n}\n\nfunction to_setting_item(state: BuiltinExtensionState): SettingItem {\n\tconst detail_lines = [\n\t\tstate.key,\n\t\tstate.description,\n\t\t`current process: ${format_effective_state(state)}`,\n\t\t`startup override: ${state.cli_flag}`,\n\t];\n\n\treturn {\n\t\tid: state.key,\n\t\tlabel: state.label,\n\t\tdescription: detail_lines.join('\\n'),\n\t\tcurrentValue: state.saved_enabled ? ENABLED : DISABLED,\n\t\tvalues: [ENABLED, DISABLED],\n\t};\n}\n\nfunction sets_equal(\n\ta: ReadonlySet<string>,\n\tb: ReadonlySet<string>,\n): boolean {\n\tif (a.size !== b.size) return false;\n\tfor (const value of a) {\n\t\tif (!b.has(value)) return false;\n\t}\n\treturn true;\n}\n\nfunction search_states(\n\tstates: BuiltinExtensionState[],\n\tquery: string,\n): BuiltinExtensionState[] {\n\tconst normalized = query.trim().toLowerCase();\n\tif (!normalized) return states;\n\n\treturn states.filter((state) =>\n\t\t[\n\t\t\tstate.key,\n\t\t\tstate.label,\n\t\t\tstate.description,\n\t\t\t...state.aliases,\n\t\t].some((value) => value.toLowerCase().includes(normalized)),\n\t);\n}\n\nfunction save_extension_enabled(\n\tkey: BuiltinExtensionKey,\n\tenabled: boolean,\n): void {\n\tconst config = load_builtin_extensions_config();\n\tconfig.enabled[key] = enabled;\n\tsave_builtin_extensions_config(config);\n}\n\nexport function create_extensions_extension(\n\toptions: ExtensionsManagerOptions = {},\n) {\n\tconst force_disabled = to_force_disabled_set(\n\t\toptions.force_disabled,\n\t);\n\n\tasync function show_manager(\n\t\tctx: ExtensionCommandContext,\n\t): Promise<boolean> {\n\t\tif (!ctx.hasUI) return false;\n\n\t\tconst states = resolve_builtin_extension_states(force_disabled);\n\t\tconst initial_enabled = new Set(\n\t\t\tstates\n\t\t\t\t.filter((state) => state.saved_enabled)\n\t\t\t\t.map((state) => state.key),\n\t\t);\n\t\tconst current_enabled = new Set(initial_enabled);\n\n\t\tconst items = states.map(to_setting_item);\n\t\tawait show_settings_modal(ctx, {\n\t\t\ttitle: 'Built-in extensions',\n\t\t\tsubtitle: () => {\n\t\t\t\tconst saved_enabled = current_enabled.size;\n\t\t\t\tconst saved_disabled = states.length - saved_enabled;\n\t\t\t\tconst enabled_now = [...current_enabled].filter(\n\t\t\t\t\t(key) => !force_disabled.has(key as BuiltinExtensionKey),\n\t\t\t\t).length;\n\t\t\t\tconst disabled_now = states.length - enabled_now;\n\t\t\t\treturn `${saved_enabled} saved enabled • ${saved_disabled} saved disabled • ${enabled_now} enabled now • ${disabled_now} disabled now`;\n\t\t\t},\n\t\t\titems,\n\t\t\tenable_search: true,\n\t\t\tfooter:\n\t\t\t\t'esc close • search filters • changes save immediately • CLI --no-* flags still win in this process',\n\t\t\ton_change: (id, new_value) => {\n\t\t\t\tconst key = id as BuiltinExtensionKey;\n\t\t\t\tconst enabled = new_value === ENABLED;\n\t\t\t\tif (enabled) {\n\t\t\t\t\tcurrent_enabled.add(key);\n\t\t\t\t} else {\n\t\t\t\t\tcurrent_enabled.delete(key);\n\t\t\t\t}\n\t\t\t\tsave_extension_enabled(key, enabled);\n\t\t\t},\n\t\t});\n\n\t\tif (!sets_equal(initial_enabled, current_enabled)) {\n\t\t\tctx.ui.notify(\n\t\t\t\tforce_disabled.size > 0\n\t\t\t\t\t? 'Reloading to apply updated built-in extensions. CLI --no-* flags still force-disable some extensions in this process.'\n\t\t\t\t\t: 'Reloading to apply updated built-in extensions...',\n\t\t\t\t'info',\n\t\t\t);\n\t\t\tawait ctx.reload();\n\t\t}\n\n\t\treturn true;\n\t}\n\n\treturn async function extensions(pi: ExtensionAPI) {\n\t\tconst subs = ['list', 'enable', 'disable', 'toggle', 'search'];\n\n\t\tpi.registerCommand('extensions', {\n\t\t\tdescription: 'Manage built-in my-pi extensions',\n\t\t\tgetArgumentCompletions: (prefix) => {\n\t\t\t\tconst parts = prefix.trim().split(/\\s+/);\n\t\t\t\tif (parts.length <= 1) {\n\t\t\t\t\treturn subs\n\t\t\t\t\t\t.filter((sub) => sub.startsWith(parts[0] || ''))\n\t\t\t\t\t\t.map((sub) => ({ value: sub, label: sub }));\n\t\t\t\t}\n\n\t\t\t\tif (['enable', 'disable', 'toggle'].includes(parts[0])) {\n\t\t\t\t\tconst q = parts.slice(1).join(' ').toLowerCase();\n\t\t\t\t\treturn resolve_builtin_extension_states(force_disabled)\n\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t(state) =>\n\t\t\t\t\t\t\t\tstate.key.toLowerCase().includes(q) ||\n\t\t\t\t\t\t\t\tstate.label.toLowerCase().includes(q),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.slice(0, 20)\n\t\t\t\t\t\t.map((state) => ({\n\t\t\t\t\t\t\tvalue: `${parts[0]} ${state.key}`,\n\t\t\t\t\t\t\tlabel: `${state.key} ${state.saved_enabled ? ENABLED : DISABLED}`,\n\t\t\t\t\t\t}));\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t},\n\t\t\thandler: async (args, ctx) => {\n\t\t\t\tconst trimmed = args.trim();\n\n\t\t\t\tif (!trimmed) {\n\t\t\t\t\tif (await show_manager(ctx)) return;\n\t\t\t\t}\n\n\t\t\t\tconst [sub, ...rest] = (trimmed || 'list').split(/\\s+/);\n\t\t\t\tconst arg = rest.join(' ');\n\t\t\t\tconst states =\n\t\t\t\t\tresolve_builtin_extension_states(force_disabled);\n\n\t\t\t\tswitch (sub) {\n\t\t\t\t\tcase 'list': {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\tformat_extension_lines(states, {\n\t\t\t\t\t\t\t\theading: 'Built-in extensions',\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'enable':\n\t\t\t\t\tcase 'disable':\n\t\t\t\t\tcase 'toggle': {\n\t\t\t\t\t\tif (!arg) {\n\t\t\t\t\t\t\tif (await show_manager(ctx)) return;\n\t\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t\t`Usage: /extensions ${sub} <key>`,\n\t\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst extension = find_builtin_extension(arg);\n\t\t\t\t\t\tif (!extension) {\n\t\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t\t`Unknown extension: ${arg}. Use: ${BUILTIN_EXTENSIONS.map((item) => item.key).join(', ')}`,\n\t\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst current_state = states.find(\n\t\t\t\t\t\t\t(state) => state.key === extension.key,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst next_enabled =\n\t\t\t\t\t\t\tsub === 'enable'\n\t\t\t\t\t\t\t\t? true\n\t\t\t\t\t\t\t\t: sub === 'disable'\n\t\t\t\t\t\t\t\t\t? false\n\t\t\t\t\t\t\t\t\t: !current_state?.saved_enabled;\n\t\t\t\t\t\tsave_extension_enabled(extension.key, next_enabled);\n\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\tnext_enabled && force_disabled.has(extension.key)\n\t\t\t\t\t\t\t\t? `Enabled ${extension.key} in saved config. Still disabled in this process by ${extension.cli_flag}. /reload or restart without that flag to apply.`\n\t\t\t\t\t\t\t\t: `${extension.key} ${next_enabled ? 'enabled' : 'disabled'}. /reload to apply.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'search': {\n\t\t\t\t\t\tif (!arg) {\n\t\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t\t'Usage: /extensions search <query>',\n\t\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst results = search_states(states, arg);\n\t\t\t\t\t\tif (results.length === 0) {\n\t\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t\t`No built-in extensions matching \"${arg}\"`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\tformat_extension_lines(results, {\n\t\t\t\t\t\t\t\theading: `Built-in extensions matching \"${arg}\"`,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t`Unknown: ${sub}. Use: ${subs.join(', ')}`,\n\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t};\n}\n\nexport default create_extensions_extension();\n","// Composable programmatic API for my-pi\n\nimport {\n\tInteractiveMode,\n\tcreateAgentSessionFromServices,\n\tcreateAgentSessionRuntime,\n\tcreateAgentSessionServices,\n\trunPrintMode,\n\trunRpcMode,\n\ttype CreateAgentSessionFromServicesOptions,\n\ttype CreateAgentSessionServicesOptions,\n\ttype InlineExtension,\n\ttype SessionManager,\n} from '@earendil-works/pi-coding-agent';\nimport { resolve } from 'node:path';\nimport {\n\tMANAGED_INLINE_EXTENSION_NAME_PREFIX,\n\tPACKAGE_THEME_DIR,\n\tassert_unreserved_inline_extension_names,\n\tcreate_extensions_override,\n\tcreate_lazy_builtin_extension_factory,\n\tcreate_lazy_telemetry_extension,\n\tget_externally_installed_builtin_extensions,\n\tget_force_disabled_builtins,\n\twarn_builtin_extension_unavailable,\n} from './api/builtin-extensions.js';\nimport {\n\tMY_PI_RUNTIME_MODE_ENV,\n\tPI_AGENT_DIR_ENV,\n\tapply_untrusted_repo_defaults,\n\tis_resource_enabled,\n\tresolve_agent_dir,\n\trestore_env,\n\tsnapshot_env,\n\twrap_runtime_env_restore,\n} from './api/env.js';\nimport {\n\tresolve_effective_thinking_level,\n\tresolve_model_reference,\n} from './api/models.js';\nimport type { CreateMyPiOptions } from './api/options.js';\nimport { create_session_manager } from './api/session.js';\nimport { BUILTIN_EXTENSION_REGISTRY } from './extensions/builtin-registry.js';\nimport {\n\tis_builtin_extension_active,\n\tload_builtin_extensions_config,\n} from './extensions/manager/config.js';\nimport { create_extensions_extension } from './extensions/manager/index.js';\n\nexport type {\n\tCreateMyPiOptions,\n\tMyPiRuntimeMode,\n\tMyPiThinkingLevel,\n} from './api/options.js';\nexport {\n\tapply_untrusted_repo_defaults,\n\tcreate_lazy_builtin_extension_factory,\n\tget_externally_installed_builtin_extensions,\n\tget_force_disabled_builtins,\n\tresolve_effective_thinking_level,\n\tresolve_model_reference,\n};\n\nexport async function create_my_pi(options: CreateMyPiOptions = {}) {\n\tconst {\n\t\tcwd = process.cwd(),\n\t\tagent_dir,\n\t\textensions = [],\n\t\textensionFactories: user_factories = [],\n\t\textension_flag_values,\n\t\truntime_mode = 'interactive',\n\t\ttelemetry,\n\t\ttelemetry_db_path,\n\t\tmodel,\n\t\tthinking,\n\t\tselected_tools,\n\t\texcluded_tools,\n\t\tselected_skills,\n\t\tsession,\n\t\tsession_id,\n\t\tstartup_session_name,\n\t\tsession_dir,\n\t\tsystem_prompt,\n\t\tappend_system_prompt,\n\t\tuntrusted_repo = false,\n\t} = options;\n\n\tassert_unreserved_inline_extension_names(user_factories);\n\n\tconst env_keys_to_restore = new Set<string>([\n\t\tMY_PI_RUNTIME_MODE_ENV,\n\t]);\n\tif (agent_dir) env_keys_to_restore.add(PI_AGENT_DIR_ENV);\n\tconst env_snapshot = snapshot_env(process.env, env_keys_to_restore);\n\tlet restore_runtime_env = () =>\n\t\trestore_env(process.env, env_snapshot);\n\n\tif (untrusted_repo) {\n\t\tconst applied = apply_untrusted_repo_defaults();\n\t\tif (applied.length) {\n\t\t\tconst restore_previous = restore_runtime_env;\n\t\t\trestore_runtime_env = () => {\n\t\t\t\tfor (const key of applied) delete process.env[key];\n\t\t\t\trestore_previous();\n\t\t\t};\n\t\t}\n\t}\n\n\tconst effective_agent_dir = resolve_agent_dir(cwd, agent_dir);\n\tif (agent_dir) {\n\t\tprocess.env[PI_AGENT_DIR_ENV] = effective_agent_dir;\n\t}\n\tprocess.env[MY_PI_RUNTIME_MODE_ENV] = runtime_mode;\n\n\tconst resolved_extensions = extensions.map((p) => resolve(cwd, p));\n\tconst force_disabled = get_force_disabled_builtins({\n\t\t...options,\n\t\truntime_mode,\n\t});\n\tfor (const key of get_externally_installed_builtin_extensions(\n\t\teffective_agent_dir,\n\t)) {\n\t\tforce_disabled.add(key);\n\t}\n\tconst builtins_config = load_builtin_extensions_config();\n\tconst skills_builtin_enabled = is_builtin_extension_active(\n\t\tbuiltins_config,\n\t\t'skills',\n\t\tforce_disabled,\n\t);\n\tconst skills_package = skills_builtin_enabled\n\t\t? await import('@spences10/pi-skills').catch((error) => {\n\t\t\t\twarn_builtin_extension_unavailable('skills', error);\n\t\t\t\treturn undefined;\n\t\t\t})\n\t\t: undefined;\n\n\tconst managed_inline_extensions = [\n\t\t{\n\t\t\tname: `${MANAGED_INLINE_EXTENSION_NAME_PREFIX}telemetry`,\n\t\t\tfactory: create_lazy_telemetry_extension({\n\t\t\t\tenabled: telemetry,\n\t\t\t\tdb_path: telemetry_db_path,\n\t\t\t\tcwd,\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: `${MANAGED_INLINE_EXTENSION_NAME_PREFIX}extensions-manager`,\n\t\t\tfactory: create_extensions_extension({ force_disabled }),\n\t\t},\n\t\t...BUILTIN_EXTENSION_REGISTRY.map((extension) => ({\n\t\t\tname: `${MANAGED_INLINE_EXTENSION_NAME_PREFIX}${extension.key}`,\n\t\t\tfactory: create_lazy_builtin_extension_factory(\n\t\t\t\textension.key,\n\t\t\t\textension.load,\n\t\t\t\tforce_disabled,\n\t\t\t),\n\t\t})),\n\t] satisfies InlineExtension[];\n\tconst managed_extension_paths = managed_inline_extensions.map(\n\t\t(extension) => `<inline:${extension.name}>`,\n\t);\n\n\tconst create_runtime = async ({\n\t\tcwd: runtime_cwd,\n\t\tsessionManager,\n\t\tsessionStartEvent,\n\t}: {\n\t\tcwd: string;\n\t\tsessionManager: SessionManager;\n\t\tsessionStartEvent?: CreateAgentSessionFromServicesOptions['sessionStartEvent'];\n\t}) => {\n\t\t// Keep skill filtering reloadable so profile changes made by\n\t\t// /skills are reflected without restarting the process.\n\t\tconst runtime_skills_manager =\n\t\t\tskills_package?.create_skills_manager({\n\t\t\t\tcwd: runtime_cwd,\n\t\t\t\tproject_skills_enabled: is_resource_enabled(\n\t\t\t\t\tprocess.env.MY_PI_PROJECT_SKILLS,\n\t\t\t\t),\n\t\t\t});\n\t\tconst additional_skill_paths =\n\t\t\truntime_skills_manager?.get_enabled_skill_paths() ?? [];\n\n\t\tconst services = await createAgentSessionServices({\n\t\t\tcwd: runtime_cwd,\n\t\t\tagentDir: effective_agent_dir,\n\t\t\textensionFlagValues: extension_flag_values,\n\t\t\tresourceLoaderOptions: {\n\t\t\t\t...(additional_skill_paths.length\n\t\t\t\t\t? { additionalSkillPaths: additional_skill_paths }\n\t\t\t\t\t: {}),\n\t\t\t\t...(system_prompt !== undefined\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tsystemPromptOverride: () => system_prompt,\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t\t...(append_system_prompt !== undefined\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tappendSystemPromptOverride: (base: string[]) => [\n\t\t\t\t\t\t\t\t...base,\n\t\t\t\t\t\t\t\tappend_system_prompt,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t\tadditionalExtensionPaths: [...resolved_extensions],\n\t\t\t\t...(runtime_mode === 'interactive'\n\t\t\t\t\t? { additionalThemePaths: [PACKAGE_THEME_DIR] }\n\t\t\t\t\t: {}),\n\t\t\t\textensionFactories: [\n\t\t\t\t\t...managed_inline_extensions,\n\t\t\t\t\t...user_factories,\n\t\t\t\t],\n\t\t\t\textensionsOverride: create_extensions_override(\n\t\t\t\t\tmanaged_extension_paths,\n\t\t\t\t),\n\t\t\t\tskillsOverride: (\n\t\t\t\t\tbase: Parameters<\n\t\t\t\t\t\tNonNullable<\n\t\t\t\t\t\t\tNonNullable<\n\t\t\t\t\t\t\t\tCreateAgentSessionServicesOptions['resourceLoaderOptions']\n\t\t\t\t\t\t\t>['skillsOverride']\n\t\t\t\t\t\t>\n\t\t\t\t\t>[0],\n\t\t\t\t) => {\n\t\t\t\t\tif (!skills_builtin_enabled) return { ...base, skills: [] };\n\t\t\t\t\tif (!runtime_skills_manager) return base;\n\t\t\t\t\truntime_skills_manager.refresh();\n\n\t\t\t\t\tconst selected_skill_names = selected_skills?.length\n\t\t\t\t\t\t? new Set(selected_skills)\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...base,\n\t\t\t\t\t\tskills: base.skills.filter((skill) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tselected_skill_names &&\n\t\t\t\t\t\t\t\t!selected_skill_names.has(skill.name)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn runtime_skills_manager.is_enabled_by_skill(\n\t\t\t\t\t\t\t\tskill.name,\n\t\t\t\t\t\t\t\tskill.filePath,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}),\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t} satisfies CreateAgentSessionServicesOptions['resourceLoaderOptions'],\n\t\t});\n\n\t\tconst requested_model = resolve_model_reference(\n\t\t\tmodel,\n\t\t\tservices.modelRuntime,\n\t\t);\n\t\tconst effective_thinking = resolve_effective_thinking_level(\n\t\t\trequested_model,\n\t\t\tthinking,\n\t\t);\n\t\tif (\n\t\t\trequested_model &&\n\t\t\tthinking &&\n\t\t\teffective_thinking &&\n\t\t\teffective_thinking !== thinking\n\t\t) {\n\t\t\tservices.diagnostics.push({\n\t\t\t\ttype: 'warning',\n\t\t\t\tmessage: `Requested thinking level \"${thinking}\" is not supported by ${requested_model.provider}/${requested_model.id}; using \"${effective_thinking}\".`,\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\t...(await createAgentSessionFromServices({\n\t\t\t\tservices,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent,\n\t\t\t\t...(requested_model ? { model: requested_model } : {}),\n\t\t\t\t...(effective_thinking\n\t\t\t\t\t? { thinkingLevel: effective_thinking }\n\t\t\t\t\t: {}),\n\t\t\t\t...(selected_tools?.length ? { tools: selected_tools } : {}),\n\t\t\t\t...(excluded_tools?.length\n\t\t\t\t\t? { excludeTools: excluded_tools }\n\t\t\t\t\t: {}),\n\t\t\t})),\n\t\t\tservices,\n\t\t\tdiagnostics: services.diagnostics,\n\t\t};\n\t};\n\n\ttry {\n\t\treturn wrap_runtime_env_restore(\n\t\t\tawait createAgentSessionRuntime(create_runtime, {\n\t\t\t\tcwd,\n\t\t\t\tagentDir: effective_agent_dir,\n\t\t\t\tsessionManager: create_session_manager({\n\t\t\t\t\tcwd,\n\t\t\t\t\tsession_dir,\n\t\t\t\t\tsession,\n\t\t\t\t\tsession_id,\n\t\t\t\t\tstartup_session_name,\n\t\t\t\t}),\n\t\t\t}),\n\t\t\trestore_runtime_env,\n\t\t);\n\t} catch (error) {\n\t\trestore_runtime_env();\n\t\tthrow error;\n\t}\n}\n\nexport { InteractiveMode, runPrintMode, runRpcMode };\n\nexport type {\n\tAgentSessionRuntime,\n\tExtensionFactory,\n\tInlineExtension,\n\tInteractiveModeOptions,\n\tPrintModeOptions,\n} from '@earendil-works/pi-coding-agent';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api.js","names":[],"sources":["../src/extensions/manager/config.ts","../src/api/builtin-extensions.ts","../src/api/env.ts","../src/api/models.ts","../src/api/session.ts","../src/extensions/manager/index.ts","../src/api.ts"],"sourcesContent":["import {\n\tBUILTIN_EXTENSIONS,\n\ttype BuiltinExtensionInfo,\n\ttype BuiltinExtensionKey,\n} from '../builtin-registry.js';\nimport {\n\tget_settings_path,\n\tload_settings,\n\tsave_settings,\n} from '../../settings/index.js';\n\nexport { BUILTIN_EXTENSIONS };\nexport type { BuiltinExtensionInfo, BuiltinExtensionKey };\n\nexport interface BuiltinExtensionsConfig {\n\tversion: number;\n\tenabled: Partial<Record<BuiltinExtensionKey, boolean>>;\n}\n\nexport interface BuiltinExtensionState extends BuiltinExtensionInfo {\n\tsaved_enabled: boolean;\n\teffective_enabled: boolean;\n\tforced_disabled: boolean;\n}\n\nexport function get_builtin_extensions_config_path(): string {\n\treturn get_settings_path();\n}\n\nexport function load_builtin_extensions_config(): BuiltinExtensionsConfig {\n\tconst settings = load_settings();\n\tconst enabled: BuiltinExtensionsConfig['enabled'] = {};\n\tfor (const extension of BUILTIN_EXTENSIONS) {\n\t\tconst value = settings.extensions.enabled[extension.key];\n\t\tif (typeof value === 'boolean') enabled[extension.key] = value;\n\t}\n\treturn { version: 1, enabled };\n}\n\nexport function save_builtin_extensions_config(\n\tconfig: BuiltinExtensionsConfig,\n): void {\n\tconst settings = load_settings();\n\tsave_settings({\n\t\t...settings,\n\t\textensions: {\n\t\t\t...settings.extensions,\n\t\t\tenabled: config.enabled,\n\t\t},\n\t});\n}\n\nexport function is_builtin_extension_enabled(\n\tconfig: BuiltinExtensionsConfig,\n\tkey: BuiltinExtensionKey,\n): boolean {\n\treturn config.enabled[key] ?? true;\n}\n\nexport function is_builtin_extension_active(\n\tconfig: BuiltinExtensionsConfig,\n\tkey: BuiltinExtensionKey,\n\tforce_disabled: ReadonlySet<BuiltinExtensionKey> = new Set(),\n): boolean {\n\treturn (\n\t\tis_builtin_extension_enabled(config, key) &&\n\t\t!force_disabled.has(key)\n\t);\n}\n\nexport function resolve_builtin_extension_states(\n\tforce_disabled: ReadonlySet<BuiltinExtensionKey> = new Set(),\n\tconfig: BuiltinExtensionsConfig = load_builtin_extensions_config(),\n): BuiltinExtensionState[] {\n\treturn BUILTIN_EXTENSIONS.map((extension) => {\n\t\tconst saved_enabled = is_builtin_extension_enabled(\n\t\t\tconfig,\n\t\t\textension.key,\n\t\t);\n\t\tconst forced = force_disabled.has(extension.key);\n\t\treturn {\n\t\t\t...extension,\n\t\t\tsaved_enabled,\n\t\t\teffective_enabled: saved_enabled && !forced,\n\t\t\tforced_disabled: forced,\n\t\t};\n\t});\n}\n\nexport function find_builtin_extension(\n\tquery: string,\n): BuiltinExtensionInfo | undefined {\n\tconst normalized = query.trim().toLowerCase();\n\tif (!normalized) return undefined;\n\n\treturn BUILTIN_EXTENSIONS.find((extension) =>\n\t\t[extension.key, extension.label, ...extension.aliases].some(\n\t\t\t(value) => value.toLowerCase() === normalized,\n\t\t),\n\t);\n}\n","import type {\n\tExtensionFactory,\n\tInlineExtension,\n\tLoadExtensionsResult,\n} from '@earendil-works/pi-coding-agent';\nimport { existsSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { dirname, join, resolve } from 'node:path';\nimport {\n\tBUILTIN_EXTENSION_REGISTRY,\n\ttype BuiltinExtensionKey,\n} from '../extensions/builtin-registry.js';\nimport {\n\tis_builtin_extension_active,\n\tload_builtin_extensions_config,\n} from '../extensions/manager/config.js';\nimport type {\n\tBuiltinExtensionOptions,\n\tCreateMyPiOptions,\n\tMyPiRuntimeMode,\n} from './options.js';\n\ntype BuiltinExtensionLoader = () => Promise<ExtensionFactory>;\n\nconst require = createRequire(import.meta.url);\nexport const PACKAGE_THEME_DIR = resolve(\n\tdirname(require.resolve('@spences10/pi-themes/package.json')),\n\t'themes',\n);\n\nexport const MANAGED_INLINE_EXTENSION_NAME_PREFIX = 'my-pi-';\n\nexport function assert_unreserved_inline_extension_names(\n\textensions: readonly InlineExtension[],\n): void {\n\tfor (const extension of extensions) {\n\t\tif (\n\t\t\ttypeof extension !== 'function' &&\n\t\t\textension.name.startsWith(MANAGED_INLINE_EXTENSION_NAME_PREFIX)\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t`Inline extension name \"${extension.name}\" is reserved for my-pi managed extensions; choose a name that does not start with \"${MANAGED_INLINE_EXTENSION_NAME_PREFIX}\".`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nexport function get_force_disabled_builtins(\n\toptions: Pick<CreateMyPiOptions, 'runtime_mode'> &\n\t\tBuiltinExtensionOptions,\n): Set<BuiltinExtensionKey> {\n\tconst force_disabled = new Set<BuiltinExtensionKey>();\n\tfor (const extension of BUILTIN_EXTENSION_REGISTRY) {\n\t\tconst enabled =\n\t\t\toptions[extension.option_name] ?? extension.default_enabled;\n\t\tif (!enabled) force_disabled.add(extension.key);\n\t\tconst disabled_in =\n\t\t\t'mode_constraints' in extension\n\t\t\t\t? extension.mode_constraints.disabled_in\n\t\t\t\t: undefined;\n\t\tif (\n\t\t\toptions.runtime_mode &&\n\t\t\t(\n\t\t\t\tdisabled_in as readonly MyPiRuntimeMode[] | undefined\n\t\t\t)?.includes(options.runtime_mode)\n\t\t) {\n\t\t\tforce_disabled.add(extension.key);\n\t\t}\n\t}\n\treturn force_disabled;\n}\n\nfunction is_agent_dir_package_installed(\n\tagent_dir: string,\n\tpackage_name: string,\n): boolean {\n\treturn existsSync(\n\t\tjoin(agent_dir, 'npm', 'node_modules', package_name),\n\t);\n}\n\nexport function get_externally_installed_builtin_extensions(\n\tagent_dir: string,\n): Set<BuiltinExtensionKey> {\n\tconst installed = new Set<BuiltinExtensionKey>();\n\tfor (const extension of BUILTIN_EXTENSION_REGISTRY) {\n\t\tconst external_package_name = (\n\t\t\textension as { external_package_name?: string }\n\t\t).external_package_name;\n\t\tif (\n\t\t\texternal_package_name &&\n\t\t\tis_agent_dir_package_installed(agent_dir, external_package_name)\n\t\t) {\n\t\t\tinstalled.add(extension.key);\n\t\t}\n\t}\n\treturn installed;\n}\n\nexport function warn_builtin_extension_unavailable(\n\tkey: BuiltinExtensionKey | 'telemetry',\n\terror: unknown,\n): void {\n\tconst reason =\n\t\terror instanceof Error ? error.message : String(error);\n\tprocess.emitWarning(\n\t\t`Built-in extension \"${key}\" is unavailable and was skipped: ${reason}`,\n\t\t{ code: 'MY_PI_BUILTIN_EXTENSION_UNAVAILABLE' },\n\t);\n}\n\nexport function create_lazy_builtin_extension_factory(\n\tkey: BuiltinExtensionKey,\n\tload_extension: BuiltinExtensionLoader,\n\tforce_disabled: ReadonlySet<BuiltinExtensionKey>,\n): ExtensionFactory {\n\treturn async (pi) => {\n\t\tconst config = load_builtin_extensions_config();\n\t\tif (!is_builtin_extension_active(config, key, force_disabled)) {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst extension = await load_extension();\n\t\t\tawait extension(pi);\n\t\t} catch (error) {\n\t\t\twarn_builtin_extension_unavailable(key, error);\n\t\t}\n\t};\n}\n\nexport function create_lazy_telemetry_extension(options: {\n\tenabled?: boolean;\n\tdb_path?: string;\n\tcwd?: string;\n}): ExtensionFactory {\n\treturn async (pi) => {\n\t\ttry {\n\t\t\tconst { create_telemetry_extension } =\n\t\t\t\tawait import('@spences10/pi-telemetry');\n\t\t\tawait create_telemetry_extension(options)(pi);\n\t\t} catch (error) {\n\t\t\twarn_builtin_extension_unavailable('telemetry', error);\n\t\t}\n\t};\n}\n\nexport function create_extensions_override(\n\tmanaged_extension_paths: readonly string[],\n): (base: LoadExtensionsResult) => LoadExtensionsResult {\n\treturn (base) => {\n\t\t// Pi names inline extensions but still loads discovered paths first.\n\t\t// Move only the first matching managed instance to preserve precedence.\n\t\tconst remaining = [...base.extensions];\n\t\tconst ordered_managed = managed_extension_paths.flatMap(\n\t\t\t(path) => {\n\t\t\t\tconst index = remaining.findIndex(\n\t\t\t\t\t(extension) => extension.path === path,\n\t\t\t\t);\n\t\t\t\treturn index === -1 ? [] : remaining.splice(index, 1);\n\t\t\t},\n\t\t);\n\t\treturn {\n\t\t\t...base,\n\t\t\textensions: [...ordered_managed, ...remaining],\n\t\t};\n\t};\n}\n","import { getAgentDir } from '@earendil-works/pi-coding-agent';\nimport { apply_project_trust_untrusted_defaults } from '@spences10/pi-project-trust';\nimport { resolve } from 'node:path';\n\nexport const PI_AGENT_DIR_ENV = 'PI_CODING_AGENT_DIR';\nexport const MY_PI_RUNTIME_MODE_ENV = 'MY_PI_RUNTIME_MODE';\n\ntype EnvSnapshot = Map<string, string | undefined>;\n\nexport function snapshot_env(\n\tenv: NodeJS.ProcessEnv,\n\tkeys: Iterable<string>,\n): EnvSnapshot {\n\treturn new Map(Array.from(keys, (key) => [key, env[key]]));\n}\n\nexport function restore_env(\n\tenv: NodeJS.ProcessEnv,\n\tsnapshot: EnvSnapshot,\n): void {\n\tfor (const [key, value] of snapshot) {\n\t\tif (value === undefined) delete env[key];\n\t\telse env[key] = value;\n\t}\n}\n\nexport function wrap_runtime_env_restore<\n\tT extends { dispose(): Promise<void> },\n>(runtime: T, restore: () => void): T {\n\tconst dispose = runtime.dispose.bind(runtime);\n\tlet restored = false;\n\tconst restore_once = () => {\n\t\tif (restored) return;\n\t\trestored = true;\n\t\trestore();\n\t};\n\n\truntime.dispose = (async () => {\n\t\ttry {\n\t\t\tawait dispose();\n\t\t} finally {\n\t\t\trestore_once();\n\t\t}\n\t}) as T['dispose'];\n\n\treturn runtime;\n}\n\nconst UNTRUSTED_CHILD_ENV_DEFAULTS: Record<string, string> = {\n\tMY_PI_CHILD_ENV_ALLOWLIST: '',\n\tMY_PI_MCP_ENV_ALLOWLIST: '',\n\tMY_PI_LSP_ENV_ALLOWLIST: '',\n\tMY_PI_HOOKS_ENV_ALLOWLIST: '',\n\tMY_PI_TEAM_MODE_ENV_ALLOWLIST: '',\n};\n\nexport function apply_untrusted_repo_defaults(\n\tenv: NodeJS.ProcessEnv = process.env,\n): string[] {\n\tconst applied = apply_project_trust_untrusted_defaults(env);\n\tfor (const [key, value] of Object.entries(\n\t\tUNTRUSTED_CHILD_ENV_DEFAULTS,\n\t)) {\n\t\tif (env[key] !== undefined) continue;\n\t\tenv[key] = value;\n\t\tapplied.push(key);\n\t}\n\treturn applied;\n}\n\nexport function is_resource_enabled(\n\tvalue: string | undefined,\n): boolean {\n\tconst normalized = value?.trim().toLowerCase();\n\tif (!normalized) return true;\n\tif (['0', 'false', 'no', 'skip', 'disable'].includes(normalized)) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nexport function resolve_agent_dir(\n\tcwd: string,\n\tagent_dir?: string,\n): string {\n\treturn agent_dir ? resolve(cwd, agent_dir) : getAgentDir();\n}\n","import {\n\tclampThinkingLevel,\n\ttype Api,\n\ttype Model,\n} from '@earendil-works/pi-ai';\nimport type { MyPiThinkingLevel } from './options.js';\n\ninterface ModelsLike {\n\tgetModels(): readonly Model<Api>[];\n}\n\nexport function resolve_model_reference(\n\tmodel_reference: string | undefined,\n\tmodels_runtime: ModelsLike,\n): Model<Api> | undefined {\n\tif (!model_reference) return undefined;\n\tconst models = models_runtime.getModels();\n\tconst lower_reference = model_reference.toLowerCase();\n\tconst slash_index = model_reference.indexOf('/');\n\n\tif (slash_index !== -1) {\n\t\tconst maybe_provider = model_reference.slice(0, slash_index);\n\t\tconst model_id = model_reference.slice(slash_index + 1);\n\t\tconst provider = models.find(\n\t\t\t(model) =>\n\t\t\t\tmodel.provider.toLowerCase() === maybe_provider.toLowerCase(),\n\t\t)?.provider;\n\n\t\tif (provider) {\n\t\t\tconst provider_match = models.find(\n\t\t\t\t(model) =>\n\t\t\t\t\tmodel.provider === provider &&\n\t\t\t\t\tmodel.id.toLowerCase() === model_id.toLowerCase(),\n\t\t\t);\n\t\t\tif (provider_match) return provider_match;\n\t\t}\n\t}\n\n\treturn models.find((model) => {\n\t\tconst id = model.id.toLowerCase();\n\t\tconst full_id = `${model.provider}/${model.id}`.toLowerCase();\n\t\treturn id === lower_reference || full_id === lower_reference;\n\t});\n}\n\nexport function resolve_effective_thinking_level(\n\tmodel: Model<Api> | undefined,\n\tthinking: MyPiThinkingLevel | undefined,\n): MyPiThinkingLevel | undefined {\n\tif (!thinking || !model) return thinking;\n\treturn clampThinkingLevel(model, thinking);\n}\n","import { SessionManager } from '@earendil-works/pi-coding-agent';\nimport { existsSync, readdirSync } from 'node:fs';\nimport { basename, isAbsolute, join, resolve } from 'node:path';\n\nfunction resolve_session_file(\n\tcwd: string,\n\tsession_dir: string | undefined,\n\tsession_ref: string | undefined,\n): string | undefined {\n\tif (!session_ref) return undefined;\n\tconst explicit_path = isAbsolute(session_ref)\n\t\t? session_ref\n\t\t: resolve(cwd, session_ref);\n\tif (existsSync(explicit_path)) return explicit_path;\n\tif (session_ref.endsWith('.jsonl')) return explicit_path;\n\n\tconst dir = session_dir ? resolve(cwd, session_dir) : undefined;\n\tif (!dir || !existsSync(dir)) return undefined;\n\tconst matches = readdirSync(dir)\n\t\t.filter(\n\t\t\t(file) =>\n\t\t\t\tfile.endsWith('.jsonl') &&\n\t\t\t\t(basename(file, '.jsonl').endsWith(session_ref) ||\n\t\t\t\t\tfile.includes(session_ref)),\n\t\t)\n\t\t.sort();\n\tconst match = matches.at(-1);\n\treturn match ? join(dir, match) : undefined;\n}\n\nexport function create_session_manager(options: {\n\tcwd: string;\n\tsession_dir?: string;\n\tsession?: string;\n\tsession_id?: string;\n\tstartup_session_name?: string;\n}): SessionManager {\n\tconst resolved_session_dir = options.session_dir\n\t\t? resolve(options.cwd, options.session_dir)\n\t\t: SessionManager.create(options.cwd).getSessionDir();\n\tconst session_ref = options.session ?? options.session_id;\n\tconst session_file = resolve_session_file(\n\t\toptions.cwd,\n\t\tresolved_session_dir,\n\t\tsession_ref,\n\t);\n\tconst session_manager = session_file\n\t\t? SessionManager.open(\n\t\t\t\tsession_file,\n\t\t\t\tresolved_session_dir,\n\t\t\t\toptions.cwd,\n\t\t\t)\n\t\t: SessionManager.create(\n\t\t\t\toptions.cwd,\n\t\t\t\tresolved_session_dir,\n\t\t\t\toptions.session_id ? { id: options.session_id } : {},\n\t\t\t);\n\tif (\n\t\toptions.startup_session_name &&\n\t\tsession_manager.getSessionName() !== options.startup_session_name\n\t) {\n\t\tsession_manager.appendSessionInfo(options.startup_session_name);\n\t}\n\treturn session_manager;\n}\n","import type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n} from '@earendil-works/pi-coding-agent';\nimport { type SettingItem } from '@earendil-works/pi-tui';\nimport { show_settings_modal } from '@spences10/pi-tui-modal';\nimport {\n\tBUILTIN_EXTENSIONS,\n\tfind_builtin_extension,\n\tload_builtin_extensions_config,\n\tresolve_builtin_extension_states,\n\tsave_builtin_extensions_config,\n\ttype BuiltinExtensionKey,\n\ttype BuiltinExtensionState,\n} from './config.js';\n\nconst ENABLED = '● enabled';\nconst DISABLED = '○ disabled';\n\nexport interface ExtensionsManagerOptions {\n\tforce_disabled?: Iterable<BuiltinExtensionKey>;\n}\n\nfunction to_force_disabled_set(\n\tforce_disabled?: Iterable<BuiltinExtensionKey>,\n): ReadonlySet<BuiltinExtensionKey> {\n\treturn new Set(force_disabled ?? []);\n}\n\nfunction format_effective_state(\n\tstate: BuiltinExtensionState,\n): string {\n\tif (state.effective_enabled) {\n\t\treturn 'enabled';\n\t}\n\tif (state.forced_disabled) {\n\t\treturn `disabled in this process by ${state.cli_flag}`;\n\t}\n\treturn 'disabled';\n}\n\nfunction format_extension_lines(\n\tstates: BuiltinExtensionState[],\n\toptions?: { heading?: string },\n): string {\n\tconst lines: string[] = [];\n\tif (options?.heading) {\n\t\tlines.push(options.heading, '');\n\t}\n\n\tconst enabled_now = states.filter(\n\t\t(state) => state.effective_enabled,\n\t).length;\n\tconst disabled_now = states.length - enabled_now;\n\tlines.push(\n\t\t`${states.length} built-in extensions (${enabled_now} enabled now, ${disabled_now} disabled now)`,\n\t\t'',\n\t);\n\n\tfor (const state of states) {\n\t\tlines.push(\n\t\t\t`${state.saved_enabled ? ENABLED : DISABLED} ${state.label}`,\n\t\t);\n\t\tlines.push(` key: ${state.key}`);\n\t\tlines.push(\n\t\t\t` saved config: ${state.saved_enabled ? 'enabled' : 'disabled'}`,\n\t\t);\n\t\tlines.push(\n\t\t\t` current process: ${format_effective_state(state)}`,\n\t\t);\n\t\tlines.push(` ${state.description}`);\n\t}\n\n\treturn lines.join('\\n');\n}\n\nfunction to_setting_item(state: BuiltinExtensionState): SettingItem {\n\tconst detail_lines = [\n\t\tstate.key,\n\t\tstate.description,\n\t\t`current process: ${format_effective_state(state)}`,\n\t\t`startup override: ${state.cli_flag}`,\n\t];\n\n\treturn {\n\t\tid: state.key,\n\t\tlabel: state.label,\n\t\tdescription: detail_lines.join('\\n'),\n\t\tcurrentValue: state.saved_enabled ? ENABLED : DISABLED,\n\t\tvalues: [ENABLED, DISABLED],\n\t};\n}\n\nfunction sets_equal(\n\ta: ReadonlySet<string>,\n\tb: ReadonlySet<string>,\n): boolean {\n\tif (a.size !== b.size) return false;\n\tfor (const value of a) {\n\t\tif (!b.has(value)) return false;\n\t}\n\treturn true;\n}\n\nfunction search_states(\n\tstates: BuiltinExtensionState[],\n\tquery: string,\n): BuiltinExtensionState[] {\n\tconst normalized = query.trim().toLowerCase();\n\tif (!normalized) return states;\n\n\treturn states.filter((state) =>\n\t\t[\n\t\t\tstate.key,\n\t\t\tstate.label,\n\t\t\tstate.description,\n\t\t\t...state.aliases,\n\t\t].some((value) => value.toLowerCase().includes(normalized)),\n\t);\n}\n\nfunction save_extension_enabled(\n\tkey: BuiltinExtensionKey,\n\tenabled: boolean,\n): void {\n\tconst config = load_builtin_extensions_config();\n\tconfig.enabled[key] = enabled;\n\tsave_builtin_extensions_config(config);\n}\n\nexport function create_extensions_extension(\n\toptions: ExtensionsManagerOptions = {},\n) {\n\tconst force_disabled = to_force_disabled_set(\n\t\toptions.force_disabled,\n\t);\n\n\tasync function show_manager(\n\t\tctx: ExtensionCommandContext,\n\t): Promise<boolean> {\n\t\tif (!ctx.hasUI) return false;\n\n\t\tconst states = resolve_builtin_extension_states(force_disabled);\n\t\tconst initial_enabled = new Set(\n\t\t\tstates\n\t\t\t\t.filter((state) => state.saved_enabled)\n\t\t\t\t.map((state) => state.key),\n\t\t);\n\t\tconst current_enabled = new Set(initial_enabled);\n\n\t\tconst items = states.map(to_setting_item);\n\t\tawait show_settings_modal(ctx, {\n\t\t\ttitle: 'Built-in extensions',\n\t\t\tsubtitle: () => {\n\t\t\t\tconst saved_enabled = current_enabled.size;\n\t\t\t\tconst saved_disabled = states.length - saved_enabled;\n\t\t\t\tconst enabled_now = [...current_enabled].filter(\n\t\t\t\t\t(key) => !force_disabled.has(key as BuiltinExtensionKey),\n\t\t\t\t).length;\n\t\t\t\tconst disabled_now = states.length - enabled_now;\n\t\t\t\treturn `${saved_enabled} saved enabled • ${saved_disabled} saved disabled • ${enabled_now} enabled now • ${disabled_now} disabled now`;\n\t\t\t},\n\t\t\titems,\n\t\t\tenable_search: true,\n\t\t\tfooter:\n\t\t\t\t'esc close • search filters • changes save immediately • CLI --no-* flags still win in this process',\n\t\t\ton_change: (id, new_value) => {\n\t\t\t\tconst key = id as BuiltinExtensionKey;\n\t\t\t\tconst enabled = new_value === ENABLED;\n\t\t\t\tif (enabled) {\n\t\t\t\t\tcurrent_enabled.add(key);\n\t\t\t\t} else {\n\t\t\t\t\tcurrent_enabled.delete(key);\n\t\t\t\t}\n\t\t\t\tsave_extension_enabled(key, enabled);\n\t\t\t},\n\t\t});\n\n\t\tif (!sets_equal(initial_enabled, current_enabled)) {\n\t\t\tctx.ui.notify(\n\t\t\t\tforce_disabled.size > 0\n\t\t\t\t\t? 'Reloading to apply updated built-in extensions. CLI --no-* flags still force-disable some extensions in this process.'\n\t\t\t\t\t: 'Reloading to apply updated built-in extensions...',\n\t\t\t\t'info',\n\t\t\t);\n\t\t\tawait ctx.reload();\n\t\t}\n\n\t\treturn true;\n\t}\n\n\treturn async function extensions(pi: ExtensionAPI) {\n\t\tconst subs = ['list', 'enable', 'disable', 'toggle', 'search'];\n\n\t\tpi.registerCommand('extensions', {\n\t\t\tdescription: 'Manage built-in my-pi extensions',\n\t\t\tgetArgumentCompletions: (prefix) => {\n\t\t\t\tconst parts = prefix.trim().split(/\\s+/);\n\t\t\t\tif (parts.length <= 1) {\n\t\t\t\t\treturn subs\n\t\t\t\t\t\t.filter((sub) => sub.startsWith(parts[0] || ''))\n\t\t\t\t\t\t.map((sub) => ({ value: sub, label: sub }));\n\t\t\t\t}\n\n\t\t\t\tif (['enable', 'disable', 'toggle'].includes(parts[0])) {\n\t\t\t\t\tconst q = parts.slice(1).join(' ').toLowerCase();\n\t\t\t\t\treturn resolve_builtin_extension_states(force_disabled)\n\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t(state) =>\n\t\t\t\t\t\t\t\tstate.key.toLowerCase().includes(q) ||\n\t\t\t\t\t\t\t\tstate.label.toLowerCase().includes(q),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.slice(0, 20)\n\t\t\t\t\t\t.map((state) => ({\n\t\t\t\t\t\t\tvalue: `${parts[0]} ${state.key}`,\n\t\t\t\t\t\t\tlabel: `${state.key} ${state.saved_enabled ? ENABLED : DISABLED}`,\n\t\t\t\t\t\t}));\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t},\n\t\t\thandler: async (args, ctx) => {\n\t\t\t\tconst trimmed = args.trim();\n\n\t\t\t\tif (!trimmed) {\n\t\t\t\t\tif (await show_manager(ctx)) return;\n\t\t\t\t}\n\n\t\t\t\tconst [sub, ...rest] = (trimmed || 'list').split(/\\s+/);\n\t\t\t\tconst arg = rest.join(' ');\n\t\t\t\tconst states =\n\t\t\t\t\tresolve_builtin_extension_states(force_disabled);\n\n\t\t\t\tswitch (sub) {\n\t\t\t\t\tcase 'list': {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\tformat_extension_lines(states, {\n\t\t\t\t\t\t\t\theading: 'Built-in extensions',\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'enable':\n\t\t\t\t\tcase 'disable':\n\t\t\t\t\tcase 'toggle': {\n\t\t\t\t\t\tif (!arg) {\n\t\t\t\t\t\t\tif (await show_manager(ctx)) return;\n\t\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t\t`Usage: /extensions ${sub} <key>`,\n\t\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst extension = find_builtin_extension(arg);\n\t\t\t\t\t\tif (!extension) {\n\t\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t\t`Unknown extension: ${arg}. Use: ${BUILTIN_EXTENSIONS.map((item) => item.key).join(', ')}`,\n\t\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst current_state = states.find(\n\t\t\t\t\t\t\t(state) => state.key === extension.key,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst next_enabled =\n\t\t\t\t\t\t\tsub === 'enable'\n\t\t\t\t\t\t\t\t? true\n\t\t\t\t\t\t\t\t: sub === 'disable'\n\t\t\t\t\t\t\t\t\t? false\n\t\t\t\t\t\t\t\t\t: !current_state?.saved_enabled;\n\t\t\t\t\t\tsave_extension_enabled(extension.key, next_enabled);\n\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\tnext_enabled && force_disabled.has(extension.key)\n\t\t\t\t\t\t\t\t? `Enabled ${extension.key} in saved config. Still disabled in this process by ${extension.cli_flag}. /reload or restart without that flag to apply.`\n\t\t\t\t\t\t\t\t: `${extension.key} ${next_enabled ? 'enabled' : 'disabled'}. /reload to apply.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'search': {\n\t\t\t\t\t\tif (!arg) {\n\t\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t\t'Usage: /extensions search <query>',\n\t\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst results = search_states(states, arg);\n\t\t\t\t\t\tif (results.length === 0) {\n\t\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t\t`No built-in extensions matching \"${arg}\"`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\tformat_extension_lines(results, {\n\t\t\t\t\t\t\t\theading: `Built-in extensions matching \"${arg}\"`,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t`Unknown: ${sub}. Use: ${subs.join(', ')}`,\n\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t};\n}\n\nexport default create_extensions_extension();\n","// Composable programmatic API for my-pi\n\nimport {\n\tInteractiveMode,\n\tcreateAgentSessionFromServices,\n\tcreateAgentSessionRuntime,\n\tcreateAgentSessionServices,\n\trunPrintMode,\n\trunRpcMode,\n\ttype CreateAgentSessionFromServicesOptions,\n\ttype CreateAgentSessionServicesOptions,\n\ttype InlineExtension,\n\ttype SessionManager,\n} from '@earendil-works/pi-coding-agent';\nimport { resolve } from 'node:path';\nimport {\n\tMANAGED_INLINE_EXTENSION_NAME_PREFIX,\n\tPACKAGE_THEME_DIR,\n\tassert_unreserved_inline_extension_names,\n\tcreate_extensions_override,\n\tcreate_lazy_builtin_extension_factory,\n\tcreate_lazy_telemetry_extension,\n\tget_externally_installed_builtin_extensions,\n\tget_force_disabled_builtins,\n\twarn_builtin_extension_unavailable,\n} from './api/builtin-extensions.js';\nimport {\n\tMY_PI_RUNTIME_MODE_ENV,\n\tPI_AGENT_DIR_ENV,\n\tapply_untrusted_repo_defaults,\n\tis_resource_enabled,\n\tresolve_agent_dir,\n\trestore_env,\n\tsnapshot_env,\n\twrap_runtime_env_restore,\n} from './api/env.js';\nimport {\n\tresolve_effective_thinking_level,\n\tresolve_model_reference,\n} from './api/models.js';\nimport type { CreateMyPiOptions } from './api/options.js';\nimport { create_session_manager } from './api/session.js';\nimport { BUILTIN_EXTENSION_REGISTRY } from './extensions/builtin-registry.js';\nimport {\n\tis_builtin_extension_active,\n\tload_builtin_extensions_config,\n} from './extensions/manager/config.js';\nimport { create_extensions_extension } from './extensions/manager/index.js';\n\nexport type {\n\tCreateMyPiOptions,\n\tMyPiRuntimeMode,\n\tMyPiThinkingLevel,\n} from './api/options.js';\nexport {\n\tapply_untrusted_repo_defaults,\n\tcreate_lazy_builtin_extension_factory,\n\tget_externally_installed_builtin_extensions,\n\tget_force_disabled_builtins,\n\tresolve_effective_thinking_level,\n\tresolve_model_reference,\n};\n\nexport async function create_my_pi(options: CreateMyPiOptions = {}) {\n\tconst {\n\t\tcwd = process.cwd(),\n\t\tagent_dir,\n\t\textensions = [],\n\t\textensionFactories: user_factories = [],\n\t\textension_flag_values,\n\t\truntime_mode = 'interactive',\n\t\ttelemetry,\n\t\ttelemetry_db_path,\n\t\tmodel,\n\t\tthinking,\n\t\tselected_tools,\n\t\texcluded_tools,\n\t\tselected_skills,\n\t\tsession,\n\t\tsession_id,\n\t\tstartup_session_name,\n\t\tsession_dir,\n\t\tsystem_prompt,\n\t\tappend_system_prompt,\n\t\tuntrusted_repo = false,\n\t} = options;\n\n\tassert_unreserved_inline_extension_names(user_factories);\n\n\tconst env_keys_to_restore = new Set<string>([\n\t\tMY_PI_RUNTIME_MODE_ENV,\n\t]);\n\tif (agent_dir) env_keys_to_restore.add(PI_AGENT_DIR_ENV);\n\tconst env_snapshot = snapshot_env(process.env, env_keys_to_restore);\n\tlet restore_runtime_env = () =>\n\t\trestore_env(process.env, env_snapshot);\n\n\tif (untrusted_repo) {\n\t\tconst applied = apply_untrusted_repo_defaults();\n\t\tif (applied.length) {\n\t\t\tconst restore_previous = restore_runtime_env;\n\t\t\trestore_runtime_env = () => {\n\t\t\t\tfor (const key of applied) delete process.env[key];\n\t\t\t\trestore_previous();\n\t\t\t};\n\t\t}\n\t}\n\n\tconst effective_agent_dir = resolve_agent_dir(cwd, agent_dir);\n\tif (agent_dir) {\n\t\tprocess.env[PI_AGENT_DIR_ENV] = effective_agent_dir;\n\t}\n\tprocess.env[MY_PI_RUNTIME_MODE_ENV] = runtime_mode;\n\n\tconst resolved_extensions = extensions.map((p) => resolve(cwd, p));\n\tconst force_disabled = get_force_disabled_builtins({\n\t\t...options,\n\t\truntime_mode,\n\t});\n\tfor (const key of get_externally_installed_builtin_extensions(\n\t\teffective_agent_dir,\n\t)) {\n\t\tforce_disabled.add(key);\n\t}\n\tconst builtins_config = load_builtin_extensions_config();\n\tconst skills_builtin_enabled = is_builtin_extension_active(\n\t\tbuiltins_config,\n\t\t'skills',\n\t\tforce_disabled,\n\t);\n\tconst skills_package = skills_builtin_enabled\n\t\t? await import('@spences10/pi-skills').catch((error) => {\n\t\t\t\twarn_builtin_extension_unavailable('skills', error);\n\t\t\t\treturn undefined;\n\t\t\t})\n\t\t: undefined;\n\n\tconst managed_inline_extensions = [\n\t\t{\n\t\t\tname: `${MANAGED_INLINE_EXTENSION_NAME_PREFIX}telemetry`,\n\t\t\tfactory: create_lazy_telemetry_extension({\n\t\t\t\tenabled: telemetry,\n\t\t\t\tdb_path: telemetry_db_path,\n\t\t\t\tcwd,\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: `${MANAGED_INLINE_EXTENSION_NAME_PREFIX}extensions-manager`,\n\t\t\tfactory: create_extensions_extension({ force_disabled }),\n\t\t},\n\t\t...BUILTIN_EXTENSION_REGISTRY.map((extension) => ({\n\t\t\tname: `${MANAGED_INLINE_EXTENSION_NAME_PREFIX}${extension.key}`,\n\t\t\tfactory: create_lazy_builtin_extension_factory(\n\t\t\t\textension.key,\n\t\t\t\textension.load,\n\t\t\t\tforce_disabled,\n\t\t\t),\n\t\t})),\n\t] satisfies InlineExtension[];\n\tconst managed_extension_paths = managed_inline_extensions.map(\n\t\t(extension) => `<inline:${extension.name}>`,\n\t);\n\n\tconst create_runtime = async ({\n\t\tcwd: runtime_cwd,\n\t\tsessionManager,\n\t\tsessionStartEvent,\n\t}: {\n\t\tcwd: string;\n\t\tsessionManager: SessionManager;\n\t\tsessionStartEvent?: CreateAgentSessionFromServicesOptions['sessionStartEvent'];\n\t}) => {\n\t\t// Keep skill filtering reloadable so profile changes made by\n\t\t// /skills are reflected without restarting the process.\n\t\tconst runtime_skills_manager =\n\t\t\tskills_package?.create_skills_manager({\n\t\t\t\tcwd: runtime_cwd,\n\t\t\t\tproject_skills_enabled: is_resource_enabled(\n\t\t\t\t\tprocess.env.MY_PI_PROJECT_SKILLS,\n\t\t\t\t),\n\t\t\t});\n\t\tconst additional_skill_paths =\n\t\t\truntime_skills_manager?.get_enabled_skill_paths() ?? [];\n\n\t\tconst services = await createAgentSessionServices({\n\t\t\tcwd: runtime_cwd,\n\t\t\tagentDir: effective_agent_dir,\n\t\t\textensionFlagValues: extension_flag_values,\n\t\t\tresourceLoaderOptions: {\n\t\t\t\t...(additional_skill_paths.length\n\t\t\t\t\t? { additionalSkillPaths: additional_skill_paths }\n\t\t\t\t\t: {}),\n\t\t\t\t...(system_prompt !== undefined\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tsystemPromptOverride: () => system_prompt,\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t\t...(append_system_prompt !== undefined\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tappendSystemPromptOverride: (base: string[]) => [\n\t\t\t\t\t\t\t\t...base,\n\t\t\t\t\t\t\t\tappend_system_prompt,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t\tadditionalExtensionPaths: [...resolved_extensions],\n\t\t\t\t...(runtime_mode === 'interactive'\n\t\t\t\t\t? { additionalThemePaths: [PACKAGE_THEME_DIR] }\n\t\t\t\t\t: {}),\n\t\t\t\textensionFactories: [\n\t\t\t\t\t...managed_inline_extensions,\n\t\t\t\t\t...user_factories,\n\t\t\t\t],\n\t\t\t\textensionsOverride: create_extensions_override(\n\t\t\t\t\tmanaged_extension_paths,\n\t\t\t\t),\n\t\t\t\tskillsOverride: (\n\t\t\t\t\tbase: Parameters<\n\t\t\t\t\t\tNonNullable<\n\t\t\t\t\t\t\tNonNullable<\n\t\t\t\t\t\t\t\tCreateAgentSessionServicesOptions['resourceLoaderOptions']\n\t\t\t\t\t\t\t>['skillsOverride']\n\t\t\t\t\t\t>\n\t\t\t\t\t>[0],\n\t\t\t\t) => {\n\t\t\t\t\tif (!skills_builtin_enabled) return { ...base, skills: [] };\n\t\t\t\t\tif (!runtime_skills_manager) return base;\n\t\t\t\t\truntime_skills_manager.refresh();\n\n\t\t\t\t\tconst selected_skill_names = selected_skills?.length\n\t\t\t\t\t\t? new Set(selected_skills)\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...base,\n\t\t\t\t\t\tskills: base.skills.filter((skill) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tselected_skill_names &&\n\t\t\t\t\t\t\t\t!selected_skill_names.has(skill.name)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn runtime_skills_manager.is_enabled_by_skill(\n\t\t\t\t\t\t\t\tskill.name,\n\t\t\t\t\t\t\t\tskill.filePath,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}),\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t} satisfies CreateAgentSessionServicesOptions['resourceLoaderOptions'],\n\t\t});\n\n\t\tconst requested_model = resolve_model_reference(\n\t\t\tmodel,\n\t\t\tservices.modelRuntime,\n\t\t);\n\t\tconst effective_thinking = resolve_effective_thinking_level(\n\t\t\trequested_model,\n\t\t\tthinking,\n\t\t);\n\t\tif (\n\t\t\trequested_model &&\n\t\t\tthinking &&\n\t\t\teffective_thinking &&\n\t\t\teffective_thinking !== thinking\n\t\t) {\n\t\t\tservices.diagnostics.push({\n\t\t\t\ttype: 'warning',\n\t\t\t\tmessage: `Requested thinking level \"${thinking}\" is not supported by ${requested_model.provider}/${requested_model.id}; using \"${effective_thinking}\".`,\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\t...(await createAgentSessionFromServices({\n\t\t\t\tservices,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent,\n\t\t\t\t...(requested_model ? { model: requested_model } : {}),\n\t\t\t\t...(effective_thinking\n\t\t\t\t\t? { thinkingLevel: effective_thinking }\n\t\t\t\t\t: {}),\n\t\t\t\t...(selected_tools?.length ? { tools: selected_tools } : {}),\n\t\t\t\t...(excluded_tools?.length\n\t\t\t\t\t? { excludeTools: excluded_tools }\n\t\t\t\t\t: {}),\n\t\t\t})),\n\t\t\tservices,\n\t\t\tdiagnostics: services.diagnostics,\n\t\t};\n\t};\n\n\ttry {\n\t\treturn wrap_runtime_env_restore(\n\t\t\tawait createAgentSessionRuntime(create_runtime, {\n\t\t\t\tcwd,\n\t\t\t\tagentDir: effective_agent_dir,\n\t\t\t\tsessionManager: create_session_manager({\n\t\t\t\t\tcwd,\n\t\t\t\t\tsession_dir,\n\t\t\t\t\tsession,\n\t\t\t\t\tsession_id,\n\t\t\t\t\tstartup_session_name,\n\t\t\t\t}),\n\t\t\t}),\n\t\t\trestore_runtime_env,\n\t\t);\n\t} catch (error) {\n\t\trestore_runtime_env();\n\t\tthrow error;\n\t}\n}\n\nexport { InteractiveMode, runPrintMode, runRpcMode };\n\nexport type {\n\tAgentSessionRuntime,\n\tExtensionFactory,\n\tInlineExtension,\n\tInteractiveModeOptions,\n\tPrintModeOptions,\n} from '@earendil-works/pi-coding-agent';\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/extensions/builtin-registry.ts
|
|
2
2
|
const BUILTIN_EXTENSION_REGISTRY = [
|
|
3
3
|
{
|
|
4
4
|
key: "context-sidecar",
|
|
@@ -43,7 +43,7 @@ const BUILTIN_EXTENSION_REGISTRY = [
|
|
|
43
43
|
cli_flag: "--no-openrouter-fusion-config",
|
|
44
44
|
cli_description: "Disable OpenRouter Fusion non-Anthropic config",
|
|
45
45
|
aliases: ["openrouter-fusion-config", "fusion-budget"],
|
|
46
|
-
load: async () => (await import("./openrouter-fusion-config-
|
|
46
|
+
load: async () => (await import("./openrouter-fusion-config-CPXLfmCA.js")).default
|
|
47
47
|
},
|
|
48
48
|
{
|
|
49
49
|
key: "umans-provider",
|
|
@@ -56,7 +56,7 @@ const BUILTIN_EXTENSION_REGISTRY = [
|
|
|
56
56
|
cli_flag: "--no-umans-provider",
|
|
57
57
|
cli_description: "Disable built-in Umans provider",
|
|
58
58
|
aliases: ["umans-provider", "umans"],
|
|
59
|
-
load: async () => (await import("./umans-provider-
|
|
59
|
+
load: async () => (await import("./umans-provider-DIupQTRK.js")).default
|
|
60
60
|
},
|
|
61
61
|
{
|
|
62
62
|
key: "footer",
|
|
@@ -355,7 +355,7 @@ const BUILTIN_EXTENSION_REGISTRY = [
|
|
|
355
355
|
],
|
|
356
356
|
reason: "Startup screen only renders in the interactive TUI"
|
|
357
357
|
},
|
|
358
|
-
load: async () => (await import("./startup-screen-
|
|
358
|
+
load: async () => (await import("./startup-screen-D5YGuwge.js")).default
|
|
359
359
|
},
|
|
360
360
|
{
|
|
361
361
|
key: "prompt-presets",
|
|
@@ -372,7 +372,7 @@ const BUILTIN_EXTENSION_REGISTRY = [
|
|
|
372
372
|
"preset",
|
|
373
373
|
"presets"
|
|
374
374
|
],
|
|
375
|
-
load: async () => (await import("./prompt-presets-
|
|
375
|
+
load: async () => (await import("./prompt-presets-DOn1oZFJ.js")).default
|
|
376
376
|
},
|
|
377
377
|
{
|
|
378
378
|
key: "turn-timer",
|
|
@@ -397,7 +397,7 @@ const BUILTIN_EXTENSION_REGISTRY = [
|
|
|
397
397
|
],
|
|
398
398
|
reason: "The live timer is only useful in the interactive TUI"
|
|
399
399
|
},
|
|
400
|
-
load: async () => (await import("./turn-timer-
|
|
400
|
+
load: async () => (await import("./turn-timer-mowT6nwv.js")).default
|
|
401
401
|
},
|
|
402
402
|
{
|
|
403
403
|
key: "git-ui",
|
|
@@ -463,7 +463,7 @@ const BUILTIN_EXTENSION_REGISTRY = [
|
|
|
463
463
|
],
|
|
464
464
|
reason: "UI-only session naming is only useful in interactive mode"
|
|
465
465
|
},
|
|
466
|
-
load: async () => (await import("./session-name-
|
|
466
|
+
load: async () => (await import("./session-name-qyrX-OES.js")).default
|
|
467
467
|
},
|
|
468
468
|
{
|
|
469
469
|
key: "confirm-destructive",
|
|
@@ -490,7 +490,7 @@ const BUILTIN_EXTENSION_REGISTRY = [
|
|
|
490
490
|
cli_flag: "--no-hooks",
|
|
491
491
|
cli_description: "Disable Claude-style hook execution",
|
|
492
492
|
aliases: ["hooks-resolution", "hooks"],
|
|
493
|
-
load: async () => (await import("./hooks-resolution-
|
|
493
|
+
load: async () => (await import("./hooks-resolution-kzoVsQAX.js")).default
|
|
494
494
|
},
|
|
495
495
|
{
|
|
496
496
|
key: "svelte-guardrails",
|
|
@@ -535,7 +535,7 @@ const BUILTIN_EXTENSION_REGISTRY = [
|
|
|
535
535
|
cli_flag: "--no-handoff",
|
|
536
536
|
cli_description: "Disable handoff helper command",
|
|
537
537
|
aliases: ["handoff", "continuation"],
|
|
538
|
-
load: async () => (await import("./handoff-
|
|
538
|
+
load: async () => (await import("./handoff-B2wpybTf.js")).default
|
|
539
539
|
},
|
|
540
540
|
{
|
|
541
541
|
key: "team-mode",
|
|
@@ -557,7 +557,6 @@ const BUILTIN_EXTENSION_REGISTRY = [
|
|
|
557
557
|
}
|
|
558
558
|
];
|
|
559
559
|
const BUILTIN_EXTENSIONS = BUILTIN_EXTENSION_REGISTRY.map(({ load: _load, ...extension }) => extension);
|
|
560
|
-
//#endregion
|
|
561
560
|
export { BUILTIN_EXTENSION_REGISTRY as n, BUILTIN_EXTENSIONS as t };
|
|
562
561
|
|
|
563
|
-
//# sourceMappingURL=builtin-registry-
|
|
562
|
+
//# sourceMappingURL=builtin-registry-C0CQdd45.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builtin-registry-wSfsQBi4.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: 'kimi-usage',\n\t\tlabel: 'Kimi usage',\n\t\tdocs_label: 'Kimi usage status',\n\t\tdescription: 'Kimi For Coding usage status for the footer',\n\t\tdefault_enabled: true,\n\t\toption_name: 'kimi_usage',\n\t\tcli_arg: 'no-kimi-usage',\n\t\tcli_flag: '--no-kimi-usage',\n\t\tcli_description: 'Disable Kimi usage footer status',\n\t\taliases: ['kimi-usage', 'kimi-status'],\n\t\texternal_package_name: '@spences10/pi-kimi-usage',\n\t\tload: async () =>\n\t\t\t(await import('@spences10/pi-kimi-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: 'talk',\n\t\tlabel: 'Talk',\n\t\tdocs_label: 'Hold-Space dictation',\n\t\tdescription: 'Hold Space to dictate into the input editor',\n\t\tdefault_enabled: true,\n\t\toption_name: 'talk',\n\t\tcli_arg: 'no-talk',\n\t\tcli_flag: '--no-talk',\n\t\tcli_description: 'Disable hold-Space dictation',\n\t\taliases: ['talk', 'voice', 'dictation'],\n\t\texternal_package_name: '@spences10/pi-talk',\n\t\tmode_constraints: {\n\t\t\tdisabled_in: ['print', 'json', 'rpc'],\n\t\t\treason: 'Talk requires the interactive TUI',\n\t\t},\n\t\tload: async () => (await import('@spences10/pi-talk')).default,\n\t},\n\t{\n\t\tkey: 'starfield',\n\t\tlabel: 'Starfield',\n\t\tdocs_label: 'Starfield',\n\t\tdescription: 'Subtle twinkling stars in the input editor',\n\t\tdefault_enabled: true,\n\t\toption_name: 'starfield',\n\t\tcli_arg: 'no-starfield',\n\t\tcli_flag: '--no-starfield',\n\t\tcli_description: 'Disable the input star field',\n\t\taliases: ['starfield', 'stars'],\n\t\texternal_package_name: '@spences10/pi-starfield',\n\t\tmode_constraints: {\n\t\t\tdisabled_in: ['print', 'json', 'rpc'],\n\t\t\treason: 'Starfield only renders in the interactive TUI',\n\t\t},\n\t\tload: async () =>\n\t\t\t(await import('@spences10/pi-starfield')).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":"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"}
|
|
1
|
+
{"version":3,"file":"builtin-registry-C0CQdd45.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: 'kimi-usage',\n\t\tlabel: 'Kimi usage',\n\t\tdocs_label: 'Kimi usage status',\n\t\tdescription: 'Kimi For Coding usage status for the footer',\n\t\tdefault_enabled: true,\n\t\toption_name: 'kimi_usage',\n\t\tcli_arg: 'no-kimi-usage',\n\t\tcli_flag: '--no-kimi-usage',\n\t\tcli_description: 'Disable Kimi usage footer status',\n\t\taliases: ['kimi-usage', 'kimi-status'],\n\t\texternal_package_name: '@spences10/pi-kimi-usage',\n\t\tload: async () =>\n\t\t\t(await import('@spences10/pi-kimi-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: 'talk',\n\t\tlabel: 'Talk',\n\t\tdocs_label: 'Hold-Space dictation',\n\t\tdescription: 'Hold Space to dictate into the input editor',\n\t\tdefault_enabled: true,\n\t\toption_name: 'talk',\n\t\tcli_arg: 'no-talk',\n\t\tcli_flag: '--no-talk',\n\t\tcli_description: 'Disable hold-Space dictation',\n\t\taliases: ['talk', 'voice', 'dictation'],\n\t\texternal_package_name: '@spences10/pi-talk',\n\t\tmode_constraints: {\n\t\t\tdisabled_in: ['print', 'json', 'rpc'],\n\t\t\treason: 'Talk requires the interactive TUI',\n\t\t},\n\t\tload: async () => (await import('@spences10/pi-talk')).default,\n\t},\n\t{\n\t\tkey: 'starfield',\n\t\tlabel: 'Starfield',\n\t\tdocs_label: 'Starfield',\n\t\tdescription: 'Subtle twinkling stars in the input editor',\n\t\tdefault_enabled: true,\n\t\toption_name: 'starfield',\n\t\tcli_arg: 'no-starfield',\n\t\tcli_flag: '--no-starfield',\n\t\tcli_description: 'Disable the input star field',\n\t\taliases: ['starfield', 'stars'],\n\t\texternal_package_name: '@spences10/pi-starfield',\n\t\tmode_constraints: {\n\t\t\tdisabled_in: ['print', 'json', 'rpc'],\n\t\t\treason: 'Starfield only renders in the interactive TUI',\n\t\t},\n\t\tload: async () =>\n\t\t\t(await import('@spences10/pi-starfield')).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":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/extensions/handoff/index.ts
|
|
2
2
|
const HANDOFF_GUIDE = `Handoff in Pi
|
|
3
3
|
|
|
4
4
|
Use built-ins first:
|
|
@@ -22,7 +22,6 @@ function handoff(pi) {
|
|
|
22
22
|
}
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
|
-
//#endregion
|
|
26
25
|
export { handoff as default };
|
|
27
26
|
|
|
28
|
-
//# sourceMappingURL=handoff-
|
|
27
|
+
//# sourceMappingURL=handoff-B2wpybTf.js.map
|