my-pi 0.3.6 → 0.4.1
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/README.md +32 -252
- package/dist/extensions.d.ts +11 -0
- package/dist/extensions.js +148 -0
- package/dist/extensions.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +40 -519
- package/dist/index.js.map +1 -1
- package/dist/manager.d.ts +3 -0
- package/dist/manager.js +71 -0
- package/dist/manager.js.map +1 -0
- package/dist/settings.d.ts +3 -0
- package/dist/settings.js +16 -0
- package/dist/settings.js.map +1 -0
- package/package.json +31 -76
- package/dist/api.d.ts +0 -472
- package/dist/api.js +0 -525
- package/dist/api.js.map +0 -1
- package/dist/builtin-registry-C0CQdd45.js +0 -562
- package/dist/builtin-registry-C0CQdd45.js.map +0 -1
- package/dist/footer-BAZIMVSb.js +0 -1
- package/dist/handoff-B2wpybTf.js +0 -27
- package/dist/handoff-B2wpybTf.js.map +0 -1
- package/dist/hooks-resolution-kzoVsQAX.js +0 -478
- package/dist/hooks-resolution-kzoVsQAX.js.map +0 -1
- package/dist/openrouter-fusion-config-CPXLfmCA.js +0 -64
- package/dist/openrouter-fusion-config-CPXLfmCA.js.map +0 -1
- package/dist/prompt-presets-DOn1oZFJ.js +0 -1392
- package/dist/prompt-presets-DOn1oZFJ.js.map +0 -1
- package/dist/session-name-qyrX-OES.js +0 -157
- package/dist/session-name-qyrX-OES.js.map +0 -1
- package/dist/settings-UYlhEo3S.js +0 -172
- package/dist/settings-UYlhEo3S.js.map +0 -1
- package/dist/startup-screen-D5YGuwge.js +0 -217
- package/dist/startup-screen-D5YGuwge.js.map +0 -1
- package/dist/turn-timer-mowT6nwv.js +0 -63
- package/dist/turn-timer-mowT6nwv.js.map +0 -1
- package/dist/umans-provider-DIupQTRK.js +0 -306
- package/dist/umans-provider-DIupQTRK.js.map +0 -1
package/dist/api.js
DELETED
|
@@ -1,525 +0,0 @@
|
|
|
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
|
-
import { createRequire } from "node:module";
|
|
4
|
-
import { existsSync, readdirSync } from "node:fs";
|
|
5
|
-
import { basename, dirname, isAbsolute, join, resolve } from "node:path";
|
|
6
|
-
import { InteractiveMode, SessionManager, createAgentSessionFromServices, createAgentSessionRuntime, createAgentSessionServices, getAgentDir, runPrintMode, runRpcMode } from "@earendil-works/pi-coding-agent";
|
|
7
|
-
import { apply_project_trust_untrusted_defaults } from "@spences10/pi-project-trust";
|
|
8
|
-
import { clampThinkingLevel } from "@earendil-works/pi-ai";
|
|
9
|
-
import { show_settings_modal } from "@spences10/pi-tui-modal";
|
|
10
|
-
// src/extensions/manager/config.ts
|
|
11
|
-
function load_builtin_extensions_config() {
|
|
12
|
-
const settings = load_settings();
|
|
13
|
-
const enabled = {};
|
|
14
|
-
for (const extension of BUILTIN_EXTENSIONS) {
|
|
15
|
-
const value = settings.extensions.enabled[extension.key];
|
|
16
|
-
if (typeof value === "boolean") enabled[extension.key] = value;
|
|
17
|
-
}
|
|
18
|
-
return {
|
|
19
|
-
version: 1,
|
|
20
|
-
enabled
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
function save_builtin_extensions_config(config) {
|
|
24
|
-
const settings = load_settings();
|
|
25
|
-
save_settings({
|
|
26
|
-
...settings,
|
|
27
|
-
extensions: {
|
|
28
|
-
...settings.extensions,
|
|
29
|
-
enabled: config.enabled
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
function is_builtin_extension_enabled(config, key) {
|
|
34
|
-
return config.enabled[key] ?? true;
|
|
35
|
-
}
|
|
36
|
-
function is_builtin_extension_active(config, key, force_disabled = /* @__PURE__ */ new Set()) {
|
|
37
|
-
return is_builtin_extension_enabled(config, key) && !force_disabled.has(key);
|
|
38
|
-
}
|
|
39
|
-
function resolve_builtin_extension_states(force_disabled = /* @__PURE__ */ new Set(), config = load_builtin_extensions_config()) {
|
|
40
|
-
return BUILTIN_EXTENSIONS.map((extension) => {
|
|
41
|
-
const saved_enabled = is_builtin_extension_enabled(config, extension.key);
|
|
42
|
-
const forced = force_disabled.has(extension.key);
|
|
43
|
-
return {
|
|
44
|
-
...extension,
|
|
45
|
-
saved_enabled,
|
|
46
|
-
effective_enabled: saved_enabled && !forced,
|
|
47
|
-
forced_disabled: forced
|
|
48
|
-
};
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
function find_builtin_extension(query) {
|
|
52
|
-
const normalized = query.trim().toLowerCase();
|
|
53
|
-
if (!normalized) return void 0;
|
|
54
|
-
return BUILTIN_EXTENSIONS.find((extension) => [
|
|
55
|
-
extension.key,
|
|
56
|
-
extension.label,
|
|
57
|
-
...extension.aliases
|
|
58
|
-
].some((value) => value.toLowerCase() === normalized));
|
|
59
|
-
}
|
|
60
|
-
// src/api/builtin-extensions.ts
|
|
61
|
-
const require = createRequire(import.meta.url);
|
|
62
|
-
const PACKAGE_THEME_DIR = resolve(dirname(require.resolve("@spences10/pi-themes/package.json")), "themes");
|
|
63
|
-
const MANAGED_INLINE_EXTENSION_NAME_PREFIX = "my-pi-";
|
|
64
|
-
function assert_unreserved_inline_extension_names(extensions) {
|
|
65
|
-
for (const extension of extensions) if (typeof extension !== "function" && extension.name.startsWith("my-pi-")) throw new Error(`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}".`);
|
|
66
|
-
}
|
|
67
|
-
function get_force_disabled_builtins(options) {
|
|
68
|
-
const force_disabled = /* @__PURE__ */ new Set();
|
|
69
|
-
for (const extension of BUILTIN_EXTENSION_REGISTRY) {
|
|
70
|
-
if (!(options[extension.option_name] ?? extension.default_enabled)) force_disabled.add(extension.key);
|
|
71
|
-
const disabled_in = "mode_constraints" in extension ? extension.mode_constraints.disabled_in : void 0;
|
|
72
|
-
if (options.runtime_mode && disabled_in?.includes(options.runtime_mode)) force_disabled.add(extension.key);
|
|
73
|
-
}
|
|
74
|
-
return force_disabled;
|
|
75
|
-
}
|
|
76
|
-
function is_agent_dir_package_installed(agent_dir, package_name) {
|
|
77
|
-
return existsSync(join(agent_dir, "npm", "node_modules", package_name));
|
|
78
|
-
}
|
|
79
|
-
function get_externally_installed_builtin_extensions(agent_dir) {
|
|
80
|
-
const installed = /* @__PURE__ */ new Set();
|
|
81
|
-
for (const extension of BUILTIN_EXTENSION_REGISTRY) {
|
|
82
|
-
const external_package_name = extension.external_package_name;
|
|
83
|
-
if (external_package_name && is_agent_dir_package_installed(agent_dir, external_package_name)) installed.add(extension.key);
|
|
84
|
-
}
|
|
85
|
-
return installed;
|
|
86
|
-
}
|
|
87
|
-
function warn_builtin_extension_unavailable(key, error) {
|
|
88
|
-
const reason = error instanceof Error ? error.message : String(error);
|
|
89
|
-
process.emitWarning(`Built-in extension "${key}" is unavailable and was skipped: ${reason}`, { code: "MY_PI_BUILTIN_EXTENSION_UNAVAILABLE" });
|
|
90
|
-
}
|
|
91
|
-
function create_lazy_builtin_extension_factory(key, load_extension, force_disabled) {
|
|
92
|
-
return async (pi) => {
|
|
93
|
-
if (!is_builtin_extension_active(load_builtin_extensions_config(), key, force_disabled)) return;
|
|
94
|
-
try {
|
|
95
|
-
await (await load_extension())(pi);
|
|
96
|
-
} catch (error) {
|
|
97
|
-
warn_builtin_extension_unavailable(key, error);
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
function create_lazy_telemetry_extension(options) {
|
|
102
|
-
return async (pi) => {
|
|
103
|
-
try {
|
|
104
|
-
const { create_telemetry_extension } = await import("@spences10/pi-telemetry");
|
|
105
|
-
await create_telemetry_extension(options)(pi);
|
|
106
|
-
} catch (error) {
|
|
107
|
-
warn_builtin_extension_unavailable("telemetry", error);
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
function create_extensions_override(managed_extension_paths) {
|
|
112
|
-
return (base) => {
|
|
113
|
-
const remaining = [...base.extensions];
|
|
114
|
-
const ordered_managed = managed_extension_paths.flatMap((path) => {
|
|
115
|
-
const index = remaining.findIndex((extension) => extension.path === path);
|
|
116
|
-
return index === -1 ? [] : remaining.splice(index, 1);
|
|
117
|
-
});
|
|
118
|
-
return {
|
|
119
|
-
...base,
|
|
120
|
-
extensions: [...ordered_managed, ...remaining]
|
|
121
|
-
};
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
// src/api/env.ts
|
|
125
|
-
const PI_AGENT_DIR_ENV = "PI_CODING_AGENT_DIR";
|
|
126
|
-
const MY_PI_RUNTIME_MODE_ENV = "MY_PI_RUNTIME_MODE";
|
|
127
|
-
function snapshot_env(env, keys) {
|
|
128
|
-
return new Map(Array.from(keys, (key) => [key, env[key]]));
|
|
129
|
-
}
|
|
130
|
-
function restore_env(env, snapshot) {
|
|
131
|
-
for (const [key, value] of snapshot) if (value === void 0) delete env[key];
|
|
132
|
-
else env[key] = value;
|
|
133
|
-
}
|
|
134
|
-
function wrap_runtime_env_restore(runtime, restore) {
|
|
135
|
-
const dispose = runtime.dispose.bind(runtime);
|
|
136
|
-
let restored = false;
|
|
137
|
-
const restore_once = () => {
|
|
138
|
-
if (restored) return;
|
|
139
|
-
restored = true;
|
|
140
|
-
restore();
|
|
141
|
-
};
|
|
142
|
-
runtime.dispose = (async () => {
|
|
143
|
-
try {
|
|
144
|
-
await dispose();
|
|
145
|
-
} finally {
|
|
146
|
-
restore_once();
|
|
147
|
-
}
|
|
148
|
-
});
|
|
149
|
-
return runtime;
|
|
150
|
-
}
|
|
151
|
-
const UNTRUSTED_CHILD_ENV_DEFAULTS = {
|
|
152
|
-
MY_PI_CHILD_ENV_ALLOWLIST: "",
|
|
153
|
-
MY_PI_MCP_ENV_ALLOWLIST: "",
|
|
154
|
-
MY_PI_LSP_ENV_ALLOWLIST: "",
|
|
155
|
-
MY_PI_HOOKS_ENV_ALLOWLIST: "",
|
|
156
|
-
MY_PI_TEAM_MODE_ENV_ALLOWLIST: ""
|
|
157
|
-
};
|
|
158
|
-
function apply_untrusted_repo_defaults(env = process.env) {
|
|
159
|
-
const applied = apply_project_trust_untrusted_defaults(env);
|
|
160
|
-
for (const [key, value] of Object.entries(UNTRUSTED_CHILD_ENV_DEFAULTS)) {
|
|
161
|
-
if (env[key] !== void 0) continue;
|
|
162
|
-
env[key] = value;
|
|
163
|
-
applied.push(key);
|
|
164
|
-
}
|
|
165
|
-
return applied;
|
|
166
|
-
}
|
|
167
|
-
function is_resource_enabled(value) {
|
|
168
|
-
const normalized = value?.trim().toLowerCase();
|
|
169
|
-
if (!normalized) return true;
|
|
170
|
-
if ([
|
|
171
|
-
"0",
|
|
172
|
-
"false",
|
|
173
|
-
"no",
|
|
174
|
-
"skip",
|
|
175
|
-
"disable"
|
|
176
|
-
].includes(normalized)) return false;
|
|
177
|
-
return true;
|
|
178
|
-
}
|
|
179
|
-
function resolve_agent_dir(cwd, agent_dir) {
|
|
180
|
-
return agent_dir ? resolve(cwd, agent_dir) : getAgentDir();
|
|
181
|
-
}
|
|
182
|
-
// src/api/models.ts
|
|
183
|
-
function resolve_model_reference(model_reference, models_runtime) {
|
|
184
|
-
if (!model_reference) return void 0;
|
|
185
|
-
const models = models_runtime.getModels();
|
|
186
|
-
const lower_reference = model_reference.toLowerCase();
|
|
187
|
-
const slash_index = model_reference.indexOf("/");
|
|
188
|
-
if (slash_index !== -1) {
|
|
189
|
-
const maybe_provider = model_reference.slice(0, slash_index);
|
|
190
|
-
const model_id = model_reference.slice(slash_index + 1);
|
|
191
|
-
const provider = models.find((model) => model.provider.toLowerCase() === maybe_provider.toLowerCase())?.provider;
|
|
192
|
-
if (provider) {
|
|
193
|
-
const provider_match = models.find((model) => model.provider === provider && model.id.toLowerCase() === model_id.toLowerCase());
|
|
194
|
-
if (provider_match) return provider_match;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
return models.find((model) => {
|
|
198
|
-
const id = model.id.toLowerCase();
|
|
199
|
-
const full_id = `${model.provider}/${model.id}`.toLowerCase();
|
|
200
|
-
return id === lower_reference || full_id === lower_reference;
|
|
201
|
-
});
|
|
202
|
-
}
|
|
203
|
-
function resolve_effective_thinking_level(model, thinking) {
|
|
204
|
-
if (!thinking || !model) return thinking;
|
|
205
|
-
return clampThinkingLevel(model, thinking);
|
|
206
|
-
}
|
|
207
|
-
// src/api/session.ts
|
|
208
|
-
function resolve_session_file(cwd, session_dir, session_ref) {
|
|
209
|
-
if (!session_ref) return void 0;
|
|
210
|
-
const explicit_path = isAbsolute(session_ref) ? session_ref : resolve(cwd, session_ref);
|
|
211
|
-
if (existsSync(explicit_path)) return explicit_path;
|
|
212
|
-
if (session_ref.endsWith(".jsonl")) return explicit_path;
|
|
213
|
-
const dir = session_dir ? resolve(cwd, session_dir) : void 0;
|
|
214
|
-
if (!dir || !existsSync(dir)) return void 0;
|
|
215
|
-
const match = readdirSync(dir).filter((file) => file.endsWith(".jsonl") && (basename(file, ".jsonl").endsWith(session_ref) || file.includes(session_ref))).sort().at(-1);
|
|
216
|
-
return match ? join(dir, match) : void 0;
|
|
217
|
-
}
|
|
218
|
-
function create_session_manager(options) {
|
|
219
|
-
const resolved_session_dir = options.session_dir ? resolve(options.cwd, options.session_dir) : SessionManager.create(options.cwd).getSessionDir();
|
|
220
|
-
const session_ref = options.session ?? options.session_id;
|
|
221
|
-
const session_file = resolve_session_file(options.cwd, resolved_session_dir, session_ref);
|
|
222
|
-
const session_manager = session_file ? SessionManager.open(session_file, resolved_session_dir, options.cwd) : SessionManager.create(options.cwd, resolved_session_dir, options.session_id ? { id: options.session_id } : {});
|
|
223
|
-
if (options.startup_session_name && session_manager.getSessionName() !== options.startup_session_name) session_manager.appendSessionInfo(options.startup_session_name);
|
|
224
|
-
return session_manager;
|
|
225
|
-
}
|
|
226
|
-
// src/extensions/manager/index.ts
|
|
227
|
-
const ENABLED = "● enabled";
|
|
228
|
-
const DISABLED = "○ disabled";
|
|
229
|
-
function to_force_disabled_set(force_disabled) {
|
|
230
|
-
return new Set(force_disabled ?? []);
|
|
231
|
-
}
|
|
232
|
-
function format_effective_state(state) {
|
|
233
|
-
if (state.effective_enabled) return "enabled";
|
|
234
|
-
if (state.forced_disabled) return `disabled in this process by ${state.cli_flag}`;
|
|
235
|
-
return "disabled";
|
|
236
|
-
}
|
|
237
|
-
function format_extension_lines(states, options) {
|
|
238
|
-
const lines = [];
|
|
239
|
-
if (options?.heading) lines.push(options.heading, "");
|
|
240
|
-
const enabled_now = states.filter((state) => state.effective_enabled).length;
|
|
241
|
-
const disabled_now = states.length - enabled_now;
|
|
242
|
-
lines.push(`${states.length} built-in extensions (${enabled_now} enabled now, ${disabled_now} disabled now)`, "");
|
|
243
|
-
for (const state of states) {
|
|
244
|
-
lines.push(`${state.saved_enabled ? ENABLED : DISABLED} ${state.label}`);
|
|
245
|
-
lines.push(` key: ${state.key}`);
|
|
246
|
-
lines.push(` saved config: ${state.saved_enabled ? "enabled" : "disabled"}`);
|
|
247
|
-
lines.push(` current process: ${format_effective_state(state)}`);
|
|
248
|
-
lines.push(` ${state.description}`);
|
|
249
|
-
}
|
|
250
|
-
return lines.join("\n");
|
|
251
|
-
}
|
|
252
|
-
function to_setting_item(state) {
|
|
253
|
-
const detail_lines = [
|
|
254
|
-
state.key,
|
|
255
|
-
state.description,
|
|
256
|
-
`current process: ${format_effective_state(state)}`,
|
|
257
|
-
`startup override: ${state.cli_flag}`
|
|
258
|
-
];
|
|
259
|
-
return {
|
|
260
|
-
id: state.key,
|
|
261
|
-
label: state.label,
|
|
262
|
-
description: detail_lines.join("\n"),
|
|
263
|
-
currentValue: state.saved_enabled ? ENABLED : DISABLED,
|
|
264
|
-
values: [ENABLED, DISABLED]
|
|
265
|
-
};
|
|
266
|
-
}
|
|
267
|
-
function sets_equal(a, b) {
|
|
268
|
-
if (a.size !== b.size) return false;
|
|
269
|
-
for (const value of a) if (!b.has(value)) return false;
|
|
270
|
-
return true;
|
|
271
|
-
}
|
|
272
|
-
function search_states(states, query) {
|
|
273
|
-
const normalized = query.trim().toLowerCase();
|
|
274
|
-
if (!normalized) return states;
|
|
275
|
-
return states.filter((state) => [
|
|
276
|
-
state.key,
|
|
277
|
-
state.label,
|
|
278
|
-
state.description,
|
|
279
|
-
...state.aliases
|
|
280
|
-
].some((value) => value.toLowerCase().includes(normalized)));
|
|
281
|
-
}
|
|
282
|
-
function save_extension_enabled(key, enabled) {
|
|
283
|
-
const config = load_builtin_extensions_config();
|
|
284
|
-
config.enabled[key] = enabled;
|
|
285
|
-
save_builtin_extensions_config(config);
|
|
286
|
-
}
|
|
287
|
-
function create_extensions_extension(options = {}) {
|
|
288
|
-
const force_disabled = to_force_disabled_set(options.force_disabled);
|
|
289
|
-
async function show_manager(ctx) {
|
|
290
|
-
if (!ctx.hasUI) return false;
|
|
291
|
-
const states = resolve_builtin_extension_states(force_disabled);
|
|
292
|
-
const initial_enabled = new Set(states.filter((state) => state.saved_enabled).map((state) => state.key));
|
|
293
|
-
const current_enabled = new Set(initial_enabled);
|
|
294
|
-
const items = states.map(to_setting_item);
|
|
295
|
-
await show_settings_modal(ctx, {
|
|
296
|
-
title: "Built-in extensions",
|
|
297
|
-
subtitle: () => {
|
|
298
|
-
const saved_enabled = current_enabled.size;
|
|
299
|
-
const saved_disabled = states.length - saved_enabled;
|
|
300
|
-
const enabled_now = [...current_enabled].filter((key) => !force_disabled.has(key)).length;
|
|
301
|
-
return `${saved_enabled} saved enabled • ${saved_disabled} saved disabled • ${enabled_now} enabled now • ${states.length - enabled_now} disabled now`;
|
|
302
|
-
},
|
|
303
|
-
items,
|
|
304
|
-
enable_search: true,
|
|
305
|
-
footer: "esc close • search filters • changes save immediately • CLI --no-* flags still win in this process",
|
|
306
|
-
on_change: (id, new_value) => {
|
|
307
|
-
const key = id;
|
|
308
|
-
const enabled = new_value === ENABLED;
|
|
309
|
-
if (enabled) current_enabled.add(key);
|
|
310
|
-
else current_enabled.delete(key);
|
|
311
|
-
save_extension_enabled(key, enabled);
|
|
312
|
-
}
|
|
313
|
-
});
|
|
314
|
-
if (!sets_equal(initial_enabled, current_enabled)) {
|
|
315
|
-
ctx.ui.notify(force_disabled.size > 0 ? "Reloading to apply updated built-in extensions. CLI --no-* flags still force-disable some extensions in this process." : "Reloading to apply updated built-in extensions...", "info");
|
|
316
|
-
await ctx.reload();
|
|
317
|
-
}
|
|
318
|
-
return true;
|
|
319
|
-
}
|
|
320
|
-
return async function extensions(pi) {
|
|
321
|
-
const subs = [
|
|
322
|
-
"list",
|
|
323
|
-
"enable",
|
|
324
|
-
"disable",
|
|
325
|
-
"toggle",
|
|
326
|
-
"search"
|
|
327
|
-
];
|
|
328
|
-
pi.registerCommand("extensions", {
|
|
329
|
-
description: "Manage built-in my-pi extensions",
|
|
330
|
-
getArgumentCompletions: (prefix) => {
|
|
331
|
-
const parts = prefix.trim().split(/\s+/);
|
|
332
|
-
if (parts.length <= 1) return subs.filter((sub) => sub.startsWith(parts[0] || "")).map((sub) => ({
|
|
333
|
-
value: sub,
|
|
334
|
-
label: sub
|
|
335
|
-
}));
|
|
336
|
-
if ([
|
|
337
|
-
"enable",
|
|
338
|
-
"disable",
|
|
339
|
-
"toggle"
|
|
340
|
-
].includes(parts[0])) {
|
|
341
|
-
const q = parts.slice(1).join(" ").toLowerCase();
|
|
342
|
-
return resolve_builtin_extension_states(force_disabled).filter((state) => state.key.toLowerCase().includes(q) || state.label.toLowerCase().includes(q)).slice(0, 20).map((state) => ({
|
|
343
|
-
value: `${parts[0]} ${state.key}`,
|
|
344
|
-
label: `${state.key} ${state.saved_enabled ? ENABLED : DISABLED}`
|
|
345
|
-
}));
|
|
346
|
-
}
|
|
347
|
-
return null;
|
|
348
|
-
},
|
|
349
|
-
handler: async (args, ctx) => {
|
|
350
|
-
const trimmed = args.trim();
|
|
351
|
-
if (!trimmed) {
|
|
352
|
-
if (await show_manager(ctx)) return;
|
|
353
|
-
}
|
|
354
|
-
const [sub, ...rest] = (trimmed || "list").split(/\s+/);
|
|
355
|
-
const arg = rest.join(" ");
|
|
356
|
-
const states = resolve_builtin_extension_states(force_disabled);
|
|
357
|
-
switch (sub) {
|
|
358
|
-
case "list":
|
|
359
|
-
ctx.ui.notify(format_extension_lines(states, { heading: "Built-in extensions" }));
|
|
360
|
-
break;
|
|
361
|
-
case "enable":
|
|
362
|
-
case "disable":
|
|
363
|
-
case "toggle": {
|
|
364
|
-
if (!arg) {
|
|
365
|
-
if (await show_manager(ctx)) return;
|
|
366
|
-
ctx.ui.notify(`Usage: /extensions ${sub} <key>`, "warning");
|
|
367
|
-
return;
|
|
368
|
-
}
|
|
369
|
-
const extension = find_builtin_extension(arg);
|
|
370
|
-
if (!extension) {
|
|
371
|
-
ctx.ui.notify(`Unknown extension: ${arg}. Use: ${BUILTIN_EXTENSIONS.map((item) => item.key).join(", ")}`, "warning");
|
|
372
|
-
return;
|
|
373
|
-
}
|
|
374
|
-
const current_state = states.find((state) => state.key === extension.key);
|
|
375
|
-
const next_enabled = sub === "enable" ? true : sub === "disable" ? false : !current_state?.saved_enabled;
|
|
376
|
-
save_extension_enabled(extension.key, next_enabled);
|
|
377
|
-
ctx.ui.notify(next_enabled && force_disabled.has(extension.key) ? `Enabled ${extension.key} in saved config. Still disabled in this process by ${extension.cli_flag}. /reload or restart without that flag to apply.` : `${extension.key} ${next_enabled ? "enabled" : "disabled"}. /reload to apply.`);
|
|
378
|
-
break;
|
|
379
|
-
}
|
|
380
|
-
case "search": {
|
|
381
|
-
if (!arg) {
|
|
382
|
-
ctx.ui.notify("Usage: /extensions search <query>", "warning");
|
|
383
|
-
return;
|
|
384
|
-
}
|
|
385
|
-
const results = search_states(states, arg);
|
|
386
|
-
if (results.length === 0) {
|
|
387
|
-
ctx.ui.notify(`No built-in extensions matching "${arg}"`);
|
|
388
|
-
return;
|
|
389
|
-
}
|
|
390
|
-
ctx.ui.notify(format_extension_lines(results, { heading: `Built-in extensions matching "${arg}"` }));
|
|
391
|
-
break;
|
|
392
|
-
}
|
|
393
|
-
default: ctx.ui.notify(`Unknown: ${sub}. Use: ${subs.join(", ")}`, "warning");
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
});
|
|
397
|
-
};
|
|
398
|
-
}
|
|
399
|
-
create_extensions_extension();
|
|
400
|
-
// src/api.ts
|
|
401
|
-
async function create_my_pi(options = {}) {
|
|
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;
|
|
403
|
-
assert_unreserved_inline_extension_names(user_factories);
|
|
404
|
-
const env_keys_to_restore = /* @__PURE__ */ new Set([MY_PI_RUNTIME_MODE_ENV]);
|
|
405
|
-
if (agent_dir) env_keys_to_restore.add(PI_AGENT_DIR_ENV);
|
|
406
|
-
const env_snapshot = snapshot_env(process.env, env_keys_to_restore);
|
|
407
|
-
let restore_runtime_env = () => restore_env(process.env, env_snapshot);
|
|
408
|
-
if (untrusted_repo) {
|
|
409
|
-
const applied = apply_untrusted_repo_defaults();
|
|
410
|
-
if (applied.length) {
|
|
411
|
-
const restore_previous = restore_runtime_env;
|
|
412
|
-
restore_runtime_env = () => {
|
|
413
|
-
for (const key of applied) delete process.env[key];
|
|
414
|
-
restore_previous();
|
|
415
|
-
};
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
const effective_agent_dir = resolve_agent_dir(cwd, agent_dir);
|
|
419
|
-
if (agent_dir) process.env[PI_AGENT_DIR_ENV] = effective_agent_dir;
|
|
420
|
-
process.env[MY_PI_RUNTIME_MODE_ENV] = runtime_mode;
|
|
421
|
-
const resolved_extensions = extensions.map((p) => resolve(cwd, p));
|
|
422
|
-
const force_disabled = get_force_disabled_builtins({
|
|
423
|
-
...options,
|
|
424
|
-
runtime_mode
|
|
425
|
-
});
|
|
426
|
-
for (const key of get_externally_installed_builtin_extensions(effective_agent_dir)) force_disabled.add(key);
|
|
427
|
-
const skills_builtin_enabled = is_builtin_extension_active(load_builtin_extensions_config(), "skills", force_disabled);
|
|
428
|
-
const skills_package = skills_builtin_enabled ? await import("@spences10/pi-skills").catch((error) => {
|
|
429
|
-
warn_builtin_extension_unavailable("skills", error);
|
|
430
|
-
}) : void 0;
|
|
431
|
-
const managed_inline_extensions = [
|
|
432
|
-
{
|
|
433
|
-
name: `${MANAGED_INLINE_EXTENSION_NAME_PREFIX}telemetry`,
|
|
434
|
-
factory: create_lazy_telemetry_extension({
|
|
435
|
-
enabled: telemetry,
|
|
436
|
-
db_path: telemetry_db_path,
|
|
437
|
-
cwd
|
|
438
|
-
})
|
|
439
|
-
},
|
|
440
|
-
{
|
|
441
|
-
name: `${MANAGED_INLINE_EXTENSION_NAME_PREFIX}extensions-manager`,
|
|
442
|
-
factory: create_extensions_extension({ force_disabled })
|
|
443
|
-
},
|
|
444
|
-
...BUILTIN_EXTENSION_REGISTRY.map((extension) => ({
|
|
445
|
-
name: `${MANAGED_INLINE_EXTENSION_NAME_PREFIX}${extension.key}`,
|
|
446
|
-
factory: create_lazy_builtin_extension_factory(extension.key, extension.load, force_disabled)
|
|
447
|
-
}))
|
|
448
|
-
];
|
|
449
|
-
const managed_extension_paths = managed_inline_extensions.map((extension) => `<inline:${extension.name}>`);
|
|
450
|
-
const create_runtime = async ({ cwd: runtime_cwd, sessionManager, sessionStartEvent }) => {
|
|
451
|
-
const runtime_skills_manager = skills_package?.create_skills_manager({
|
|
452
|
-
cwd: runtime_cwd,
|
|
453
|
-
project_skills_enabled: is_resource_enabled(process.env.MY_PI_PROJECT_SKILLS)
|
|
454
|
-
});
|
|
455
|
-
const additional_skill_paths = runtime_skills_manager?.get_enabled_skill_paths() ?? [];
|
|
456
|
-
const services = await createAgentSessionServices({
|
|
457
|
-
cwd: runtime_cwd,
|
|
458
|
-
agentDir: effective_agent_dir,
|
|
459
|
-
extensionFlagValues: extension_flag_values,
|
|
460
|
-
resourceLoaderOptions: {
|
|
461
|
-
...additional_skill_paths.length ? { additionalSkillPaths: additional_skill_paths } : {},
|
|
462
|
-
...system_prompt !== void 0 ? { systemPromptOverride: () => system_prompt } : {},
|
|
463
|
-
...append_system_prompt !== void 0 ? { appendSystemPromptOverride: (base) => [...base, append_system_prompt] } : {},
|
|
464
|
-
additionalExtensionPaths: [...resolved_extensions],
|
|
465
|
-
...runtime_mode === "interactive" ? { additionalThemePaths: [PACKAGE_THEME_DIR] } : {},
|
|
466
|
-
extensionFactories: [...managed_inline_extensions, ...user_factories],
|
|
467
|
-
extensionsOverride: create_extensions_override(managed_extension_paths),
|
|
468
|
-
skillsOverride: (base) => {
|
|
469
|
-
if (!skills_builtin_enabled) return {
|
|
470
|
-
...base,
|
|
471
|
-
skills: []
|
|
472
|
-
};
|
|
473
|
-
if (!runtime_skills_manager) return base;
|
|
474
|
-
runtime_skills_manager.refresh();
|
|
475
|
-
const selected_skill_names = selected_skills?.length ? new Set(selected_skills) : void 0;
|
|
476
|
-
return {
|
|
477
|
-
...base,
|
|
478
|
-
skills: base.skills.filter((skill) => {
|
|
479
|
-
if (selected_skill_names && !selected_skill_names.has(skill.name)) return false;
|
|
480
|
-
return runtime_skills_manager.is_enabled_by_skill(skill.name, skill.filePath);
|
|
481
|
-
})
|
|
482
|
-
};
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
});
|
|
486
|
-
const requested_model = resolve_model_reference(model, services.modelRuntime);
|
|
487
|
-
const effective_thinking = resolve_effective_thinking_level(requested_model, thinking);
|
|
488
|
-
if (requested_model && thinking && effective_thinking && effective_thinking !== thinking) services.diagnostics.push({
|
|
489
|
-
type: "warning",
|
|
490
|
-
message: `Requested thinking level "${thinking}" is not supported by ${requested_model.provider}/${requested_model.id}; using "${effective_thinking}".`
|
|
491
|
-
});
|
|
492
|
-
return {
|
|
493
|
-
...await createAgentSessionFromServices({
|
|
494
|
-
services,
|
|
495
|
-
sessionManager,
|
|
496
|
-
sessionStartEvent,
|
|
497
|
-
...requested_model ? { model: requested_model } : {},
|
|
498
|
-
...effective_thinking ? { thinkingLevel: effective_thinking } : {},
|
|
499
|
-
...selected_tools?.length ? { tools: selected_tools } : {},
|
|
500
|
-
...excluded_tools?.length ? { excludeTools: excluded_tools } : {}
|
|
501
|
-
}),
|
|
502
|
-
services,
|
|
503
|
-
diagnostics: services.diagnostics
|
|
504
|
-
};
|
|
505
|
-
};
|
|
506
|
-
try {
|
|
507
|
-
return wrap_runtime_env_restore(await createAgentSessionRuntime(create_runtime, {
|
|
508
|
-
cwd,
|
|
509
|
-
agentDir: effective_agent_dir,
|
|
510
|
-
sessionManager: create_session_manager({
|
|
511
|
-
cwd,
|
|
512
|
-
session_dir,
|
|
513
|
-
session,
|
|
514
|
-
session_id,
|
|
515
|
-
startup_session_name
|
|
516
|
-
})
|
|
517
|
-
}), restore_runtime_env);
|
|
518
|
-
} catch (error) {
|
|
519
|
-
restore_runtime_env();
|
|
520
|
-
throw error;
|
|
521
|
-
}
|
|
522
|
-
}
|
|
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 };
|
|
524
|
-
|
|
525
|
-
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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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"}
|