my-pi 0.1.69 → 0.1.70
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.js +1 -1
- package/dist/{builtin-registry-BTNhLf9Z.js → builtin-registry-Ca1JHXNM.js} +2 -2
- package/dist/{builtin-registry-BTNhLf9Z.js.map → builtin-registry-Ca1JHXNM.js.map} +1 -1
- package/dist/index.js +1 -1
- package/dist/{prompt-presets-CyvHq09h.js → prompt-presets-DqTJeo_C.js} +214 -86
- package/dist/prompt-presets-DqTJeo_C.js.map +1 -0
- package/package.json +8 -8
- package/dist/prompt-presets-CyvHq09h.js.map +0 -1
package/dist/api.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as BUILTIN_EXTENSION_REGISTRY, t as BUILTIN_EXTENSIONS } from "./builtin-registry-
|
|
1
|
+
import { n as BUILTIN_EXTENSION_REGISTRY, t as BUILTIN_EXTENSIONS } from "./builtin-registry-Ca1JHXNM.js";
|
|
2
2
|
import { createRequire } from "node:module";
|
|
3
3
|
import { copyFileSync, existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
|
|
4
4
|
import { basename, dirname, join, resolve } from "node:path";
|
|
@@ -211,7 +211,7 @@ const BUILTIN_EXTENSION_REGISTRY = [
|
|
|
211
211
|
"preset",
|
|
212
212
|
"presets"
|
|
213
213
|
],
|
|
214
|
-
load: async () => (await import("./prompt-presets-
|
|
214
|
+
load: async () => (await import("./prompt-presets-DqTJeo_C.js")).default
|
|
215
215
|
},
|
|
216
216
|
{
|
|
217
217
|
key: "git-ui",
|
|
@@ -368,4 +368,4 @@ const BUILTIN_EXTENSIONS = BUILTIN_EXTENSION_REGISTRY.map(({ load: _load, ...ext
|
|
|
368
368
|
//#endregion
|
|
369
369
|
export { BUILTIN_EXTENSION_REGISTRY as n, BUILTIN_EXTENSIONS as t };
|
|
370
370
|
|
|
371
|
-
//# sourceMappingURL=builtin-registry-
|
|
371
|
+
//# sourceMappingURL=builtin-registry-Ca1JHXNM.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builtin-registry-BTNhLf9Z.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\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\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\tload: async () => (await import('@spences10/pi-mcp')).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: '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\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\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\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\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\tload: async () => (await import('@spences10/pi-nopeek')).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\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\tload: async () =>\n\t\t\t(await import('@spences10/pi-sqlite-tools')).default,\n\t},\n\t{\n\t\tkey: 'startup-screen',\n\t\tlabel: 'Startup screen',\n\t\tdocs_label: 'Startup screen',\n\t\tdescription:\n\t\t\t'Pixel-art gradient startup header for interactive sessions',\n\t\tdefault_enabled: true,\n\t\toption_name: 'startup_screen',\n\t\tcli_arg: 'no-startup-screen',\n\t\tcli_flag: '--no-startup-screen',\n\t\tcli_description: 'Disable the custom startup screen',\n\t\taliases: ['startup-screen', 'startup', 'header', 'splash'],\n\t\tmode_constraints: {\n\t\t\tdisabled_in: ['print', 'json', 'rpc'],\n\t\t\treason: 'Startup screen only renders in the interactive TUI',\n\t\t},\n\t\tload: async () =>\n\t\t\t(await import('./startup-screen/index.js')).default,\n\t},\n\t{\n\t\tkey: 'prompt-presets',\n\t\tlabel: 'Prompt presets',\n\t\tdocs_label: 'Prompt presets',\n\t\tdescription:\n\t\t\t'Runtime prompt preset selection and /prompt-preset command',\n\t\tdefault_enabled: true,\n\t\toption_name: 'prompt_presets',\n\t\tcli_arg: 'no-prompt-presets',\n\t\tcli_flag: '--no-prompt-presets',\n\t\tcli_description: 'Disable prompt presets extension',\n\t\taliases: ['prompt-preset', 'preset', 'presets'],\n\t\tload: async () =>\n\t\t\t(await import('./prompt-presets/index.js')).default,\n\t},\n\t{\n\t\tkey: 'git-ui',\n\t\tlabel: 'Git UI',\n\t\tdocs_label: 'Git staging UI',\n\t\tdescription: 'Interactive source control staging panel',\n\t\tdefault_enabled: true,\n\t\toption_name: 'git_ui',\n\t\tcli_arg: 'no-git-ui',\n\t\tcli_flag: '--no-git-ui',\n\t\tcli_description: 'Disable built-in Git staging UI',\n\t\taliases: ['git-ui', 'git', 'source-control', 'scm'],\n\t\tmode_constraints: {\n\t\t\tdisabled_in: ['print', 'json', 'rpc'],\n\t\t\treason: 'Git UI is only useful in interactive mode',\n\t\t},\n\t\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\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\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\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\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'Experimental orchestrator/team mode with RPC teammates, tasks, and 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 experimental team mode extension',\n\t\taliases: ['team-mode', 'team', 'teammates'],\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-Ca1JHXNM.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\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\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\tload: async () => (await import('@spences10/pi-mcp')).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: '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\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\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\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\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\tload: async () => (await import('@spences10/pi-nopeek')).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\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\tload: async () =>\n\t\t\t(await import('@spences10/pi-sqlite-tools')).default,\n\t},\n\t{\n\t\tkey: 'startup-screen',\n\t\tlabel: 'Startup screen',\n\t\tdocs_label: 'Startup screen',\n\t\tdescription:\n\t\t\t'Pixel-art gradient startup header for interactive sessions',\n\t\tdefault_enabled: true,\n\t\toption_name: 'startup_screen',\n\t\tcli_arg: 'no-startup-screen',\n\t\tcli_flag: '--no-startup-screen',\n\t\tcli_description: 'Disable the custom startup screen',\n\t\taliases: ['startup-screen', 'startup', 'header', 'splash'],\n\t\tmode_constraints: {\n\t\t\tdisabled_in: ['print', 'json', 'rpc'],\n\t\t\treason: 'Startup screen only renders in the interactive TUI',\n\t\t},\n\t\tload: async () =>\n\t\t\t(await import('./startup-screen/index.js')).default,\n\t},\n\t{\n\t\tkey: 'prompt-presets',\n\t\tlabel: 'Prompt presets',\n\t\tdocs_label: 'Prompt presets',\n\t\tdescription:\n\t\t\t'Runtime prompt preset selection and /prompt-preset command',\n\t\tdefault_enabled: true,\n\t\toption_name: 'prompt_presets',\n\t\tcli_arg: 'no-prompt-presets',\n\t\tcli_flag: '--no-prompt-presets',\n\t\tcli_description: 'Disable prompt presets extension',\n\t\taliases: ['prompt-preset', 'preset', 'presets'],\n\t\tload: async () =>\n\t\t\t(await import('./prompt-presets/index.js')).default,\n\t},\n\t{\n\t\tkey: 'git-ui',\n\t\tlabel: 'Git UI',\n\t\tdocs_label: 'Git staging UI',\n\t\tdescription: 'Interactive source control staging panel',\n\t\tdefault_enabled: true,\n\t\toption_name: 'git_ui',\n\t\tcli_arg: 'no-git-ui',\n\t\tcli_flag: '--no-git-ui',\n\t\tcli_description: 'Disable built-in Git staging UI',\n\t\taliases: ['git-ui', 'git', 'source-control', 'scm'],\n\t\tmode_constraints: {\n\t\t\tdisabled_in: ['print', 'json', 'rpc'],\n\t\t\treason: 'Git UI is only useful in interactive mode',\n\t\t},\n\t\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\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\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\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\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'Experimental orchestrator/team mode with RPC teammates, tasks, and 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 experimental team mode extension',\n\t\taliases: ['team-mode', 'team', 'teammates'],\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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"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { t as BUILTIN_EXTENSIONS } from "./builtin-registry-
|
|
2
|
+
import { t as BUILTIN_EXTENSIONS } from "./builtin-registry-Ca1JHXNM.js";
|
|
3
3
|
import { defineCommand, renderUsage, runMain } from "citty";
|
|
4
4
|
import { existsSync, readFileSync } from "node:fs";
|
|
5
5
|
import { dirname, join, resolve } from "node:path";
|
|
@@ -2,8 +2,9 @@ import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, unlinkSyn
|
|
|
2
2
|
import { dirname, join } from "node:path";
|
|
3
3
|
import { getAgentDir, parseFrontmatter } from "@earendil-works/pi-coding-agent";
|
|
4
4
|
import { read_settings, write_settings } from "@spences10/pi-settings";
|
|
5
|
-
import {
|
|
5
|
+
import { show_modal } from "@spences10/pi-tui-modal";
|
|
6
6
|
import "@spences10/pi-footer";
|
|
7
|
+
import { Key, matchesKey, truncateToWidth, visibleWidth, wrapTextWithAnsi } from "@earendil-works/pi-tui";
|
|
7
8
|
//#region src/extensions/prompt-presets/catalog.ts
|
|
8
9
|
function get_prompt_source_label(source) {
|
|
9
10
|
switch (source) {
|
|
@@ -149,6 +150,11 @@ const DEFAULT_PROMPT_PRESETS = {
|
|
|
149
150
|
kind: "layer",
|
|
150
151
|
description: "Call out notable risks or tradeoffs",
|
|
151
152
|
instructions: "When making a recommendation or implementation plan, briefly mention the key risk, tradeoff, or caveat if one materially matters."
|
|
153
|
+
},
|
|
154
|
+
karpathy: {
|
|
155
|
+
kind: "layer",
|
|
156
|
+
description: "Bias toward simple, surgical, verified code changes",
|
|
157
|
+
instructions: "Before coding, state assumptions when unclear and surface meaningful tradeoffs. Prefer the minimum code that solves the request; avoid speculative abstractions, flexibility, and unrelated cleanup. Make surgical changes: touch only lines directly tied to the task, match existing style, and mention unrelated issues instead of fixing them. For multi-step work, use brief success criteria and verify with focused checks before reporting."
|
|
152
158
|
}
|
|
153
159
|
};
|
|
154
160
|
//#endregion
|
|
@@ -207,6 +213,16 @@ Examples:
|
|
|
207
213
|
Alias: /preset`;
|
|
208
214
|
}
|
|
209
215
|
//#endregion
|
|
216
|
+
//#region src/extensions/prompt-presets/prompt-blocks.ts
|
|
217
|
+
function build_active_prompt_blocks(presets, active_base_name, active_layers) {
|
|
218
|
+
const blocks = [];
|
|
219
|
+
const base = active_base_name ? presets[active_base_name] : void 0;
|
|
220
|
+
if (base?.instructions.trim()) blocks.push(`## Active Base Prompt: ${base.name}\n${base.instructions.trim()}`);
|
|
221
|
+
const layer_blocks = [...active_layers].sort().map((name) => presets[name]).filter((preset) => Boolean(preset?.instructions.trim())).map((preset) => `### ${preset.name}\n${preset.instructions.trim()}`);
|
|
222
|
+
if (layer_blocks.length > 0) blocks.push(`## Active Prompt Layers\n\n${layer_blocks.join("\n\n")}`);
|
|
223
|
+
return blocks;
|
|
224
|
+
}
|
|
225
|
+
//#endregion
|
|
210
226
|
//#region src/extensions/prompt-presets/storage.ts
|
|
211
227
|
const PROJECT_PROMPT_PRESETS_ENV = "MY_PI_PROMPT_PRESETS_PROJECT";
|
|
212
228
|
function normalize_prompt_presets(input) {
|
|
@@ -443,9 +459,6 @@ function save_persisted_prompt_state(cwd, state, path = get_persisted_prompt_sta
|
|
|
443
459
|
//#endregion
|
|
444
460
|
//#region src/extensions/prompt-presets/state.ts
|
|
445
461
|
const PRESET_STATE_TYPE = "prompt-preset-state";
|
|
446
|
-
const ENABLED = "● enabled";
|
|
447
|
-
const DISABLED = "○ disabled";
|
|
448
|
-
const SELECTED = "● selected";
|
|
449
462
|
const NONE_BASE_ID = "__base_none__";
|
|
450
463
|
function get_last_preset_state(ctx) {
|
|
451
464
|
const entries = ctx.sessionManager.getEntries();
|
|
@@ -485,90 +498,205 @@ async function show_prompt_preset_manager(ctx, state, on_change) {
|
|
|
485
498
|
ctx.ui.notify("No prompt presets available", "warning");
|
|
486
499
|
return;
|
|
487
500
|
}
|
|
488
|
-
const
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
501
|
+
const result = await show_modal(ctx, {
|
|
502
|
+
title: "Prompt preset inspector",
|
|
503
|
+
subtitle: () => `base: ${state.active_base_name ?? "(none)"} • ${state.active_layers.size} layer(s) currently active`,
|
|
504
|
+
footer: "↑↓ navigate • space toggle/select • tab item/effective preview • enter apply • c clear • esc cancel",
|
|
505
|
+
overlay_options: {
|
|
506
|
+
width: "92%",
|
|
507
|
+
minWidth: 72,
|
|
508
|
+
maxHeight: "88%"
|
|
509
|
+
}
|
|
510
|
+
}, ({ done }, theme, layout) => new PromptPresetInspectorBody(state, theme, () => layout.get_max_body_lines(), done));
|
|
511
|
+
if (!result) return;
|
|
512
|
+
if (result.base_name !== state.active_base_name || !sets_equal(new Set(state.active_layers), result.layers)) on_change(result.base_name, result.layers);
|
|
513
|
+
}
|
|
514
|
+
var PromptPresetInspectorBody = class {
|
|
515
|
+
rows;
|
|
516
|
+
selected_index = 1;
|
|
517
|
+
selected_base;
|
|
518
|
+
enabled_layers;
|
|
519
|
+
preview_mode = "item";
|
|
520
|
+
preview_offset = 0;
|
|
521
|
+
preview_lines = [];
|
|
522
|
+
constructor(state, theme, get_max_lines, done) {
|
|
523
|
+
this.state = state;
|
|
524
|
+
this.theme = theme;
|
|
525
|
+
this.get_max_lines = get_max_lines;
|
|
526
|
+
this.done = done;
|
|
527
|
+
const base_presets = list_base_presets(state.presets);
|
|
528
|
+
const layer_presets = list_layer_presets(state.presets);
|
|
529
|
+
this.rows = [
|
|
530
|
+
{
|
|
531
|
+
type: "header",
|
|
532
|
+
id: "__base_header__",
|
|
533
|
+
label: `Base presets (${base_presets.length + 1})`
|
|
534
|
+
},
|
|
535
|
+
{
|
|
536
|
+
type: "base-none",
|
|
537
|
+
id: NONE_BASE_ID,
|
|
538
|
+
label: "(none)"
|
|
539
|
+
},
|
|
540
|
+
...base_presets.map((preset) => ({
|
|
541
|
+
type: "preset",
|
|
542
|
+
id: preset.name,
|
|
543
|
+
preset
|
|
544
|
+
})),
|
|
545
|
+
{
|
|
546
|
+
type: "header",
|
|
547
|
+
id: "__layer_header__",
|
|
548
|
+
label: `Prompt layers (${layer_presets.length})`
|
|
549
|
+
},
|
|
550
|
+
...layer_presets.map((preset) => ({
|
|
551
|
+
type: "preset",
|
|
552
|
+
id: preset.name,
|
|
553
|
+
preset
|
|
554
|
+
}))
|
|
555
|
+
];
|
|
556
|
+
this.selected_base = state.active_base_name;
|
|
557
|
+
this.enabled_layers = new Set(state.active_layers);
|
|
558
|
+
this.skip_header(1);
|
|
518
559
|
}
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
await show_settings_modal(ctx, {
|
|
541
|
-
title: "Prompt presets",
|
|
542
|
-
subtitle: () => `base: ${selected_base ?? "(none)"} • ${enabled_layers.size} layer(s) enabled`,
|
|
543
|
-
items,
|
|
544
|
-
max_visible: Math.min(Math.max(items.length + 4, 8), 24),
|
|
545
|
-
enable_search: true,
|
|
546
|
-
on_change: (id, new_value) => {
|
|
547
|
-
if (id.startsWith("__header_")) return;
|
|
548
|
-
if (base_ids.has(id)) {
|
|
549
|
-
selected_base = new_value === "● selected" && id !== "__base_none__" ? id : void 0;
|
|
550
|
-
sync_values();
|
|
560
|
+
render(width) {
|
|
561
|
+
const body_lines = Math.max(8, this.get_max_lines());
|
|
562
|
+
if (width < 80) return this.render_stacked(width, body_lines);
|
|
563
|
+
const list_width = Math.min(38, Math.max(28, Math.floor(width * .38)));
|
|
564
|
+
const preview_width = width - list_width - 3;
|
|
565
|
+
const list = this.render_list(list_width, body_lines);
|
|
566
|
+
const preview = this.render_preview(preview_width, body_lines);
|
|
567
|
+
const lines = [];
|
|
568
|
+
for (let i = 0; i < body_lines; i++) lines.push(`${this.pad_line(list[i] ?? "", list_width)} ${this.theme.fg("dim", "│")} ${preview[i] ?? ""}`);
|
|
569
|
+
return lines.map((line) => truncateToWidth(line, width));
|
|
570
|
+
}
|
|
571
|
+
invalidate() {}
|
|
572
|
+
handleInput(data) {
|
|
573
|
+
if (matchesKey(data, Key.up) || data === "k") this.move(-1);
|
|
574
|
+
else if (matchesKey(data, Key.down) || data === "j") this.move(1);
|
|
575
|
+
else if (data === " " || matchesKey(data, Key.enter)) {
|
|
576
|
+
if (matchesKey(data, Key.enter)) {
|
|
577
|
+
this.done({
|
|
578
|
+
base_name: this.selected_base,
|
|
579
|
+
layers: new Set(this.enabled_layers)
|
|
580
|
+
});
|
|
551
581
|
return;
|
|
552
582
|
}
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
583
|
+
this.toggle_selected();
|
|
584
|
+
} else if (data === " ") {
|
|
585
|
+
this.preview_mode = this.preview_mode === "item" ? "effective" : "item";
|
|
586
|
+
this.preview_offset = 0;
|
|
587
|
+
} else if (data === "c") {
|
|
588
|
+
this.selected_base = void 0;
|
|
589
|
+
this.enabled_layers.clear();
|
|
590
|
+
this.preview_mode = "effective";
|
|
591
|
+
this.preview_offset = 0;
|
|
592
|
+
} else if (data === "a") this.done({
|
|
593
|
+
base_name: this.selected_base,
|
|
594
|
+
layers: new Set(this.enabled_layers)
|
|
595
|
+
});
|
|
596
|
+
else if (matchesKey(data, Key.escape) || data === "q") this.done(void 0);
|
|
597
|
+
else if (data === "J") this.scroll_preview(1);
|
|
598
|
+
else if (data === "K") this.scroll_preview(-1);
|
|
599
|
+
}
|
|
600
|
+
render_stacked(width, body_lines) {
|
|
601
|
+
const list_lines = Math.max(5, Math.floor(body_lines / 2));
|
|
602
|
+
return [
|
|
603
|
+
...this.render_list(width, list_lines),
|
|
604
|
+
this.theme.fg("dim", "─".repeat(Math.min(width, 80))),
|
|
605
|
+
...this.render_preview(width, body_lines - list_lines - 1)
|
|
606
|
+
];
|
|
607
|
+
}
|
|
608
|
+
render_list(width, max_lines) {
|
|
609
|
+
const lines = [this.theme.fg("accent", `Draft selection: ${this.selected_base ?? "(none)"} + ${this.enabled_layers.size} layer(s)`), ""];
|
|
610
|
+
const visible_rows = Math.max(1, max_lines - lines.length);
|
|
611
|
+
const start = Math.max(0, Math.min(this.selected_index - Math.floor(visible_rows / 2), this.rows.length - visible_rows));
|
|
612
|
+
const end = Math.min(start + visible_rows, this.rows.length);
|
|
613
|
+
for (let index = start; index < end; index++) lines.push(this.render_row(this.rows[index], index, width));
|
|
614
|
+
return lines.map((line) => truncateToWidth(line, width));
|
|
615
|
+
}
|
|
616
|
+
render_preview(width, max_lines) {
|
|
617
|
+
const heading = this.preview_mode === "effective" ? "Effective prompt contribution" : "Selected preset";
|
|
618
|
+
const text = this.preview_mode === "effective" ? this.get_effective_prompt_text() : this.get_selected_prompt_text();
|
|
619
|
+
const content_width = Math.max(10, width);
|
|
620
|
+
this.preview_lines = text.split("\n").flatMap((line) => line.trim().length === 0 ? [""] : wrapTextWithAnsi(line, content_width));
|
|
621
|
+
const available = Math.max(1, max_lines - 2);
|
|
622
|
+
const max_offset = Math.max(0, this.preview_lines.length - available);
|
|
623
|
+
this.preview_offset = Math.max(0, Math.min(this.preview_offset, max_offset));
|
|
624
|
+
const end = Math.min(this.preview_offset + available, this.preview_lines.length);
|
|
625
|
+
const range = this.preview_lines.length > available ? ` (${this.preview_offset + 1}-${end}/${this.preview_lines.length})` : "";
|
|
626
|
+
return [
|
|
627
|
+
this.theme.fg("accent", this.theme.bold(`${heading}${range}`)),
|
|
628
|
+
"",
|
|
629
|
+
...this.preview_lines.slice(this.preview_offset, end).map((line) => truncateToWidth(line, width))
|
|
630
|
+
];
|
|
631
|
+
}
|
|
632
|
+
render_row(row, index, width) {
|
|
633
|
+
if (row.type === "header") return this.theme.fg("muted", ` ${row.label}`);
|
|
634
|
+
const cursor = index === this.selected_index ? this.theme.fg("accent", "› ") : " ";
|
|
635
|
+
const marker = this.get_marker(row);
|
|
636
|
+
const label = row.type === "base-none" ? row.label : row.preset.name;
|
|
637
|
+
const suffix = row.type === "preset" ? ` ${this.theme.fg("dim", get_prompt_source_label(row.preset.source))}` : "";
|
|
638
|
+
return truncateToWidth(`${cursor}${marker} ${this.pad(label, 18)}${suffix}`, width);
|
|
639
|
+
}
|
|
640
|
+
get_marker(row) {
|
|
641
|
+
if (row.type === "header") return " ";
|
|
642
|
+
if (row.type === "base-none") return this.selected_base ? "○" : "●";
|
|
643
|
+
if (row.preset.kind === "base") return this.selected_base === row.preset.name ? "●" : "○";
|
|
644
|
+
return this.enabled_layers.has(row.preset.name) ? "☑" : "☐";
|
|
645
|
+
}
|
|
646
|
+
get_selected_prompt_text() {
|
|
647
|
+
const row = this.rows[this.selected_index];
|
|
648
|
+
if (!row || row.type === "header") return "";
|
|
649
|
+
if (row.type === "base-none") return "No active base preset. Only enabled prompt layers will be appended.";
|
|
650
|
+
const preset = row.preset;
|
|
651
|
+
return [
|
|
652
|
+
`# ${preset.name}`,
|
|
653
|
+
"",
|
|
654
|
+
`Kind: ${preset.kind}`,
|
|
655
|
+
`Source: ${get_prompt_source_label(preset.source)}`,
|
|
656
|
+
preset.description ? `Description: ${preset.description}` : void 0,
|
|
657
|
+
"",
|
|
658
|
+
preset.instructions.trim() || "(empty preset)"
|
|
659
|
+
].filter((line) => line !== void 0).join("\n");
|
|
660
|
+
}
|
|
661
|
+
get_effective_prompt_text() {
|
|
662
|
+
const blocks = build_active_prompt_blocks(this.state.presets, this.selected_base, this.enabled_layers);
|
|
663
|
+
return blocks.length > 0 ? blocks.join("\n\n") : "(No prompt preset text will be appended.)";
|
|
664
|
+
}
|
|
665
|
+
toggle_selected() {
|
|
666
|
+
const row = this.rows[this.selected_index];
|
|
667
|
+
if (!row || row.type === "header") return;
|
|
668
|
+
if (row.type === "base-none") this.selected_base = void 0;
|
|
669
|
+
else if (row.preset.kind === "base") this.selected_base = row.preset.name;
|
|
670
|
+
else if (this.enabled_layers.has(row.preset.name)) this.enabled_layers.delete(row.preset.name);
|
|
671
|
+
else this.enabled_layers.add(row.preset.name);
|
|
672
|
+
this.preview_mode = "effective";
|
|
673
|
+
this.preview_offset = 0;
|
|
674
|
+
}
|
|
675
|
+
move(delta) {
|
|
676
|
+
let next = this.selected_index;
|
|
677
|
+
do
|
|
678
|
+
next = (next + delta + this.rows.length) % this.rows.length;
|
|
679
|
+
while (this.rows[next]?.type === "header");
|
|
680
|
+
this.selected_index = next;
|
|
681
|
+
this.preview_offset = 0;
|
|
682
|
+
}
|
|
683
|
+
skip_header(fallback) {
|
|
684
|
+
if (this.rows[this.selected_index]?.type !== "header") return;
|
|
685
|
+
this.selected_index = fallback;
|
|
686
|
+
}
|
|
687
|
+
scroll_preview(delta) {
|
|
688
|
+
const max_offset = Math.max(0, this.preview_lines.length - 1);
|
|
689
|
+
this.preview_offset = Math.max(0, Math.min(this.preview_offset + delta, max_offset));
|
|
690
|
+
}
|
|
691
|
+
pad(text, width) {
|
|
692
|
+
const visible = visibleWidth(text);
|
|
693
|
+
return text + " ".repeat(Math.max(0, width - visible));
|
|
694
|
+
}
|
|
695
|
+
pad_line(text, width) {
|
|
696
|
+
const truncated = truncateToWidth(text, width);
|
|
697
|
+
return truncated + " ".repeat(Math.max(0, width - visibleWidth(truncated)));
|
|
698
|
+
}
|
|
699
|
+
};
|
|
572
700
|
//#endregion
|
|
573
701
|
//#region src/extensions/prompt-presets/index.ts
|
|
574
702
|
async function prompt_presets(pi) {
|
|
@@ -868,4 +996,4 @@ async function prompt_presets(pi) {
|
|
|
868
996
|
//#endregion
|
|
869
997
|
export { prompt_presets as default };
|
|
870
998
|
|
|
871
|
-
//# sourceMappingURL=prompt-presets-
|
|
999
|
+
//# sourceMappingURL=prompt-presets-DqTJeo_C.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-presets-DqTJeo_C.js","names":[],"sources":["../src/extensions/prompt-presets/catalog.ts","../src/extensions/prompt-presets/completions.ts","../src/extensions/prompt-presets/defaults.ts","../src/extensions/prompt-presets/footer.ts","../src/extensions/prompt-presets/help.ts","../src/extensions/prompt-presets/prompt-blocks.ts","../src/extensions/prompt-presets/storage.ts","../src/extensions/prompt-presets/state.ts","../src/extensions/prompt-presets/manager.ts","../src/extensions/prompt-presets/index.ts"],"sourcesContent":["import type {\n\tLoadedPromptPreset,\n\tPromptPresetSource,\n} from './types.js';\n\nexport function get_prompt_source_label(\n\tsource: PromptPresetSource,\n): string {\n\tswitch (source) {\n\t\tcase 'builtin':\n\t\t\treturn 'built-in';\n\t\tcase 'user':\n\t\t\treturn 'user';\n\t\tcase 'project':\n\t\t\treturn 'project';\n\t}\n}\n\nexport function list_base_presets(\n\tpresets: Record<string, LoadedPromptPreset>,\n): LoadedPromptPreset[] {\n\treturn Object.values(presets)\n\t\t.filter((preset) => preset.kind === 'base')\n\t\t.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function list_layer_presets(\n\tpresets: Record<string, LoadedPromptPreset>,\n): LoadedPromptPreset[] {\n\treturn Object.values(presets)\n\t\t.filter((preset) => preset.kind === 'layer')\n\t\t.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function format_summary(\n\tactive_base_name: string | undefined,\n\tactive_layers: ReadonlySet<string>,\n\tpresets: Record<string, LoadedPromptPreset>,\n): string {\n\tconst lines = [`Base: ${active_base_name ?? '(none)'}`];\n\n\tconst layer_names = [...active_layers].sort();\n\tif (layer_names.length === 0) {\n\t\tlines.push('Layers: (none)');\n\t} else {\n\t\tlines.push('Layers:');\n\t\tfor (const name of layer_names) {\n\t\t\tconst preset = presets[name];\n\t\t\tconst description = preset?.description\n\t\t\t\t? ` — ${preset.description}`\n\t\t\t\t: '';\n\t\t\tlines.push(`- ${name}${description}`);\n\t\t}\n\t}\n\n\treturn lines.join('\\n');\n}\n\nexport function format_active_details(\n\tactive_base_name: string | undefined,\n\tactive_layers: ReadonlySet<string>,\n\tpresets: Record<string, LoadedPromptPreset>,\n): string {\n\tconst parts: string[] = [];\n\n\tif (active_base_name) {\n\t\tconst base = presets[active_base_name];\n\t\tif (base) {\n\t\t\tparts.push(`Base: ${base.name}`);\n\t\t\tif (base.description)\n\t\t\t\tparts.push(`Description: ${base.description}`);\n\t\t\tparts.push(`Source: ${get_prompt_source_label(base.source)}`);\n\t\t\tparts.push('', base.instructions.trim());\n\t\t}\n\t}\n\n\tconst layer_names = [...active_layers].sort();\n\tif (layer_names.length > 0) {\n\t\tif (parts.length > 0) parts.push('', '---', '');\n\t\tparts.push('Layers:');\n\t\tfor (const name of layer_names) {\n\t\t\tconst layer = presets[name];\n\t\t\tif (!layer) continue;\n\t\t\tparts.push(\n\t\t\t\t`- ${layer.name} (${get_prompt_source_label(layer.source)})`,\n\t\t\t);\n\t\t\tif (layer.description) parts.push(` ${layer.description}`);\n\t\t}\n\t}\n\n\treturn parts.join('\\n') || 'No preset or layers active';\n}\n","import { list_base_presets, list_layer_presets } from './catalog.js';\nimport type { LoadedPromptPreset } from './types.js';\n\nconst SUBCOMMANDS = [\n\t'help',\n\t'list',\n\t'show',\n\t'clear',\n\t'edit',\n\t'edit-global',\n\t'export-defaults',\n\t'delete',\n\t'reset',\n\t'reload',\n\t'base',\n\t'enable',\n\t'disable',\n\t'toggle',\n];\n\nexport function get_prompt_preset_completions(\n\tpresets: Record<string, LoadedPromptPreset>,\n\tprefix: string,\n): Array<{ value: string; label: string }> | null {\n\tconst trimmed = prefix.trim();\n\tconst parts = trimmed ? trimmed.split(/\\s+/) : [];\n\tconst base_names = list_base_presets(presets).map(\n\t\t(preset) => preset.name,\n\t);\n\tconst layer_names = list_layer_presets(presets).map(\n\t\t(preset) => preset.name,\n\t);\n\tconst all_names = [...base_names, ...layer_names];\n\n\tif (parts.length <= 1) {\n\t\tconst query = parts[0] ?? '';\n\t\treturn [\n\t\t\t...SUBCOMMANDS.filter((item) => item.startsWith(query)).map(\n\t\t\t\t(item) => ({ value: item, label: item }),\n\t\t\t),\n\t\t\t...all_names\n\t\t\t\t.filter((item) => item.startsWith(query))\n\t\t\t\t.map((item) => ({ value: item, label: item })),\n\t\t];\n\t}\n\n\tconst command = parts[0];\n\tconst query = parts.slice(1).join(' ');\n\tif (command === 'base') {\n\t\treturn base_names\n\t\t\t.filter((item) => item.startsWith(query))\n\t\t\t.map((item) => ({ value: `base ${item}`, label: item }));\n\t}\n\tif (['enable', 'disable', 'toggle'].includes(command)) {\n\t\treturn layer_names\n\t\t\t.filter((item) => item.startsWith(query))\n\t\t\t.map((item) => ({\n\t\t\t\tvalue: `${command} ${item}`,\n\t\t\t\tlabel: item,\n\t\t\t}));\n\t}\n\tif (command === 'edit' || command === 'edit-global') {\n\t\treturn all_names\n\t\t\t.filter((item) => item.startsWith(query))\n\t\t\t.map((item) => ({\n\t\t\t\tvalue: `${command} ${item}`,\n\t\t\t\tlabel: item,\n\t\t\t}));\n\t}\n\tif (['delete', 'reset'].includes(command)) {\n\t\treturn all_names\n\t\t\t.filter((item) => item.startsWith(query))\n\t\t\t.map((item) => ({\n\t\t\t\tvalue: `${command} ${item}`,\n\t\t\t\tlabel: item,\n\t\t\t}));\n\t}\n\treturn null;\n}\n","import type { PromptPresetMap } from './types.js';\n\nexport const DEFAULT_BASE_PROMPT_PRESET_NAME = 'terse';\n\nexport const DEFAULT_PROMPT_PRESETS: PromptPresetMap = {\n\tterse: {\n\t\tkind: 'base',\n\t\tdescription: 'Short, direct, no fluff',\n\t\tinstructions:\n\t\t\t\"Be concise and direct. Default to the shortest response that fully solves the user's request. Use at most one short paragraph or 3 bullets unless the user explicitly asks for detail. For implementation reports, include only what changed, validation, and the next step if relevant. No purple prose, no filler, no repetitive caveats.\",\n\t},\n\tstandard: {\n\t\tkind: 'base',\n\t\tdescription: 'Clear and concise with key context',\n\t\tinstructions:\n\t\t\t'Be clear, direct, and concise. Include only the reasoning and implementation details that matter. Avoid filler, grandstanding, and ornamental language. Use bullets when they improve scanability.',\n\t},\n\tdetailed: {\n\t\tkind: 'base',\n\t\tdescription: 'More explanation when nuance matters',\n\t\tinstructions:\n\t\t\t'Be thorough when the task is complex or tradeoffs matter, but stay practical. Explain only the details that help the user decide, verify, or implement. Avoid purple prose and unnecessary scene-setting.',\n\t},\n\t'no-purple-prose': {\n\t\tkind: 'layer',\n\t\tdescription: 'Strip out ornamental language',\n\t\tinstructions:\n\t\t\t'Do not use purple prose, flourish, motivational filler, or theatrical transitions. Prefer plain language and concrete statements.',\n\t},\n\tbullets: {\n\t\tkind: 'layer',\n\t\tdescription: 'Prefer short bullets when useful',\n\t\tinstructions:\n\t\t\t'When presenting options, findings, or steps, prefer short bullet lists over long paragraphs.',\n\t},\n\t'clarify-first': {\n\t\tkind: 'layer',\n\t\tdescription:\n\t\t\t'Ask brief clarifying questions when requirements are ambiguous',\n\t\tinstructions:\n\t\t\t'If the request is materially ambiguous, ask the minimum clarifying question(s) needed before proceeding. Do not ask unnecessary questions.',\n\t},\n\t'include-risks': {\n\t\tkind: 'layer',\n\t\tdescription: 'Call out notable risks or tradeoffs',\n\t\tinstructions:\n\t\t\t'When making a recommendation or implementation plan, briefly mention the key risk, tradeoff, or caveat if one materially matters.',\n\t},\n\tkarpathy: {\n\t\tkind: 'layer',\n\t\tdescription:\n\t\t\t'Bias toward simple, surgical, verified code changes',\n\t\tinstructions:\n\t\t\t'Before coding, state assumptions when unclear and surface meaningful tradeoffs. Prefer the minimum code that solves the request; avoid speculative abstractions, flexibility, and unrelated cleanup. Make surgical changes: touch only lines directly tied to the task, match existing style, and mention unrelated issues instead of fixing them. For multi-step work, use brief success criteria and verify with focused checks before reporting.',\n\t},\n};\n","import type { ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nfunction get_footer_prompt_status(\n\tactive_base_name: string | undefined,\n\tactive_layers: ReadonlySet<string>,\n): string | undefined {\n\tif (!active_base_name && active_layers.size === 0) {\n\t\treturn undefined;\n\t}\n\n\tconst label = active_base_name ?? 'none';\n\tconst layer_suffix =\n\t\tactive_layers.size > 0 ? ` +${active_layers.size}` : '';\n\treturn `prompt:${label}${layer_suffix}`;\n}\n\nexport function set_status(\n\tctx: ExtensionContext,\n\tactive_base_name: string | undefined,\n\tactive_layers: ReadonlySet<string>,\n): void {\n\tctx.ui.setStatus(\n\t\t'preset',\n\t\tget_footer_prompt_status(active_base_name, active_layers),\n\t);\n}\n","export function is_subcommand(command: string): boolean {\n\treturn [\n\t\t'help',\n\t\t'list',\n\t\t'show',\n\t\t'clear',\n\t\t'edit',\n\t\t'edit-global',\n\t\t'export-defaults',\n\t\t'delete',\n\t\t'reset',\n\t\t'reload',\n\t\t'base',\n\t\t'enable',\n\t\t'disable',\n\t\t'toggle',\n\t].includes(command);\n}\n\nexport function format_prompt_preset_help(): string {\n\treturn `Prompt presets append instructions to the system prompt.\n\nCommands:\n- /prompt-preset Open the preset picker\n- /prompt-preset show Show the active base and layers\n- /prompt-preset <name> Activate a base preset or toggle a layer\n- /prompt-preset base <name> Activate a base preset\n- /prompt-preset enable <layer> Enable a layer\n- /prompt-preset disable <layer> Disable a layer\n- /prompt-preset edit <name> Edit/create .pi/presets/<name>.md\n- /prompt-preset edit-global <name> Edit/create ~/.pi/agent/presets/<name>.md\n- /prompt-preset export-defaults Export built-ins to ~/.pi/agent/presets/*.md\n- /prompt-preset export-defaults project Export built-ins to .pi/presets/*.md\n- /prompt-preset reload Reload presets after manual file edits\n- /prompt-preset clear Clear active base and layers\n\nExamples:\n- /prompt-preset export-defaults\n- /prompt-preset edit-global terse\n- /prompt-preset base detailed\n- /prompt-preset enable bullets\n- /prompt-preset show\n\nAlias: /preset`;\n}\n","import type { LoadedPromptPreset } from './types.js';\n\nexport function build_active_prompt_blocks(\n\tpresets: Record<string, LoadedPromptPreset>,\n\tactive_base_name: string | undefined,\n\tactive_layers: ReadonlySet<string>,\n): string[] {\n\tconst blocks: string[] = [];\n\tconst base = active_base_name\n\t\t? presets[active_base_name]\n\t\t: undefined;\n\tif (base?.instructions.trim()) {\n\t\tblocks.push(\n\t\t\t`## Active Base Prompt: ${base.name}\\n${base.instructions.trim()}`,\n\t\t);\n\t}\n\n\tconst layer_blocks = [...active_layers]\n\t\t.sort()\n\t\t.map((name) => presets[name])\n\t\t.filter((preset): preset is LoadedPromptPreset =>\n\t\t\tBoolean(preset?.instructions.trim()),\n\t\t)\n\t\t.map(\n\t\t\t(preset) => `### ${preset.name}\\n${preset.instructions.trim()}`,\n\t\t);\n\tif (layer_blocks.length > 0) {\n\t\tblocks.push(\n\t\t\t`## Active Prompt Layers\\n\\n${layer_blocks.join('\\n\\n')}`,\n\t\t);\n\t}\n\n\treturn blocks;\n}\n","import {\n\tgetAgentDir,\n\tparseFrontmatter,\n} from '@earendil-works/pi-coding-agent';\nimport {\n\tread_settings,\n\twrite_settings,\n} from '@spences10/pi-settings';\nimport {\n\texistsSync,\n\tmkdirSync,\n\treaddirSync,\n\treadFileSync,\n\trenameSync,\n\tunlinkSync,\n\twriteFileSync,\n} from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { DEFAULT_PROMPT_PRESETS } from './defaults.js';\nimport type {\n\tLoadedPromptPreset,\n\tPromptPreset,\n\tPromptPresetMap,\n\tPromptPresetSource,\n\tPromptPresetState,\n} from './types.js';\n\nconst PROJECT_PROMPT_PRESETS_ENV = 'MY_PI_PROMPT_PRESETS_PROJECT';\n\ninterface PersistedPromptPresetStates {\n\tversion: number;\n\tprojects: Record<string, PromptPresetState>;\n}\n\nexport function normalize_prompt_presets(\n\tinput: unknown,\n): PromptPresetMap {\n\tif (!input || typeof input !== 'object') return {};\n\n\tconst normalized: PromptPresetMap = {};\n\tfor (const [raw_name, raw_value] of Object.entries(input)) {\n\t\tconst name = raw_name.trim();\n\t\tif (!name) continue;\n\n\t\tif (typeof raw_value === 'string') {\n\t\t\tnormalized[name] = {\n\t\t\t\tkind: 'base',\n\t\t\t\tinstructions: raw_value,\n\t\t\t};\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!raw_value || typeof raw_value !== 'object') continue;\n\t\tconst candidate = raw_value as {\n\t\t\tkind?: unknown;\n\t\t\tdescription?: unknown;\n\t\t\tinstructions?: unknown;\n\t\t};\n\t\tif (typeof candidate.instructions !== 'string') continue;\n\n\t\tnormalized[name] = {\n\t\t\tinstructions: candidate.instructions,\n\t\t\t...(candidate.kind === 'layer'\n\t\t\t\t? { kind: 'layer' as const }\n\t\t\t\t: {}),\n\t\t\t...(typeof candidate.description === 'string'\n\t\t\t\t? { description: candidate.description }\n\t\t\t\t: {}),\n\t\t};\n\t}\n\n\treturn normalized;\n}\n\nexport function merge_prompt_presets(\n\t...sources: PromptPresetMap[]\n): PromptPresetMap {\n\treturn Object.assign({}, ...sources);\n}\n\nfunction to_loaded_prompt_presets(\n\tpresets: PromptPresetMap,\n\tsource: PromptPresetSource,\n): Record<string, LoadedPromptPreset> {\n\treturn Object.fromEntries(\n\t\tObject.entries(presets).map(([name, preset]) => [\n\t\t\tname,\n\t\t\t{\n\t\t\t\tname,\n\t\t\t\tkind: preset.kind === 'layer' ? 'layer' : 'base',\n\t\t\t\tsource,\n\t\t\t\t...preset,\n\t\t\t},\n\t\t]),\n\t);\n}\n\nfunction get_global_presets_path(): string {\n\treturn join(getAgentDir(), 'presets.json');\n}\n\nfunction get_project_presets_path(cwd: string): string {\n\treturn join(cwd, '.pi', 'presets.json');\n}\n\nexport function get_global_presets_dir(): string {\n\treturn join(getAgentDir(), 'presets');\n}\n\nexport function get_project_presets_dir(cwd: string): string {\n\treturn join(cwd, '.pi', 'presets');\n}\n\nfunction sanitize_prompt_preset_file_name(name: string): string {\n\tconst sanitized = name\n\t\t.trim()\n\t\t.replace(/[\\\\/:*?\"<>|]/g, '-')\n\t\t.replace(/^\\.+$/, '')\n\t\t.replace(/^\\.+/, '')\n\t\t.replace(/\\.+$/, '');\n\tif (!sanitized) {\n\t\tthrow new Error(\n\t\t\t'Prompt preset name must contain a file-safe character',\n\t\t);\n\t}\n\treturn sanitized;\n}\n\nexport function get_prompt_preset_file_path(\n\tdir: string,\n\tname: string,\n): string {\n\treturn join(dir, `${sanitize_prompt_preset_file_name(name)}.md`);\n}\n\nfunction get_persisted_prompt_state_path(): string {\n\treturn join(getAgentDir(), 'prompt-preset-state.json');\n}\n\nfunction read_prompt_presets_file(path: string): PromptPresetMap {\n\ttry {\n\t\tif (path === get_global_presets_path()) {\n\t\t\treturn normalize_prompt_presets(\n\t\t\t\tread_settings().promptPresets?.global ?? {},\n\t\t\t);\n\t\t}\n\t\tif (!existsSync(path)) return {};\n\t\treturn normalize_prompt_presets(\n\t\t\tJSON.parse(readFileSync(path, 'utf-8')),\n\t\t);\n\t} catch {\n\t\treturn {};\n\t}\n}\n\nfunction parse_prompt_preset_markdown(content: string): {\n\tmetadata: Record<string, unknown>;\n\tbody: string;\n} {\n\tconst { frontmatter, body } = parseFrontmatter(content);\n\treturn { metadata: frontmatter, body: body.trim() };\n}\n\nexport function read_prompt_presets_dir(\n\tpath: string,\n): PromptPresetMap {\n\tif (!existsSync(path)) return {};\n\n\ttry {\n\t\tconst presets: PromptPresetMap = {};\n\t\tfor (const entry of readdirSync(path, { withFileTypes: true })\n\t\t\t.filter((item) => item.isFile() && item.name.endsWith('.md'))\n\t\t\t.sort((a, b) => a.name.localeCompare(b.name))) {\n\t\t\tconst name = entry.name.slice(0, -3).trim();\n\t\t\tif (!name) continue;\n\t\t\tconst { metadata, body } = parse_prompt_preset_markdown(\n\t\t\t\treadFileSync(join(path, entry.name), 'utf-8'),\n\t\t\t);\n\t\t\tif (!body) continue;\n\t\t\tpresets[name] = {\n\t\t\t\tkind: metadata.kind === 'layer' ? 'layer' : 'base',\n\t\t\t\tinstructions: body,\n\t\t\t\t...(typeof metadata.description === 'string' &&\n\t\t\t\tmetadata.description.trim()\n\t\t\t\t\t? { description: metadata.description }\n\t\t\t\t\t: {}),\n\t\t\t};\n\t\t}\n\t\treturn presets;\n\t} catch {\n\t\treturn {};\n\t}\n}\n\nfunction format_prompt_preset_markdown(preset: PromptPreset): string {\n\tconst lines = [\n\t\t'---',\n\t\t`kind: ${preset.kind === 'layer' ? 'layer' : 'base'}`,\n\t];\n\tif (preset.description?.trim()) {\n\t\tlines.push(\n\t\t\t`description: ${JSON.stringify(preset.description.trim())}`,\n\t\t);\n\t}\n\tlines.push('---', '', preset.instructions.trim(), '');\n\treturn lines.join('\\n');\n}\n\nexport function save_prompt_preset_file(\n\tdir: string,\n\tname: string,\n\tpreset: PromptPreset,\n): string {\n\tif (!existsSync(dir)) {\n\t\tmkdirSync(dir, { recursive: true, mode: 0o700 });\n\t}\n\n\tconst path = get_prompt_preset_file_path(dir, name);\n\tconst tmp = `${path}.tmp-${Date.now()}`;\n\twriteFileSync(tmp, format_prompt_preset_markdown(preset), {\n\t\tmode: 0o600,\n\t});\n\trenameSync(tmp, path);\n\treturn path;\n}\n\nexport function save_project_prompt_preset_file(\n\tcwd: string,\n\tname: string,\n\tpreset: PromptPreset,\n): string {\n\treturn save_prompt_preset_file(\n\t\tget_project_presets_dir(cwd),\n\t\tname,\n\t\tpreset,\n\t);\n}\n\nexport function save_global_prompt_preset_file(\n\tname: string,\n\tpreset: PromptPreset,\n): string {\n\treturn save_prompt_preset_file(\n\t\tget_global_presets_dir(),\n\t\tname,\n\t\tpreset,\n\t);\n}\n\nfunction should_load_project_prompt_presets(): boolean {\n\tconst normalized = process.env[PROJECT_PROMPT_PRESETS_ENV]\n\t\t?.trim()\n\t\t.toLowerCase();\n\treturn !['0', 'false', 'no', 'skip', 'disable'].includes(\n\t\tnormalized ?? '',\n\t);\n}\n\nexport function load_prompt_presets(\n\tcwd: string,\n): Record<string, LoadedPromptPreset> {\n\treturn Object.assign(\n\t\t{},\n\t\tto_loaded_prompt_presets(DEFAULT_PROMPT_PRESETS, 'builtin'),\n\t\tto_loaded_prompt_presets(\n\t\t\tread_prompt_presets_file(get_global_presets_path()),\n\t\t\t'user',\n\t\t),\n\t\tto_loaded_prompt_presets(\n\t\t\tread_prompt_presets_dir(get_global_presets_dir()),\n\t\t\t'user',\n\t\t),\n\t\t...(should_load_project_prompt_presets()\n\t\t\t? [\n\t\t\t\t\tto_loaded_prompt_presets(\n\t\t\t\t\t\tread_prompt_presets_file(get_project_presets_path(cwd)),\n\t\t\t\t\t\t'project',\n\t\t\t\t\t),\n\t\t\t\t\tto_loaded_prompt_presets(\n\t\t\t\t\t\tread_prompt_presets_dir(get_project_presets_dir(cwd)),\n\t\t\t\t\t\t'project',\n\t\t\t\t\t),\n\t\t\t\t]\n\t\t\t: []),\n\t);\n}\n\nfunction sort_prompt_presets(\n\tpresets: PromptPresetMap,\n): PromptPresetMap {\n\treturn Object.fromEntries(\n\t\tObject.entries(presets).sort(([a], [b]) => a.localeCompare(b)),\n\t);\n}\n\nexport function save_project_prompt_presets(\n\tcwd: string,\n\tpresets: PromptPresetMap,\n): string {\n\tconst path = get_project_presets_path(cwd);\n\tconst dir = dirname(path);\n\tif (!existsSync(dir)) {\n\t\tmkdirSync(dir, { recursive: true, mode: 0o700 });\n\t}\n\n\tconst tmp = `${path}.tmp-${Date.now()}`;\n\twriteFileSync(\n\t\ttmp,\n\t\tJSON.stringify(sort_prompt_presets(presets), null, '\\t') + '\\n',\n\t\t{ mode: 0o600 },\n\t);\n\trenameSync(tmp, path);\n\treturn path;\n}\n\nexport function remove_project_prompt_preset(\n\tcwd: string,\n\tname: string,\n): {\n\tremoved: boolean;\n\tpath: string;\n\tremaining: number;\n} {\n\tconst json_path = get_project_presets_path(cwd);\n\tconst project_presets = read_prompt_presets_file(json_path);\n\tlet removed = false;\n\tlet removed_path = json_path;\n\n\tif (name in project_presets) {\n\t\tdelete project_presets[name];\n\t\tremoved = true;\n\t\tremoved_path = json_path;\n\t\tif (Object.keys(project_presets).length === 0) {\n\t\t\tif (existsSync(json_path)) {\n\t\t\t\tunlinkSync(json_path);\n\t\t\t}\n\t\t} else {\n\t\t\tsave_project_prompt_presets(cwd, project_presets);\n\t\t}\n\t}\n\n\tconst file_path = get_prompt_preset_file_path(\n\t\tget_project_presets_dir(cwd),\n\t\tname,\n\t);\n\tif (existsSync(file_path)) {\n\t\tunlinkSync(file_path);\n\t\tremoved = true;\n\t\tremoved_path = file_path;\n\t}\n\n\tconst remaining =\n\t\tObject.keys(read_prompt_presets_file(json_path)).length +\n\t\tObject.keys(read_prompt_presets_dir(get_project_presets_dir(cwd)))\n\t\t\t.length;\n\n\treturn { removed, path: removed_path, remaining };\n}\n\nfunction normalize_prompt_preset_state(\n\tinput: unknown,\n): PromptPresetState | undefined {\n\tif (!input || typeof input !== 'object') return undefined;\n\n\tconst candidate = input as {\n\t\tbase_name?: unknown;\n\t\tlayer_names?: unknown;\n\t};\n\tconst base_name =\n\t\ttypeof candidate.base_name === 'string' &&\n\t\tcandidate.base_name.trim()\n\t\t\t? candidate.base_name.trim()\n\t\t\t: null;\n\tconst layer_names = Array.isArray(candidate.layer_names)\n\t\t? [\n\t\t\t\t...new Set(\n\t\t\t\t\tcandidate.layer_names\n\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t(value): value is string =>\n\t\t\t\t\t\t\t\ttypeof value === 'string' && value.trim().length > 0,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.map((value) => value.trim()),\n\t\t\t\t),\n\t\t\t].sort()\n\t\t: [];\n\n\treturn {\n\t\tbase_name,\n\t\tlayer_names,\n\t};\n}\n\nfunction read_persisted_prompt_states(\n\tpath = get_persisted_prompt_state_path(),\n): PersistedPromptPresetStates {\n\ttry {\n\t\tconst parsed = (\n\t\t\tpath === get_persisted_prompt_state_path()\n\t\t\t\t? (read_settings().promptPresets?.state ?? {})\n\t\t\t\t: existsSync(path)\n\t\t\t\t\t? JSON.parse(readFileSync(path, 'utf-8'))\n\t\t\t\t\t: {}\n\t\t) as {\n\t\t\tversion?: unknown;\n\t\t\tprojects?: unknown;\n\t\t};\n\t\tconst raw_projects =\n\t\t\tparsed.projects && typeof parsed.projects === 'object'\n\t\t\t\t? parsed.projects\n\t\t\t\t: {};\n\t\tconst projects: Record<string, PromptPresetState> = {};\n\t\tfor (const [cwd, value] of Object.entries(raw_projects)) {\n\t\t\tconst normalized = normalize_prompt_preset_state(value);\n\t\t\tif (!normalized) continue;\n\t\t\tprojects[cwd] = normalized;\n\t\t}\n\t\treturn {\n\t\t\tversion:\n\t\t\t\ttypeof parsed.version === 'number' ? parsed.version : 1,\n\t\t\tprojects,\n\t\t};\n\t} catch {\n\t\treturn { version: 1, projects: {} };\n\t}\n}\n\nexport function load_persisted_prompt_state(\n\tcwd: string,\n\tpath = get_persisted_prompt_state_path(),\n): PromptPresetState | undefined {\n\treturn read_persisted_prompt_states(path).projects[cwd];\n}\n\nexport function save_persisted_prompt_state(\n\tcwd: string,\n\tstate: PromptPresetState,\n\tpath = get_persisted_prompt_state_path(),\n): string {\n\tconst persisted = read_persisted_prompt_states(path);\n\tpersisted.projects[cwd] = normalize_prompt_preset_state(state) ?? {\n\t\tbase_name: null,\n\t\tlayer_names: [],\n\t};\n\n\tconst next = {\n\t\tversion: 1,\n\t\tprojects: Object.fromEntries(\n\t\t\tObject.entries(persisted.projects).sort(([a], [b]) =>\n\t\t\t\ta.localeCompare(b),\n\t\t\t),\n\t\t),\n\t};\n\tif (path === get_persisted_prompt_state_path()) {\n\t\tconst settings = read_settings();\n\t\twrite_settings({\n\t\t\t...settings,\n\t\t\tpromptPresets: { ...settings.promptPresets, state: next },\n\t\t});\n\t\treturn path;\n\t}\n\n\tconst dir = dirname(path);\n\tif (!existsSync(dir)) {\n\t\tmkdirSync(dir, { recursive: true, mode: 0o700 });\n\t}\n\n\tconst tmp = `${path}.tmp-${Date.now()}`;\n\twriteFileSync(tmp, JSON.stringify(next, null, '\\t') + '\\n', {\n\t\tmode: 0o600,\n\t});\n\trenameSync(tmp, path);\n\treturn path;\n}\n","import type {\n\tExtensionAPI,\n\tExtensionContext,\n} from '@earendil-works/pi-coding-agent';\nimport { save_persisted_prompt_state } from './storage.js';\nimport type {\n\tLoadedPromptPreset,\n\tPromptPresetState,\n} from './types.js';\n\nexport const PRESET_STATE_TYPE = 'prompt-preset-state';\nexport const ENABLED = '● enabled';\nexport const DISABLED = '○ disabled';\nexport const SELECTED = '● selected';\nexport const UNSELECTED = '○';\nexport const NONE_BASE_ID = '__base_none__';\n\nexport function get_last_preset_state(\n\tctx: ExtensionContext,\n): PromptPresetState | undefined {\n\tconst entries = ctx.sessionManager.getEntries();\n\tfor (let i = entries.length - 1; i >= 0; i--) {\n\t\tconst entry = entries[i] as {\n\t\t\ttype?: string;\n\t\t\tcustomType?: string;\n\t\t\tdata?: PromptPresetState;\n\t\t};\n\t\tif (\n\t\t\tentry.type === 'custom' &&\n\t\t\tentry.customType === PRESET_STATE_TYPE &&\n\t\t\tentry.data\n\t\t) {\n\t\t\treturn entry.data;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport function 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\nexport function persist_state(\n\tpi: ExtensionAPI,\n\tctx: ExtensionContext,\n\tactive_base_name: string | undefined,\n\tactive_layers: ReadonlySet<string>,\n): void {\n\tconst state = {\n\t\tbase_name: active_base_name ?? null,\n\t\tlayer_names: [...active_layers].sort(),\n\t};\n\tpi.appendEntry(PRESET_STATE_TYPE, state);\n\tsave_persisted_prompt_state(ctx.cwd, state);\n}\n\nexport function normalize_active_state(\n\tpresets: Record<string, LoadedPromptPreset>,\n\tactive_base_name: string | undefined,\n\tactive_layers: ReadonlySet<string>,\n): {\n\tactive_base_name: string | undefined;\n\tactive_layers: Set<string>;\n} {\n\tconst next_base_name =\n\t\tactive_base_name && presets[active_base_name]?.kind === 'base'\n\t\t\t? active_base_name\n\t\t\t: undefined;\n\tconst next_layers = new Set(\n\t\t[...active_layers].filter(\n\t\t\t(name) => presets[name]?.kind === 'layer',\n\t\t),\n\t);\n\treturn {\n\t\tactive_base_name: next_base_name,\n\t\tactive_layers: next_layers,\n\t};\n}\n\nexport function parse_preset_flag(flag: string): string[] {\n\treturn flag\n\t\t.split(',')\n\t\t.map((item) => item.trim())\n\t\t.filter(Boolean);\n}\n","import type { ExtensionCommandContext } from '@earendil-works/pi-coding-agent';\nimport {\n\tKey,\n\tmatchesKey,\n\ttruncateToWidth,\n\tvisibleWidth,\n\twrapTextWithAnsi,\n\ttype Component,\n} from '@earendil-works/pi-tui';\nimport { show_modal, type ModalTheme } from '@spences10/pi-tui-modal';\nimport {\n\tget_prompt_source_label,\n\tlist_base_presets,\n\tlist_layer_presets,\n} from './catalog.js';\nimport { build_active_prompt_blocks } from './prompt-blocks.js';\nimport { NONE_BASE_ID, sets_equal } from './state.js';\nimport type { LoadedPromptPreset } from './types.js';\n\nexport interface PromptPresetManagerState {\n\tpresets: Record<string, LoadedPromptPreset>;\n\tactive_base_name: string | undefined;\n\tactive_layers: ReadonlySet<string>;\n}\n\ntype PromptPresetManagerResult = {\n\tbase_name: string | undefined;\n\tlayers: ReadonlySet<string>;\n};\n\ntype PresetRow =\n\t| { type: 'header'; id: string; label: string }\n\t| { type: 'base-none'; id: typeof NONE_BASE_ID; label: string }\n\t| { type: 'preset'; id: string; preset: LoadedPromptPreset };\n\nexport async function show_prompt_preset_manager(\n\tctx: ExtensionCommandContext,\n\tstate: PromptPresetManagerState,\n\ton_change: (\n\t\tbase_name: string | undefined,\n\t\tlayers: ReadonlySet<string>,\n\t) => void,\n): Promise<void> {\n\tconst base_presets = list_base_presets(state.presets);\n\tconst layer_presets = list_layer_presets(state.presets);\n\tif (base_presets.length === 0 && layer_presets.length === 0) {\n\t\tctx.ui.notify('No prompt presets available', 'warning');\n\t\treturn;\n\t}\n\n\tconst result = await show_modal<\n\t\tPromptPresetManagerResult | undefined\n\t>(\n\t\tctx,\n\t\t{\n\t\t\ttitle: 'Prompt preset inspector',\n\t\t\tsubtitle: () =>\n\t\t\t\t`base: ${state.active_base_name ?? '(none)'} • ${state.active_layers.size} layer(s) currently active`,\n\t\t\tfooter:\n\t\t\t\t'↑↓ navigate • space toggle/select • tab item/effective preview • enter apply • c clear • esc cancel',\n\t\t\toverlay_options: {\n\t\t\t\twidth: '92%',\n\t\t\t\tminWidth: 72,\n\t\t\t\tmaxHeight: '88%',\n\t\t\t},\n\t\t},\n\t\t({ done }, theme, layout) =>\n\t\t\tnew PromptPresetInspectorBody(\n\t\t\t\tstate,\n\t\t\t\ttheme,\n\t\t\t\t() => layout.get_max_body_lines(),\n\t\t\t\tdone,\n\t\t\t),\n\t);\n\n\tif (!result) return;\n\tif (\n\t\tresult.base_name !== state.active_base_name ||\n\t\t!sets_equal(new Set(state.active_layers), result.layers)\n\t) {\n\t\ton_change(result.base_name, result.layers);\n\t}\n}\n\nclass PromptPresetInspectorBody implements Component {\n\tprivate readonly rows: PresetRow[];\n\tprivate selected_index = 1;\n\tprivate selected_base: string | undefined;\n\tprivate readonly enabled_layers: Set<string>;\n\tprivate preview_mode: 'item' | 'effective' = 'item';\n\tprivate preview_offset = 0;\n\tprivate preview_lines: string[] = [];\n\n\tconstructor(\n\t\tprivate readonly state: PromptPresetManagerState,\n\t\tprivate readonly theme: ModalTheme,\n\t\tprivate readonly get_max_lines: () => number,\n\t\tprivate readonly done: (\n\t\t\tresult: PromptPresetManagerResult | undefined,\n\t\t) => void,\n\t) {\n\t\tconst base_presets = list_base_presets(state.presets);\n\t\tconst layer_presets = list_layer_presets(state.presets);\n\t\tthis.rows = [\n\t\t\t{\n\t\t\t\ttype: 'header',\n\t\t\t\tid: '__base_header__',\n\t\t\t\tlabel: `Base presets (${base_presets.length + 1})`,\n\t\t\t},\n\t\t\t{ type: 'base-none', id: NONE_BASE_ID, label: '(none)' },\n\t\t\t...base_presets.map((preset) => ({\n\t\t\t\ttype: 'preset' as const,\n\t\t\t\tid: preset.name,\n\t\t\t\tpreset,\n\t\t\t})),\n\t\t\t{\n\t\t\t\ttype: 'header',\n\t\t\t\tid: '__layer_header__',\n\t\t\t\tlabel: `Prompt layers (${layer_presets.length})`,\n\t\t\t},\n\t\t\t...layer_presets.map((preset) => ({\n\t\t\t\ttype: 'preset' as const,\n\t\t\t\tid: preset.name,\n\t\t\t\tpreset,\n\t\t\t})),\n\t\t];\n\t\tthis.selected_base = state.active_base_name;\n\t\tthis.enabled_layers = new Set(state.active_layers);\n\t\tthis.skip_header(1);\n\t}\n\n\trender(width: number): string[] {\n\t\tconst body_lines = Math.max(8, this.get_max_lines());\n\t\tif (width < 80) return this.render_stacked(width, body_lines);\n\n\t\tconst list_width = Math.min(\n\t\t\t38,\n\t\t\tMath.max(28, Math.floor(width * 0.38)),\n\t\t);\n\t\tconst preview_width = width - list_width - 3;\n\t\tconst list = this.render_list(list_width, body_lines);\n\t\tconst preview = this.render_preview(preview_width, body_lines);\n\t\tconst lines: string[] = [];\n\t\tfor (let i = 0; i < body_lines; i++) {\n\t\t\tlines.push(\n\t\t\t\t`${this.pad_line(list[i] ?? '', list_width)} ${this.theme.fg('dim', '│')} ${preview[i] ?? ''}`,\n\t\t\t);\n\t\t}\n\t\treturn lines.map((line) => truncateToWidth(line, width));\n\t}\n\n\tinvalidate(): void {\n\t\t// No cached rendering.\n\t}\n\n\thandleInput(data: string): void {\n\t\tif (matchesKey(data, Key.up) || data === 'k') {\n\t\t\tthis.move(-1);\n\t\t} else if (matchesKey(data, Key.down) || data === 'j') {\n\t\t\tthis.move(1);\n\t\t} else if (data === ' ' || matchesKey(data, Key.enter)) {\n\t\t\tif (matchesKey(data, Key.enter)) {\n\t\t\t\tthis.done({\n\t\t\t\t\tbase_name: this.selected_base,\n\t\t\t\t\tlayers: new Set(this.enabled_layers),\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.toggle_selected();\n\t\t} else if (data === '\\t') {\n\t\t\tthis.preview_mode =\n\t\t\t\tthis.preview_mode === 'item' ? 'effective' : 'item';\n\t\t\tthis.preview_offset = 0;\n\t\t} else if (data === 'c') {\n\t\t\tthis.selected_base = undefined;\n\t\t\tthis.enabled_layers.clear();\n\t\t\tthis.preview_mode = 'effective';\n\t\t\tthis.preview_offset = 0;\n\t\t} else if (data === 'a') {\n\t\t\tthis.done({\n\t\t\t\tbase_name: this.selected_base,\n\t\t\t\tlayers: new Set(this.enabled_layers),\n\t\t\t});\n\t\t} else if (matchesKey(data, Key.escape) || data === 'q') {\n\t\t\tthis.done(undefined);\n\t\t} else if (data === 'J') {\n\t\t\tthis.scroll_preview(1);\n\t\t} else if (data === 'K') {\n\t\t\tthis.scroll_preview(-1);\n\t\t}\n\t}\n\n\tprivate render_stacked(\n\t\twidth: number,\n\t\tbody_lines: number,\n\t): string[] {\n\t\tconst list_lines = Math.max(5, Math.floor(body_lines / 2));\n\t\treturn [\n\t\t\t...this.render_list(width, list_lines),\n\t\t\tthis.theme.fg('dim', '─'.repeat(Math.min(width, 80))),\n\t\t\t...this.render_preview(width, body_lines - list_lines - 1),\n\t\t];\n\t}\n\n\tprivate render_list(width: number, max_lines: number): string[] {\n\t\tconst lines = [\n\t\t\tthis.theme.fg(\n\t\t\t\t'accent',\n\t\t\t\t`Draft selection: ${this.selected_base ?? '(none)'} + ${this.enabled_layers.size} layer(s)`,\n\t\t\t),\n\t\t\t'',\n\t\t];\n\t\tconst visible_rows = Math.max(1, max_lines - lines.length);\n\t\tconst start = Math.max(\n\t\t\t0,\n\t\t\tMath.min(\n\t\t\t\tthis.selected_index - Math.floor(visible_rows / 2),\n\t\t\t\tthis.rows.length - visible_rows,\n\t\t\t),\n\t\t);\n\t\tconst end = Math.min(start + visible_rows, this.rows.length);\n\t\tfor (let index = start; index < end; index++) {\n\t\t\tlines.push(this.render_row(this.rows[index], index, width));\n\t\t}\n\t\treturn lines.map((line) => truncateToWidth(line, width));\n\t}\n\n\tprivate render_preview(width: number, max_lines: number): string[] {\n\t\tconst heading =\n\t\t\tthis.preview_mode === 'effective'\n\t\t\t\t? 'Effective prompt contribution'\n\t\t\t\t: 'Selected preset';\n\t\tconst text =\n\t\t\tthis.preview_mode === 'effective'\n\t\t\t\t? this.get_effective_prompt_text()\n\t\t\t\t: this.get_selected_prompt_text();\n\t\tconst content_width = Math.max(10, width);\n\t\tthis.preview_lines = text\n\t\t\t.split('\\n')\n\t\t\t.flatMap((line) =>\n\t\t\t\tline.trim().length === 0\n\t\t\t\t\t? ['']\n\t\t\t\t\t: wrapTextWithAnsi(line, content_width),\n\t\t\t);\n\t\tconst available = Math.max(1, max_lines - 2);\n\t\tconst max_offset = Math.max(\n\t\t\t0,\n\t\t\tthis.preview_lines.length - available,\n\t\t);\n\t\tthis.preview_offset = Math.max(\n\t\t\t0,\n\t\t\tMath.min(this.preview_offset, max_offset),\n\t\t);\n\t\tconst end = Math.min(\n\t\t\tthis.preview_offset + available,\n\t\t\tthis.preview_lines.length,\n\t\t);\n\t\tconst range =\n\t\t\tthis.preview_lines.length > available\n\t\t\t\t? ` (${this.preview_offset + 1}-${end}/${this.preview_lines.length})`\n\t\t\t\t: '';\n\t\treturn [\n\t\t\tthis.theme.fg('accent', this.theme.bold(`${heading}${range}`)),\n\t\t\t'',\n\t\t\t...this.preview_lines\n\t\t\t\t.slice(this.preview_offset, end)\n\t\t\t\t.map((line) => truncateToWidth(line, width)),\n\t\t];\n\t}\n\n\tprivate render_row(\n\t\trow: PresetRow,\n\t\tindex: number,\n\t\twidth: number,\n\t): string {\n\t\tif (row.type === 'header') {\n\t\t\treturn this.theme.fg('muted', ` ${row.label}`);\n\t\t}\n\t\tconst selected = index === this.selected_index;\n\t\tconst cursor = selected ? this.theme.fg('accent', '› ') : ' ';\n\t\tconst marker = this.get_marker(row);\n\t\tconst label =\n\t\t\trow.type === 'base-none' ? row.label : row.preset.name;\n\t\tconst suffix =\n\t\t\trow.type === 'preset'\n\t\t\t\t? ` ${this.theme.fg('dim', get_prompt_source_label(row.preset.source))}`\n\t\t\t\t: '';\n\t\treturn truncateToWidth(\n\t\t\t`${cursor}${marker} ${this.pad(label, 18)}${suffix}`,\n\t\t\twidth,\n\t\t);\n\t}\n\n\tprivate get_marker(row: PresetRow): string {\n\t\tif (row.type === 'header') return ' ';\n\t\tif (row.type === 'base-none') {\n\t\t\treturn this.selected_base ? '○' : '●';\n\t\t}\n\t\tif (row.preset.kind === 'base') {\n\t\t\treturn this.selected_base === row.preset.name ? '●' : '○';\n\t\t}\n\t\treturn this.enabled_layers.has(row.preset.name) ? '☑' : '☐';\n\t}\n\n\tprivate get_selected_prompt_text(): string {\n\t\tconst row = this.rows[this.selected_index];\n\t\tif (!row || row.type === 'header') return '';\n\t\tif (row.type === 'base-none') {\n\t\t\treturn 'No active base preset. Only enabled prompt layers will be appended.';\n\t\t}\n\t\tconst preset = row.preset;\n\t\treturn [\n\t\t\t`# ${preset.name}`,\n\t\t\t'',\n\t\t\t`Kind: ${preset.kind}`,\n\t\t\t`Source: ${get_prompt_source_label(preset.source)}`,\n\t\t\tpreset.description\n\t\t\t\t? `Description: ${preset.description}`\n\t\t\t\t: undefined,\n\t\t\t'',\n\t\t\tpreset.instructions.trim() || '(empty preset)',\n\t\t]\n\t\t\t.filter((line): line is string => line !== undefined)\n\t\t\t.join('\\n');\n\t}\n\n\tprivate get_effective_prompt_text(): string {\n\t\tconst blocks = build_active_prompt_blocks(\n\t\t\tthis.state.presets,\n\t\t\tthis.selected_base,\n\t\t\tthis.enabled_layers,\n\t\t);\n\t\treturn blocks.length > 0\n\t\t\t? blocks.join('\\n\\n')\n\t\t\t: '(No prompt preset text will be appended.)';\n\t}\n\n\tprivate toggle_selected(): void {\n\t\tconst row = this.rows[this.selected_index];\n\t\tif (!row || row.type === 'header') return;\n\t\tif (row.type === 'base-none') {\n\t\t\tthis.selected_base = undefined;\n\t\t} else if (row.preset.kind === 'base') {\n\t\t\tthis.selected_base = row.preset.name;\n\t\t} else if (this.enabled_layers.has(row.preset.name)) {\n\t\t\tthis.enabled_layers.delete(row.preset.name);\n\t\t} else {\n\t\t\tthis.enabled_layers.add(row.preset.name);\n\t\t}\n\t\tthis.preview_mode = 'effective';\n\t\tthis.preview_offset = 0;\n\t}\n\n\tprivate move(delta: number): void {\n\t\tlet next = this.selected_index;\n\t\tdo {\n\t\t\tnext = (next + delta + this.rows.length) % this.rows.length;\n\t\t} while (this.rows[next]?.type === 'header');\n\t\tthis.selected_index = next;\n\t\tthis.preview_offset = 0;\n\t}\n\n\tprivate skip_header(fallback: number): void {\n\t\tif (this.rows[this.selected_index]?.type !== 'header') return;\n\t\tthis.selected_index = fallback;\n\t}\n\n\tprivate scroll_preview(delta: number): void {\n\t\tconst max_offset = Math.max(0, this.preview_lines.length - 1);\n\t\tthis.preview_offset = Math.max(\n\t\t\t0,\n\t\t\tMath.min(this.preview_offset + delta, max_offset),\n\t\t);\n\t}\n\n\tprivate pad(text: string, width: number): string {\n\t\tconst visible = visibleWidth(text);\n\t\treturn text + ' '.repeat(Math.max(0, width - visible));\n\t}\n\n\tprivate pad_line(text: string, width: number): string {\n\t\tconst truncated = truncateToWidth(text, width);\n\t\treturn (\n\t\t\ttruncated +\n\t\t\t' '.repeat(Math.max(0, width - visibleWidth(truncated)))\n\t\t);\n\t}\n}\n","import {\n\ttype ExtensionAPI,\n\ttype ExtensionCommandContext,\n\ttype ExtensionContext,\n} from '@earendil-works/pi-coding-agent';\nimport { existsSync } from 'node:fs';\nimport {\n\tformat_active_details,\n\tformat_summary,\n\tget_prompt_source_label,\n} from './catalog.js';\nimport { get_prompt_preset_completions } from './completions.js';\nimport {\n\tDEFAULT_BASE_PROMPT_PRESET_NAME,\n\tDEFAULT_PROMPT_PRESETS,\n} from './defaults.js';\nimport { set_status } from './footer.js';\nimport { format_prompt_preset_help, is_subcommand } from './help.js';\nimport { show_prompt_preset_manager } from './manager.js';\nimport { build_active_prompt_blocks } from './prompt-blocks.js';\nimport {\n\tget_last_preset_state,\n\tnormalize_active_state,\n\tparse_preset_flag,\n\tpersist_state,\n} from './state.js';\nimport {\n\tget_global_presets_dir,\n\tget_project_presets_dir,\n\tget_prompt_preset_file_path,\n\tload_persisted_prompt_state,\n\tload_prompt_presets,\n\tremove_project_prompt_preset,\n\tsave_global_prompt_preset_file,\n\tsave_project_prompt_preset_file,\n\tsave_prompt_preset_file,\n} from './storage.js';\nimport type {\n\tLoadedPromptPreset,\n\tPromptPresetKind,\n} from './types.js';\n\nexport {\n\tget_current_thinking_level,\n\tget_default_footer_thinking_level,\n\trender_footer_status_line,\n} from '@spences10/pi-footer';\nexport {\n\tDEFAULT_BASE_PROMPT_PRESET_NAME,\n\tDEFAULT_PROMPT_PRESETS,\n} from './defaults.js';\nexport {\n\tload_persisted_prompt_state,\n\tload_prompt_presets,\n\tmerge_prompt_presets,\n\tnormalize_prompt_presets,\n\tread_prompt_presets_dir,\n\tremove_project_prompt_preset,\n\tsave_persisted_prompt_state,\n\tsave_project_prompt_presets,\n\tsave_prompt_preset_file,\n} from './storage.js';\nexport type {\n\tLoadedPromptPreset,\n\tPromptPreset,\n\tPromptPresetKind,\n\tPromptPresetMap,\n\tPromptPresetSource,\n\tPromptPresetState,\n} from './types.js';\n\nexport default async function prompt_presets(pi: ExtensionAPI) {\n\tlet presets: Record<string, LoadedPromptPreset> = {};\n\tlet active_base_name: string | undefined;\n\tlet active_layers = new Set<string>();\n\n\tfunction get_base(\n\t\tname: string | undefined,\n\t): LoadedPromptPreset | undefined {\n\t\treturn name ? presets[name] : undefined;\n\t}\n\n\tfunction get_layer(name: string): LoadedPromptPreset | undefined {\n\t\tconst preset = presets[name];\n\t\treturn preset?.kind === 'layer' ? preset : undefined;\n\t}\n\n\tfunction commit_state(\n\t\tctx: ExtensionContext,\n\t\tnext_base_name: string | undefined,\n\t\tnext_layers: ReadonlySet<string>,\n\t\toptions?: { persist?: boolean; notify?: string },\n\t): void {\n\t\tactive_base_name = next_base_name;\n\t\tactive_layers = new Set(next_layers);\n\t\tset_status(ctx, active_base_name, active_layers);\n\t\tif (options?.persist !== false) {\n\t\t\tpersist_state(pi, ctx, active_base_name, active_layers);\n\t\t}\n\t\tif (options?.notify) {\n\t\t\tctx.ui.notify(options.notify, 'info');\n\t\t}\n\t}\n\n\tfunction activate_base(\n\t\tname: string | undefined,\n\t\tctx: ExtensionContext,\n\t\toptions?: { persist?: boolean },\n\t): boolean {\n\t\tif (!name) {\n\t\t\tcommit_state(ctx, undefined, active_layers, {\n\t\t\t\tpersist: options?.persist,\n\t\t\t\tnotify: 'Base preset cleared',\n\t\t\t});\n\t\t\treturn true;\n\t\t}\n\n\t\tconst preset = get_base(name);\n\t\tif (!preset) {\n\t\t\tctx.ui.notify(`Unknown base preset: ${name}`, 'warning');\n\t\t\treturn false;\n\t\t}\n\n\t\tcommit_state(ctx, preset.name, active_layers, {\n\t\t\tpersist: options?.persist,\n\t\t\tnotify: `Base preset \"${preset.name}\" activated`,\n\t\t});\n\t\treturn true;\n\t}\n\n\tfunction set_layer_enabled(\n\t\tname: string,\n\t\tenabled: boolean,\n\t\tctx: ExtensionContext,\n\t\toptions?: { persist?: boolean },\n\t): boolean {\n\t\tconst preset = get_layer(name);\n\t\tif (!preset) {\n\t\t\tctx.ui.notify(`Unknown prompt layer: ${name}`, 'warning');\n\t\t\treturn false;\n\t\t}\n\n\t\tconst next_layers = new Set(active_layers);\n\t\tif (enabled) {\n\t\t\tnext_layers.add(preset.name);\n\t\t} else {\n\t\t\tnext_layers.delete(preset.name);\n\t\t}\n\n\t\tcommit_state(ctx, active_base_name, next_layers, {\n\t\t\tpersist: options?.persist,\n\t\t\tnotify: enabled\n\t\t\t\t? `Layer \"${preset.name}\" enabled`\n\t\t\t\t: `Layer \"${preset.name}\" disabled`,\n\t\t});\n\t\treturn true;\n\t}\n\n\tfunction toggle_layer(\n\t\tname: string,\n\t\tctx: ExtensionContext,\n\t\toptions?: { persist?: boolean },\n\t): boolean {\n\t\treturn set_layer_enabled(\n\t\t\tname,\n\t\t\t!active_layers.has(name),\n\t\t\tctx,\n\t\t\toptions,\n\t\t);\n\t}\n\n\tasync function edit_preset(\n\t\tname: string,\n\t\tctx: ExtensionCommandContext,\n\t\tscope: 'project' | 'global' = 'project',\n\t): Promise<void> {\n\t\tconst existing = presets[name];\n\t\tconst kind_choice = await ctx.ui.select('Preset kind', [\n\t\t\texisting?.kind === 'layer'\n\t\t\t\t? 'layer (current)'\n\t\t\t\t: 'base (current)',\n\t\t\texisting?.kind === 'layer' ? 'base' : 'layer',\n\t\t]);\n\t\tif (!kind_choice) return;\n\t\tconst kind: PromptPresetKind = kind_choice.startsWith('layer')\n\t\t\t? 'layer'\n\t\t\t: 'base';\n\n\t\tconst description = await ctx.ui.input(\n\t\t\t`Description for ${name}`,\n\t\t\texisting?.description ?? '',\n\t\t);\n\t\tif (description === undefined) return;\n\n\t\tconst instructions = await ctx.ui.editor(\n\t\t\t`Edit ${kind} preset: ${name}`,\n\t\t\texisting?.instructions ?? '',\n\t\t);\n\t\tif (instructions === undefined) return;\n\n\t\tconst saved_path =\n\t\t\tscope === 'global'\n\t\t\t\t? save_global_prompt_preset_file(name, {\n\t\t\t\t\t\tkind,\n\t\t\t\t\t\tinstructions,\n\t\t\t\t\t\t...(description.trim()\n\t\t\t\t\t\t\t? { description: description.trim() }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t})\n\t\t\t\t: save_project_prompt_preset_file(ctx.cwd, name, {\n\t\t\t\t\t\tkind,\n\t\t\t\t\t\tinstructions,\n\t\t\t\t\t\t...(description.trim()\n\t\t\t\t\t\t\t? { description: description.trim() }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t});\n\n\t\tpresets = load_prompt_presets(ctx.cwd);\n\t\tconst normalized = normalize_active_state(\n\t\t\tpresets,\n\t\t\tactive_base_name,\n\t\t\tactive_layers,\n\t\t);\n\t\tactive_base_name = normalized.active_base_name;\n\t\tactive_layers = normalized.active_layers;\n\n\t\tif (kind === 'base') {\n\t\t\tactivate_base(name, ctx);\n\t\t} else {\n\t\t\tset_layer_enabled(name, true, ctx);\n\t\t}\n\t\tctx.ui.notify(`Saved preset \"${name}\" to ${saved_path}`, 'info');\n\t}\n\n\tfunction export_default_presets(\n\t\tctx: ExtensionCommandContext,\n\t\tscope: 'project' | 'global',\n\t): void {\n\t\tconst dir =\n\t\t\tscope === 'global'\n\t\t\t\t? get_global_presets_dir()\n\t\t\t\t: get_project_presets_dir(ctx.cwd);\n\t\tlet written = 0;\n\t\tlet skipped = 0;\n\t\tfor (const [name, preset] of Object.entries(\n\t\t\tDEFAULT_PROMPT_PRESETS,\n\t\t)) {\n\t\t\tconst path = get_prompt_preset_file_path(dir, name);\n\t\t\tif (existsSync(path)) {\n\t\t\t\tskipped += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tsave_prompt_preset_file(dir, name, preset);\n\t\t\twritten += 1;\n\t\t}\n\n\t\tpresets = load_prompt_presets(ctx.cwd);\n\t\tconst normalized = normalize_active_state(\n\t\t\tpresets,\n\t\t\tactive_base_name,\n\t\t\tactive_layers,\n\t\t);\n\t\tactive_base_name = normalized.active_base_name;\n\t\tactive_layers = normalized.active_layers;\n\t\tset_status(ctx, active_base_name, active_layers);\n\n\t\tctx.ui.notify(\n\t\t\t`Exported ${written} built-in preset file(s) to ${dir}${skipped ? ` (${skipped} already existed)` : ''}`,\n\t\t\t'info',\n\t\t);\n\t}\n\n\tfunction remove_custom_preset(\n\t\tname: string,\n\t\tctx: ExtensionCommandContext,\n\t\tmode: 'delete' | 'reset',\n\t): void {\n\t\tconst result = remove_project_prompt_preset(ctx.cwd, name);\n\t\tif (!result.removed) {\n\t\t\tctx.ui.notify(\n\t\t\t\t`No project-local preset named \"${name}\" to ${mode}`,\n\t\t\t\t'warning',\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tpresets = load_prompt_presets(ctx.cwd);\n\t\tconst normalized = normalize_active_state(\n\t\t\tpresets,\n\t\t\tactive_base_name,\n\t\t\tactive_layers,\n\t\t);\n\t\tactive_base_name = normalized.active_base_name;\n\t\tactive_layers = normalized.active_layers;\n\t\tset_status(ctx, active_base_name, active_layers);\n\t\tpersist_state(pi, ctx, active_base_name, active_layers);\n\n\t\tconst fallback = presets[name];\n\t\tif (mode === 'reset' && fallback) {\n\t\t\tctx.ui.notify(\n\t\t\t\t`Reset \"${name}\" to ${get_prompt_source_label(fallback.source)} preset`,\n\t\t\t\t'info',\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tctx.ui.notify(\n\t\t\tresult.remaining === 0\n\t\t\t\t? `Removed \"${name}\" and deleted ${result.path}`\n\t\t\t\t: `Removed \"${name}\" from ${result.path}`,\n\t\t\t'info',\n\t\t);\n\t}\n\n\tasync function show_manager(\n\t\tctx: ExtensionCommandContext,\n\t): Promise<void> {\n\t\tawait show_prompt_preset_manager(\n\t\t\tctx,\n\t\t\t{ presets, active_base_name, active_layers },\n\t\t\t(selected_base, enabled_layers) => {\n\t\t\t\tcommit_state(ctx, selected_base, enabled_layers, {\n\t\t\t\t\tnotify: 'Updated prompt preset selection',\n\t\t\t\t});\n\t\t\t},\n\t\t);\n\t}\n\n\tpi.registerFlag('preset', {\n\t\tdescription:\n\t\t\t'Activate prompt config on startup. Accepts a base preset or comma-separated preset/layer names.',\n\t\ttype: 'string',\n\t});\n\n\tconst prompt_preset_command: Parameters<\n\t\tExtensionAPI['registerCommand']\n\t>[1] = {\n\t\tdescription:\n\t\t\t'Manage prompt presets and layers. Try: /prompt-preset help, /prompt-preset export-defaults, /prompt-preset edit-global terse',\n\t\tgetArgumentCompletions: (prefix) =>\n\t\t\tget_prompt_preset_completions(presets, prefix),\n\t\thandler: async (args, ctx) => {\n\t\t\tconst trimmed = args.trim();\n\t\t\tif (!trimmed) {\n\t\t\t\tif (ctx.hasUI) {\n\t\t\t\t\tawait show_manager(ctx);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\tformat_summary(active_base_name, active_layers, presets),\n\t\t\t\t\t'info',\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst [first, ...rest] = trimmed.split(/\\s+/);\n\t\t\tconst arg = rest.join(' ').trim();\n\n\t\t\tswitch (first) {\n\t\t\t\tcase 'help':\n\t\t\t\t\tctx.ui.notify(format_prompt_preset_help(), 'info');\n\t\t\t\t\treturn;\n\t\t\t\tcase 'list':\n\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\tformat_summary(active_base_name, active_layers, presets),\n\t\t\t\t\t\t'info',\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\tcase 'show':\n\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\tformat_active_details(\n\t\t\t\t\t\t\tactive_base_name,\n\t\t\t\t\t\t\tactive_layers,\n\t\t\t\t\t\t\tpresets,\n\t\t\t\t\t\t),\n\t\t\t\t\t\t'info',\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\tcase 'clear':\n\t\t\t\t\tcommit_state(ctx, undefined, new Set(), {\n\t\t\t\t\t\tnotify: 'Cleared base preset and prompt layers',\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\tcase 'reload': {\n\t\t\t\t\tpresets = load_prompt_presets(ctx.cwd);\n\t\t\t\t\tconst normalized = normalize_active_state(\n\t\t\t\t\t\tpresets,\n\t\t\t\t\t\tactive_base_name,\n\t\t\t\t\t\tactive_layers,\n\t\t\t\t\t);\n\t\t\t\t\tactive_base_name = normalized.active_base_name;\n\t\t\t\t\tactive_layers = normalized.active_layers;\n\t\t\t\t\tset_status(ctx, active_base_name, active_layers);\n\t\t\t\t\tctx.ui.notify('Reloaded prompt presets', 'info');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase 'base':\n\t\t\t\t\tif (!arg) {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t'Usage: /prompt-preset base <name> (alias: /preset)',\n\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tactivate_base(arg, ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase 'enable':\n\t\t\t\t\tif (!arg) {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t'Usage: /prompt-preset enable <layer> (alias: /preset)',\n\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tset_layer_enabled(arg, true, ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase 'disable':\n\t\t\t\t\tif (!arg) {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t'Usage: /prompt-preset disable <layer> (alias: /preset)',\n\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tset_layer_enabled(arg, false, ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase 'toggle':\n\t\t\t\t\tif (!arg) {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t'Usage: /prompt-preset toggle <layer> (alias: /preset)',\n\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\ttoggle_layer(arg, ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase 'edit': {\n\t\t\t\t\tlet scope: 'project' | 'global' = 'project';\n\t\t\t\t\tlet name = arg;\n\t\t\t\t\tif (arg.startsWith('--global ')) {\n\t\t\t\t\t\tscope = 'global';\n\t\t\t\t\t\tname = arg.slice('--global '.length).trim();\n\t\t\t\t\t} else if (arg.startsWith('--project ')) {\n\t\t\t\t\t\tname = arg.slice('--project '.length).trim();\n\t\t\t\t\t}\n\t\t\t\t\tif (!name) {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t'Usage: /prompt-preset edit [--global|--project] <name> (alias: /preset)',\n\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tawait edit_preset(name, ctx, scope);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase 'edit-global':\n\t\t\t\t\tif (!arg) {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t'Usage: /prompt-preset edit-global <name> (alias: /preset)',\n\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tawait edit_preset(arg, ctx, 'global');\n\t\t\t\t\treturn;\n\t\t\t\tcase 'export-defaults': {\n\t\t\t\t\tconst scope = arg || 'global';\n\t\t\t\t\tif (scope !== 'global' && scope !== 'project') {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t'Usage: /prompt-preset export-defaults [global|project] (alias: /preset)',\n\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\texport_default_presets(ctx, scope);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase 'delete':\n\t\t\t\t\tif (!arg) {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t'Usage: /prompt-preset delete <name> (alias: /preset)',\n\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tremove_custom_preset(arg, ctx, 'delete');\n\t\t\t\t\treturn;\n\t\t\t\tcase 'reset':\n\t\t\t\t\tif (!arg) {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t'Usage: /prompt-preset reset <name> (alias: /preset)',\n\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tremove_custom_preset(arg, ctx, 'reset');\n\t\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (is_subcommand(first)) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Unsupported preset command: ${first}`,\n\t\t\t\t\t'warning',\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst preset = presets[trimmed];\n\t\t\tif (!preset) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Unknown preset or layer: ${trimmed}. Try /prompt-preset help.`,\n\t\t\t\t\t'warning',\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (preset.kind === 'base') {\n\t\t\t\tactivate_base(preset.name, ctx);\n\t\t\t} else {\n\t\t\t\ttoggle_layer(preset.name, ctx);\n\t\t\t}\n\t\t},\n\t};\n\n\tfor (const command_name of ['prompt-preset', 'preset']) {\n\t\tpi.registerCommand(command_name, prompt_preset_command);\n\t}\n\n\tpi.on('session_start', async (_event, ctx) => {\n\t\tpresets = load_prompt_presets(ctx.cwd);\n\t\tactive_base_name = undefined;\n\t\tactive_layers = new Set();\n\n\t\tconst preset_flag = pi.getFlag('preset');\n\t\tif (typeof preset_flag === 'string' && preset_flag.trim()) {\n\t\t\tfor (const name of parse_preset_flag(preset_flag)) {\n\t\t\t\tconst preset = presets[name];\n\t\t\t\tif (!preset) continue;\n\t\t\t\tif (preset.kind === 'base') {\n\t\t\t\t\tactive_base_name = name;\n\t\t\t\t} else {\n\t\t\t\t\tactive_layers.add(name);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst normalized = normalize_active_state(\n\t\t\t\tpresets,\n\t\t\t\tactive_base_name,\n\t\t\t\tactive_layers,\n\t\t\t);\n\t\t\tactive_base_name = normalized.active_base_name;\n\t\t\tactive_layers = normalized.active_layers;\n\t\t\tset_status(ctx, active_base_name, active_layers);\n\t\t\treturn;\n\t\t}\n\n\t\tconst restored = get_last_preset_state(ctx) ??\n\t\t\tload_persisted_prompt_state(ctx.cwd) ?? {\n\t\t\t\tbase_name: DEFAULT_BASE_PROMPT_PRESET_NAME,\n\t\t\t\tlayer_names: [],\n\t\t\t};\n\t\tactive_base_name = restored.base_name ?? undefined;\n\t\tactive_layers = new Set(restored.layer_names ?? []);\n\t\tconst normalized = normalize_active_state(\n\t\t\tpresets,\n\t\t\tactive_base_name,\n\t\t\tactive_layers,\n\t\t);\n\t\tactive_base_name = normalized.active_base_name;\n\t\tactive_layers = normalized.active_layers;\n\t\tset_status(ctx, active_base_name, active_layers);\n\t});\n\n\tpi.on('before_agent_start', async (event) => {\n\t\tconst blocks = build_active_prompt_blocks(\n\t\t\tpresets,\n\t\t\tactive_base_name,\n\t\t\tactive_layers,\n\t\t);\n\t\tif (blocks.length === 0) return;\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n\\n${blocks.join('\\n\\n')}`,\n\t\t};\n\t});\n\n\tpi.on('session_shutdown', async (_event, ctx) => {\n\t\tctx.ui.setStatus('preset', undefined);\n\t});\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "my-pi",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.70",
|
|
4
4
|
"description": "Composable pi coding agent with MCP, LSP, prompt presets, and local eval telemetry",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -43,15 +43,15 @@
|
|
|
43
43
|
}
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@earendil-works/pi-ai": "0.75.
|
|
47
|
-
"@earendil-works/pi-coding-agent": "0.75.
|
|
48
|
-
"@earendil-works/pi-tui": "0.75.
|
|
46
|
+
"@earendil-works/pi-ai": "0.75.5",
|
|
47
|
+
"@earendil-works/pi-coding-agent": "0.75.5",
|
|
48
|
+
"@earendil-works/pi-tui": "0.75.5",
|
|
49
49
|
"citty": "^0.2.2",
|
|
50
50
|
"typebox": "^1.1.38",
|
|
51
51
|
"@spences10/pi-project-trust": "0.0.12",
|
|
52
|
+
"@spences10/pi-themes": "0.0.8",
|
|
52
53
|
"@spences10/pi-settings": "0.0.0",
|
|
53
|
-
"@spences10/pi-tui-modal": "0.0.20"
|
|
54
|
-
"@spences10/pi-themes": "0.0.8"
|
|
54
|
+
"@spences10/pi-tui-modal": "0.0.20"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
57
|
"@changesets/cli": "^2.31.0",
|
|
@@ -65,12 +65,12 @@
|
|
|
65
65
|
"@spences10/pi-child-env": "0.1.8",
|
|
66
66
|
"@spences10/pi-coding-preferences": "0.0.10",
|
|
67
67
|
"@spences10/pi-confirm-destructive": "0.0.16",
|
|
68
|
-
"@spences10/pi-context": "0.0.24",
|
|
69
68
|
"@spences10/pi-footer": "0.0.7",
|
|
69
|
+
"@spences10/pi-context": "0.0.24",
|
|
70
70
|
"@spences10/pi-git-ui": "0.0.12",
|
|
71
|
-
"@spences10/pi-lsp": "0.0.33",
|
|
72
71
|
"@spences10/pi-mcp": "0.0.37",
|
|
73
72
|
"@spences10/pi-nopeek": "0.0.13",
|
|
73
|
+
"@spences10/pi-lsp": "0.0.33",
|
|
74
74
|
"@spences10/pi-omnisearch": "0.0.13",
|
|
75
75
|
"@spences10/pi-recall": "0.0.13",
|
|
76
76
|
"@spences10/pi-redact": "0.0.12",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-presets-CyvHq09h.js","names":[],"sources":["../src/extensions/prompt-presets/catalog.ts","../src/extensions/prompt-presets/completions.ts","../src/extensions/prompt-presets/defaults.ts","../src/extensions/prompt-presets/footer.ts","../src/extensions/prompt-presets/help.ts","../src/extensions/prompt-presets/storage.ts","../src/extensions/prompt-presets/state.ts","../src/extensions/prompt-presets/manager.ts","../src/extensions/prompt-presets/prompt-blocks.ts","../src/extensions/prompt-presets/index.ts"],"sourcesContent":["import type {\n\tLoadedPromptPreset,\n\tPromptPresetSource,\n} from './types.js';\n\nexport function get_prompt_source_label(\n\tsource: PromptPresetSource,\n): string {\n\tswitch (source) {\n\t\tcase 'builtin':\n\t\t\treturn 'built-in';\n\t\tcase 'user':\n\t\t\treturn 'user';\n\t\tcase 'project':\n\t\t\treturn 'project';\n\t}\n}\n\nexport function list_base_presets(\n\tpresets: Record<string, LoadedPromptPreset>,\n): LoadedPromptPreset[] {\n\treturn Object.values(presets)\n\t\t.filter((preset) => preset.kind === 'base')\n\t\t.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function list_layer_presets(\n\tpresets: Record<string, LoadedPromptPreset>,\n): LoadedPromptPreset[] {\n\treturn Object.values(presets)\n\t\t.filter((preset) => preset.kind === 'layer')\n\t\t.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function format_summary(\n\tactive_base_name: string | undefined,\n\tactive_layers: ReadonlySet<string>,\n\tpresets: Record<string, LoadedPromptPreset>,\n): string {\n\tconst lines = [`Base: ${active_base_name ?? '(none)'}`];\n\n\tconst layer_names = [...active_layers].sort();\n\tif (layer_names.length === 0) {\n\t\tlines.push('Layers: (none)');\n\t} else {\n\t\tlines.push('Layers:');\n\t\tfor (const name of layer_names) {\n\t\t\tconst preset = presets[name];\n\t\t\tconst description = preset?.description\n\t\t\t\t? ` — ${preset.description}`\n\t\t\t\t: '';\n\t\t\tlines.push(`- ${name}${description}`);\n\t\t}\n\t}\n\n\treturn lines.join('\\n');\n}\n\nexport function format_active_details(\n\tactive_base_name: string | undefined,\n\tactive_layers: ReadonlySet<string>,\n\tpresets: Record<string, LoadedPromptPreset>,\n): string {\n\tconst parts: string[] = [];\n\n\tif (active_base_name) {\n\t\tconst base = presets[active_base_name];\n\t\tif (base) {\n\t\t\tparts.push(`Base: ${base.name}`);\n\t\t\tif (base.description)\n\t\t\t\tparts.push(`Description: ${base.description}`);\n\t\t\tparts.push(`Source: ${get_prompt_source_label(base.source)}`);\n\t\t\tparts.push('', base.instructions.trim());\n\t\t}\n\t}\n\n\tconst layer_names = [...active_layers].sort();\n\tif (layer_names.length > 0) {\n\t\tif (parts.length > 0) parts.push('', '---', '');\n\t\tparts.push('Layers:');\n\t\tfor (const name of layer_names) {\n\t\t\tconst layer = presets[name];\n\t\t\tif (!layer) continue;\n\t\t\tparts.push(\n\t\t\t\t`- ${layer.name} (${get_prompt_source_label(layer.source)})`,\n\t\t\t);\n\t\t\tif (layer.description) parts.push(` ${layer.description}`);\n\t\t}\n\t}\n\n\treturn parts.join('\\n') || 'No preset or layers active';\n}\n","import { list_base_presets, list_layer_presets } from './catalog.js';\nimport type { LoadedPromptPreset } from './types.js';\n\nconst SUBCOMMANDS = [\n\t'help',\n\t'list',\n\t'show',\n\t'clear',\n\t'edit',\n\t'edit-global',\n\t'export-defaults',\n\t'delete',\n\t'reset',\n\t'reload',\n\t'base',\n\t'enable',\n\t'disable',\n\t'toggle',\n];\n\nexport function get_prompt_preset_completions(\n\tpresets: Record<string, LoadedPromptPreset>,\n\tprefix: string,\n): Array<{ value: string; label: string }> | null {\n\tconst trimmed = prefix.trim();\n\tconst parts = trimmed ? trimmed.split(/\\s+/) : [];\n\tconst base_names = list_base_presets(presets).map(\n\t\t(preset) => preset.name,\n\t);\n\tconst layer_names = list_layer_presets(presets).map(\n\t\t(preset) => preset.name,\n\t);\n\tconst all_names = [...base_names, ...layer_names];\n\n\tif (parts.length <= 1) {\n\t\tconst query = parts[0] ?? '';\n\t\treturn [\n\t\t\t...SUBCOMMANDS.filter((item) => item.startsWith(query)).map(\n\t\t\t\t(item) => ({ value: item, label: item }),\n\t\t\t),\n\t\t\t...all_names\n\t\t\t\t.filter((item) => item.startsWith(query))\n\t\t\t\t.map((item) => ({ value: item, label: item })),\n\t\t];\n\t}\n\n\tconst command = parts[0];\n\tconst query = parts.slice(1).join(' ');\n\tif (command === 'base') {\n\t\treturn base_names\n\t\t\t.filter((item) => item.startsWith(query))\n\t\t\t.map((item) => ({ value: `base ${item}`, label: item }));\n\t}\n\tif (['enable', 'disable', 'toggle'].includes(command)) {\n\t\treturn layer_names\n\t\t\t.filter((item) => item.startsWith(query))\n\t\t\t.map((item) => ({\n\t\t\t\tvalue: `${command} ${item}`,\n\t\t\t\tlabel: item,\n\t\t\t}));\n\t}\n\tif (command === 'edit' || command === 'edit-global') {\n\t\treturn all_names\n\t\t\t.filter((item) => item.startsWith(query))\n\t\t\t.map((item) => ({\n\t\t\t\tvalue: `${command} ${item}`,\n\t\t\t\tlabel: item,\n\t\t\t}));\n\t}\n\tif (['delete', 'reset'].includes(command)) {\n\t\treturn all_names\n\t\t\t.filter((item) => item.startsWith(query))\n\t\t\t.map((item) => ({\n\t\t\t\tvalue: `${command} ${item}`,\n\t\t\t\tlabel: item,\n\t\t\t}));\n\t}\n\treturn null;\n}\n","import type { PromptPresetMap } from './types.js';\n\nexport const DEFAULT_BASE_PROMPT_PRESET_NAME = 'terse';\n\nexport const DEFAULT_PROMPT_PRESETS: PromptPresetMap = {\n\tterse: {\n\t\tkind: 'base',\n\t\tdescription: 'Short, direct, no fluff',\n\t\tinstructions:\n\t\t\t\"Be concise and direct. Default to the shortest response that fully solves the user's request. Use at most one short paragraph or 3 bullets unless the user explicitly asks for detail. For implementation reports, include only what changed, validation, and the next step if relevant. No purple prose, no filler, no repetitive caveats.\",\n\t},\n\tstandard: {\n\t\tkind: 'base',\n\t\tdescription: 'Clear and concise with key context',\n\t\tinstructions:\n\t\t\t'Be clear, direct, and concise. Include only the reasoning and implementation details that matter. Avoid filler, grandstanding, and ornamental language. Use bullets when they improve scanability.',\n\t},\n\tdetailed: {\n\t\tkind: 'base',\n\t\tdescription: 'More explanation when nuance matters',\n\t\tinstructions:\n\t\t\t'Be thorough when the task is complex or tradeoffs matter, but stay practical. Explain only the details that help the user decide, verify, or implement. Avoid purple prose and unnecessary scene-setting.',\n\t},\n\t'no-purple-prose': {\n\t\tkind: 'layer',\n\t\tdescription: 'Strip out ornamental language',\n\t\tinstructions:\n\t\t\t'Do not use purple prose, flourish, motivational filler, or theatrical transitions. Prefer plain language and concrete statements.',\n\t},\n\tbullets: {\n\t\tkind: 'layer',\n\t\tdescription: 'Prefer short bullets when useful',\n\t\tinstructions:\n\t\t\t'When presenting options, findings, or steps, prefer short bullet lists over long paragraphs.',\n\t},\n\t'clarify-first': {\n\t\tkind: 'layer',\n\t\tdescription:\n\t\t\t'Ask brief clarifying questions when requirements are ambiguous',\n\t\tinstructions:\n\t\t\t'If the request is materially ambiguous, ask the minimum clarifying question(s) needed before proceeding. Do not ask unnecessary questions.',\n\t},\n\t'include-risks': {\n\t\tkind: 'layer',\n\t\tdescription: 'Call out notable risks or tradeoffs',\n\t\tinstructions:\n\t\t\t'When making a recommendation or implementation plan, briefly mention the key risk, tradeoff, or caveat if one materially matters.',\n\t},\n};\n","import type { ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nfunction get_footer_prompt_status(\n\tactive_base_name: string | undefined,\n\tactive_layers: ReadonlySet<string>,\n): string | undefined {\n\tif (!active_base_name && active_layers.size === 0) {\n\t\treturn undefined;\n\t}\n\n\tconst label = active_base_name ?? 'none';\n\tconst layer_suffix =\n\t\tactive_layers.size > 0 ? ` +${active_layers.size}` : '';\n\treturn `prompt:${label}${layer_suffix}`;\n}\n\nexport function set_status(\n\tctx: ExtensionContext,\n\tactive_base_name: string | undefined,\n\tactive_layers: ReadonlySet<string>,\n): void {\n\tctx.ui.setStatus(\n\t\t'preset',\n\t\tget_footer_prompt_status(active_base_name, active_layers),\n\t);\n}\n","export function is_subcommand(command: string): boolean {\n\treturn [\n\t\t'help',\n\t\t'list',\n\t\t'show',\n\t\t'clear',\n\t\t'edit',\n\t\t'edit-global',\n\t\t'export-defaults',\n\t\t'delete',\n\t\t'reset',\n\t\t'reload',\n\t\t'base',\n\t\t'enable',\n\t\t'disable',\n\t\t'toggle',\n\t].includes(command);\n}\n\nexport function format_prompt_preset_help(): string {\n\treturn `Prompt presets append instructions to the system prompt.\n\nCommands:\n- /prompt-preset Open the preset picker\n- /prompt-preset show Show the active base and layers\n- /prompt-preset <name> Activate a base preset or toggle a layer\n- /prompt-preset base <name> Activate a base preset\n- /prompt-preset enable <layer> Enable a layer\n- /prompt-preset disable <layer> Disable a layer\n- /prompt-preset edit <name> Edit/create .pi/presets/<name>.md\n- /prompt-preset edit-global <name> Edit/create ~/.pi/agent/presets/<name>.md\n- /prompt-preset export-defaults Export built-ins to ~/.pi/agent/presets/*.md\n- /prompt-preset export-defaults project Export built-ins to .pi/presets/*.md\n- /prompt-preset reload Reload presets after manual file edits\n- /prompt-preset clear Clear active base and layers\n\nExamples:\n- /prompt-preset export-defaults\n- /prompt-preset edit-global terse\n- /prompt-preset base detailed\n- /prompt-preset enable bullets\n- /prompt-preset show\n\nAlias: /preset`;\n}\n","import {\n\tgetAgentDir,\n\tparseFrontmatter,\n} from '@earendil-works/pi-coding-agent';\nimport {\n\tread_settings,\n\twrite_settings,\n} from '@spences10/pi-settings';\nimport {\n\texistsSync,\n\tmkdirSync,\n\treaddirSync,\n\treadFileSync,\n\trenameSync,\n\tunlinkSync,\n\twriteFileSync,\n} from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { DEFAULT_PROMPT_PRESETS } from './defaults.js';\nimport type {\n\tLoadedPromptPreset,\n\tPromptPreset,\n\tPromptPresetMap,\n\tPromptPresetSource,\n\tPromptPresetState,\n} from './types.js';\n\nconst PROJECT_PROMPT_PRESETS_ENV = 'MY_PI_PROMPT_PRESETS_PROJECT';\n\ninterface PersistedPromptPresetStates {\n\tversion: number;\n\tprojects: Record<string, PromptPresetState>;\n}\n\nexport function normalize_prompt_presets(\n\tinput: unknown,\n): PromptPresetMap {\n\tif (!input || typeof input !== 'object') return {};\n\n\tconst normalized: PromptPresetMap = {};\n\tfor (const [raw_name, raw_value] of Object.entries(input)) {\n\t\tconst name = raw_name.trim();\n\t\tif (!name) continue;\n\n\t\tif (typeof raw_value === 'string') {\n\t\t\tnormalized[name] = {\n\t\t\t\tkind: 'base',\n\t\t\t\tinstructions: raw_value,\n\t\t\t};\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!raw_value || typeof raw_value !== 'object') continue;\n\t\tconst candidate = raw_value as {\n\t\t\tkind?: unknown;\n\t\t\tdescription?: unknown;\n\t\t\tinstructions?: unknown;\n\t\t};\n\t\tif (typeof candidate.instructions !== 'string') continue;\n\n\t\tnormalized[name] = {\n\t\t\tinstructions: candidate.instructions,\n\t\t\t...(candidate.kind === 'layer'\n\t\t\t\t? { kind: 'layer' as const }\n\t\t\t\t: {}),\n\t\t\t...(typeof candidate.description === 'string'\n\t\t\t\t? { description: candidate.description }\n\t\t\t\t: {}),\n\t\t};\n\t}\n\n\treturn normalized;\n}\n\nexport function merge_prompt_presets(\n\t...sources: PromptPresetMap[]\n): PromptPresetMap {\n\treturn Object.assign({}, ...sources);\n}\n\nfunction to_loaded_prompt_presets(\n\tpresets: PromptPresetMap,\n\tsource: PromptPresetSource,\n): Record<string, LoadedPromptPreset> {\n\treturn Object.fromEntries(\n\t\tObject.entries(presets).map(([name, preset]) => [\n\t\t\tname,\n\t\t\t{\n\t\t\t\tname,\n\t\t\t\tkind: preset.kind === 'layer' ? 'layer' : 'base',\n\t\t\t\tsource,\n\t\t\t\t...preset,\n\t\t\t},\n\t\t]),\n\t);\n}\n\nfunction get_global_presets_path(): string {\n\treturn join(getAgentDir(), 'presets.json');\n}\n\nfunction get_project_presets_path(cwd: string): string {\n\treturn join(cwd, '.pi', 'presets.json');\n}\n\nexport function get_global_presets_dir(): string {\n\treturn join(getAgentDir(), 'presets');\n}\n\nexport function get_project_presets_dir(cwd: string): string {\n\treturn join(cwd, '.pi', 'presets');\n}\n\nfunction sanitize_prompt_preset_file_name(name: string): string {\n\tconst sanitized = name\n\t\t.trim()\n\t\t.replace(/[\\\\/:*?\"<>|]/g, '-')\n\t\t.replace(/^\\.+$/, '')\n\t\t.replace(/^\\.+/, '')\n\t\t.replace(/\\.+$/, '');\n\tif (!sanitized) {\n\t\tthrow new Error(\n\t\t\t'Prompt preset name must contain a file-safe character',\n\t\t);\n\t}\n\treturn sanitized;\n}\n\nexport function get_prompt_preset_file_path(\n\tdir: string,\n\tname: string,\n): string {\n\treturn join(dir, `${sanitize_prompt_preset_file_name(name)}.md`);\n}\n\nfunction get_persisted_prompt_state_path(): string {\n\treturn join(getAgentDir(), 'prompt-preset-state.json');\n}\n\nfunction read_prompt_presets_file(path: string): PromptPresetMap {\n\ttry {\n\t\tif (path === get_global_presets_path()) {\n\t\t\treturn normalize_prompt_presets(\n\t\t\t\tread_settings().promptPresets?.global ?? {},\n\t\t\t);\n\t\t}\n\t\tif (!existsSync(path)) return {};\n\t\treturn normalize_prompt_presets(\n\t\t\tJSON.parse(readFileSync(path, 'utf-8')),\n\t\t);\n\t} catch {\n\t\treturn {};\n\t}\n}\n\nfunction parse_prompt_preset_markdown(content: string): {\n\tmetadata: Record<string, unknown>;\n\tbody: string;\n} {\n\tconst { frontmatter, body } = parseFrontmatter(content);\n\treturn { metadata: frontmatter, body: body.trim() };\n}\n\nexport function read_prompt_presets_dir(\n\tpath: string,\n): PromptPresetMap {\n\tif (!existsSync(path)) return {};\n\n\ttry {\n\t\tconst presets: PromptPresetMap = {};\n\t\tfor (const entry of readdirSync(path, { withFileTypes: true })\n\t\t\t.filter((item) => item.isFile() && item.name.endsWith('.md'))\n\t\t\t.sort((a, b) => a.name.localeCompare(b.name))) {\n\t\t\tconst name = entry.name.slice(0, -3).trim();\n\t\t\tif (!name) continue;\n\t\t\tconst { metadata, body } = parse_prompt_preset_markdown(\n\t\t\t\treadFileSync(join(path, entry.name), 'utf-8'),\n\t\t\t);\n\t\t\tif (!body) continue;\n\t\t\tpresets[name] = {\n\t\t\t\tkind: metadata.kind === 'layer' ? 'layer' : 'base',\n\t\t\t\tinstructions: body,\n\t\t\t\t...(typeof metadata.description === 'string' &&\n\t\t\t\tmetadata.description.trim()\n\t\t\t\t\t? { description: metadata.description }\n\t\t\t\t\t: {}),\n\t\t\t};\n\t\t}\n\t\treturn presets;\n\t} catch {\n\t\treturn {};\n\t}\n}\n\nfunction format_prompt_preset_markdown(preset: PromptPreset): string {\n\tconst lines = [\n\t\t'---',\n\t\t`kind: ${preset.kind === 'layer' ? 'layer' : 'base'}`,\n\t];\n\tif (preset.description?.trim()) {\n\t\tlines.push(\n\t\t\t`description: ${JSON.stringify(preset.description.trim())}`,\n\t\t);\n\t}\n\tlines.push('---', '', preset.instructions.trim(), '');\n\treturn lines.join('\\n');\n}\n\nexport function save_prompt_preset_file(\n\tdir: string,\n\tname: string,\n\tpreset: PromptPreset,\n): string {\n\tif (!existsSync(dir)) {\n\t\tmkdirSync(dir, { recursive: true, mode: 0o700 });\n\t}\n\n\tconst path = get_prompt_preset_file_path(dir, name);\n\tconst tmp = `${path}.tmp-${Date.now()}`;\n\twriteFileSync(tmp, format_prompt_preset_markdown(preset), {\n\t\tmode: 0o600,\n\t});\n\trenameSync(tmp, path);\n\treturn path;\n}\n\nexport function save_project_prompt_preset_file(\n\tcwd: string,\n\tname: string,\n\tpreset: PromptPreset,\n): string {\n\treturn save_prompt_preset_file(\n\t\tget_project_presets_dir(cwd),\n\t\tname,\n\t\tpreset,\n\t);\n}\n\nexport function save_global_prompt_preset_file(\n\tname: string,\n\tpreset: PromptPreset,\n): string {\n\treturn save_prompt_preset_file(\n\t\tget_global_presets_dir(),\n\t\tname,\n\t\tpreset,\n\t);\n}\n\nfunction should_load_project_prompt_presets(): boolean {\n\tconst normalized = process.env[PROJECT_PROMPT_PRESETS_ENV]\n\t\t?.trim()\n\t\t.toLowerCase();\n\treturn !['0', 'false', 'no', 'skip', 'disable'].includes(\n\t\tnormalized ?? '',\n\t);\n}\n\nexport function load_prompt_presets(\n\tcwd: string,\n): Record<string, LoadedPromptPreset> {\n\treturn Object.assign(\n\t\t{},\n\t\tto_loaded_prompt_presets(DEFAULT_PROMPT_PRESETS, 'builtin'),\n\t\tto_loaded_prompt_presets(\n\t\t\tread_prompt_presets_file(get_global_presets_path()),\n\t\t\t'user',\n\t\t),\n\t\tto_loaded_prompt_presets(\n\t\t\tread_prompt_presets_dir(get_global_presets_dir()),\n\t\t\t'user',\n\t\t),\n\t\t...(should_load_project_prompt_presets()\n\t\t\t? [\n\t\t\t\t\tto_loaded_prompt_presets(\n\t\t\t\t\t\tread_prompt_presets_file(get_project_presets_path(cwd)),\n\t\t\t\t\t\t'project',\n\t\t\t\t\t),\n\t\t\t\t\tto_loaded_prompt_presets(\n\t\t\t\t\t\tread_prompt_presets_dir(get_project_presets_dir(cwd)),\n\t\t\t\t\t\t'project',\n\t\t\t\t\t),\n\t\t\t\t]\n\t\t\t: []),\n\t);\n}\n\nfunction sort_prompt_presets(\n\tpresets: PromptPresetMap,\n): PromptPresetMap {\n\treturn Object.fromEntries(\n\t\tObject.entries(presets).sort(([a], [b]) => a.localeCompare(b)),\n\t);\n}\n\nexport function save_project_prompt_presets(\n\tcwd: string,\n\tpresets: PromptPresetMap,\n): string {\n\tconst path = get_project_presets_path(cwd);\n\tconst dir = dirname(path);\n\tif (!existsSync(dir)) {\n\t\tmkdirSync(dir, { recursive: true, mode: 0o700 });\n\t}\n\n\tconst tmp = `${path}.tmp-${Date.now()}`;\n\twriteFileSync(\n\t\ttmp,\n\t\tJSON.stringify(sort_prompt_presets(presets), null, '\\t') + '\\n',\n\t\t{ mode: 0o600 },\n\t);\n\trenameSync(tmp, path);\n\treturn path;\n}\n\nexport function remove_project_prompt_preset(\n\tcwd: string,\n\tname: string,\n): {\n\tremoved: boolean;\n\tpath: string;\n\tremaining: number;\n} {\n\tconst json_path = get_project_presets_path(cwd);\n\tconst project_presets = read_prompt_presets_file(json_path);\n\tlet removed = false;\n\tlet removed_path = json_path;\n\n\tif (name in project_presets) {\n\t\tdelete project_presets[name];\n\t\tremoved = true;\n\t\tremoved_path = json_path;\n\t\tif (Object.keys(project_presets).length === 0) {\n\t\t\tif (existsSync(json_path)) {\n\t\t\t\tunlinkSync(json_path);\n\t\t\t}\n\t\t} else {\n\t\t\tsave_project_prompt_presets(cwd, project_presets);\n\t\t}\n\t}\n\n\tconst file_path = get_prompt_preset_file_path(\n\t\tget_project_presets_dir(cwd),\n\t\tname,\n\t);\n\tif (existsSync(file_path)) {\n\t\tunlinkSync(file_path);\n\t\tremoved = true;\n\t\tremoved_path = file_path;\n\t}\n\n\tconst remaining =\n\t\tObject.keys(read_prompt_presets_file(json_path)).length +\n\t\tObject.keys(read_prompt_presets_dir(get_project_presets_dir(cwd)))\n\t\t\t.length;\n\n\treturn { removed, path: removed_path, remaining };\n}\n\nfunction normalize_prompt_preset_state(\n\tinput: unknown,\n): PromptPresetState | undefined {\n\tif (!input || typeof input !== 'object') return undefined;\n\n\tconst candidate = input as {\n\t\tbase_name?: unknown;\n\t\tlayer_names?: unknown;\n\t};\n\tconst base_name =\n\t\ttypeof candidate.base_name === 'string' &&\n\t\tcandidate.base_name.trim()\n\t\t\t? candidate.base_name.trim()\n\t\t\t: null;\n\tconst layer_names = Array.isArray(candidate.layer_names)\n\t\t? [\n\t\t\t\t...new Set(\n\t\t\t\t\tcandidate.layer_names\n\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t(value): value is string =>\n\t\t\t\t\t\t\t\ttypeof value === 'string' && value.trim().length > 0,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.map((value) => value.trim()),\n\t\t\t\t),\n\t\t\t].sort()\n\t\t: [];\n\n\treturn {\n\t\tbase_name,\n\t\tlayer_names,\n\t};\n}\n\nfunction read_persisted_prompt_states(\n\tpath = get_persisted_prompt_state_path(),\n): PersistedPromptPresetStates {\n\ttry {\n\t\tconst parsed = (\n\t\t\tpath === get_persisted_prompt_state_path()\n\t\t\t\t? (read_settings().promptPresets?.state ?? {})\n\t\t\t\t: existsSync(path)\n\t\t\t\t\t? JSON.parse(readFileSync(path, 'utf-8'))\n\t\t\t\t\t: {}\n\t\t) as {\n\t\t\tversion?: unknown;\n\t\t\tprojects?: unknown;\n\t\t};\n\t\tconst raw_projects =\n\t\t\tparsed.projects && typeof parsed.projects === 'object'\n\t\t\t\t? parsed.projects\n\t\t\t\t: {};\n\t\tconst projects: Record<string, PromptPresetState> = {};\n\t\tfor (const [cwd, value] of Object.entries(raw_projects)) {\n\t\t\tconst normalized = normalize_prompt_preset_state(value);\n\t\t\tif (!normalized) continue;\n\t\t\tprojects[cwd] = normalized;\n\t\t}\n\t\treturn {\n\t\t\tversion:\n\t\t\t\ttypeof parsed.version === 'number' ? parsed.version : 1,\n\t\t\tprojects,\n\t\t};\n\t} catch {\n\t\treturn { version: 1, projects: {} };\n\t}\n}\n\nexport function load_persisted_prompt_state(\n\tcwd: string,\n\tpath = get_persisted_prompt_state_path(),\n): PromptPresetState | undefined {\n\treturn read_persisted_prompt_states(path).projects[cwd];\n}\n\nexport function save_persisted_prompt_state(\n\tcwd: string,\n\tstate: PromptPresetState,\n\tpath = get_persisted_prompt_state_path(),\n): string {\n\tconst persisted = read_persisted_prompt_states(path);\n\tpersisted.projects[cwd] = normalize_prompt_preset_state(state) ?? {\n\t\tbase_name: null,\n\t\tlayer_names: [],\n\t};\n\n\tconst next = {\n\t\tversion: 1,\n\t\tprojects: Object.fromEntries(\n\t\t\tObject.entries(persisted.projects).sort(([a], [b]) =>\n\t\t\t\ta.localeCompare(b),\n\t\t\t),\n\t\t),\n\t};\n\tif (path === get_persisted_prompt_state_path()) {\n\t\tconst settings = read_settings();\n\t\twrite_settings({\n\t\t\t...settings,\n\t\t\tpromptPresets: { ...settings.promptPresets, state: next },\n\t\t});\n\t\treturn path;\n\t}\n\n\tconst dir = dirname(path);\n\tif (!existsSync(dir)) {\n\t\tmkdirSync(dir, { recursive: true, mode: 0o700 });\n\t}\n\n\tconst tmp = `${path}.tmp-${Date.now()}`;\n\twriteFileSync(tmp, JSON.stringify(next, null, '\\t') + '\\n', {\n\t\tmode: 0o600,\n\t});\n\trenameSync(tmp, path);\n\treturn path;\n}\n","import type {\n\tExtensionAPI,\n\tExtensionContext,\n} from '@earendil-works/pi-coding-agent';\nimport { save_persisted_prompt_state } from './storage.js';\nimport type {\n\tLoadedPromptPreset,\n\tPromptPresetState,\n} from './types.js';\n\nexport const PRESET_STATE_TYPE = 'prompt-preset-state';\nexport const ENABLED = '● enabled';\nexport const DISABLED = '○ disabled';\nexport const SELECTED = '● selected';\nexport const UNSELECTED = '○';\nexport const NONE_BASE_ID = '__base_none__';\n\nexport function get_last_preset_state(\n\tctx: ExtensionContext,\n): PromptPresetState | undefined {\n\tconst entries = ctx.sessionManager.getEntries();\n\tfor (let i = entries.length - 1; i >= 0; i--) {\n\t\tconst entry = entries[i] as {\n\t\t\ttype?: string;\n\t\t\tcustomType?: string;\n\t\t\tdata?: PromptPresetState;\n\t\t};\n\t\tif (\n\t\t\tentry.type === 'custom' &&\n\t\t\tentry.customType === PRESET_STATE_TYPE &&\n\t\t\tentry.data\n\t\t) {\n\t\t\treturn entry.data;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport function 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\nexport function persist_state(\n\tpi: ExtensionAPI,\n\tctx: ExtensionContext,\n\tactive_base_name: string | undefined,\n\tactive_layers: ReadonlySet<string>,\n): void {\n\tconst state = {\n\t\tbase_name: active_base_name ?? null,\n\t\tlayer_names: [...active_layers].sort(),\n\t};\n\tpi.appendEntry(PRESET_STATE_TYPE, state);\n\tsave_persisted_prompt_state(ctx.cwd, state);\n}\n\nexport function normalize_active_state(\n\tpresets: Record<string, LoadedPromptPreset>,\n\tactive_base_name: string | undefined,\n\tactive_layers: ReadonlySet<string>,\n): {\n\tactive_base_name: string | undefined;\n\tactive_layers: Set<string>;\n} {\n\tconst next_base_name =\n\t\tactive_base_name && presets[active_base_name]?.kind === 'base'\n\t\t\t? active_base_name\n\t\t\t: undefined;\n\tconst next_layers = new Set(\n\t\t[...active_layers].filter(\n\t\t\t(name) => presets[name]?.kind === 'layer',\n\t\t),\n\t);\n\treturn {\n\t\tactive_base_name: next_base_name,\n\t\tactive_layers: next_layers,\n\t};\n}\n\nexport function parse_preset_flag(flag: string): string[] {\n\treturn flag\n\t\t.split(',')\n\t\t.map((item) => item.trim())\n\t\t.filter(Boolean);\n}\n","import type { ExtensionCommandContext } 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\tget_prompt_source_label,\n\tlist_base_presets,\n\tlist_layer_presets,\n} from './catalog.js';\nimport {\n\tDISABLED,\n\tENABLED,\n\tNONE_BASE_ID,\n\tSELECTED,\n\tsets_equal,\n\tUNSELECTED,\n} from './state.js';\nimport type { LoadedPromptPreset } from './types.js';\n\nexport interface PromptPresetManagerState {\n\tpresets: Record<string, LoadedPromptPreset>;\n\tactive_base_name: string | undefined;\n\tactive_layers: ReadonlySet<string>;\n}\n\nexport async function show_prompt_preset_manager(\n\tctx: ExtensionCommandContext,\n\tstate: PromptPresetManagerState,\n\ton_change: (\n\t\tbase_name: string | undefined,\n\t\tlayers: ReadonlySet<string>,\n\t) => void,\n): Promise<void> {\n\tconst base_presets = list_base_presets(state.presets);\n\tconst layer_presets = list_layer_presets(state.presets);\n\tif (base_presets.length === 0 && layer_presets.length === 0) {\n\t\tctx.ui.notify('No prompt presets available', 'warning');\n\t\treturn;\n\t}\n\n\tconst initial_base = state.active_base_name;\n\tconst initial_layers = new Set(state.active_layers);\n\tlet selected_base = state.active_base_name;\n\tconst enabled_layers = new Set(state.active_layers);\n\n\tconst items: SettingItem[] = [];\n\tconst base_ids = new Set<string>();\n\tconst layer_ids = new Set<string>();\n\n\titems.push({\n\t\tid: '__header_base__',\n\t\tlabel: `── Base presets (${base_presets.length + 1}) ──`,\n\t\tdescription: '',\n\t\tcurrentValue: '',\n\t});\n\titems.push({\n\t\tid: NONE_BASE_ID,\n\t\tlabel: '(none)',\n\t\tdescription: 'No active base preset',\n\t\tcurrentValue: UNSELECTED,\n\t\tvalues: [SELECTED, UNSELECTED],\n\t});\n\tbase_ids.add(NONE_BASE_ID);\n\n\tfor (const preset of base_presets) {\n\t\titems.push({\n\t\t\tid: preset.name,\n\t\t\tlabel: preset.name,\n\t\t\tdescription: [\n\t\t\t\t`${get_prompt_source_label(preset.source)} • ${preset.description ?? 'base preset'}`,\n\t\t\t].join('\\n'),\n\t\t\tcurrentValue: UNSELECTED,\n\t\t\tvalues: [SELECTED, UNSELECTED],\n\t\t});\n\t\tbase_ids.add(preset.name);\n\t}\n\n\titems.push({\n\t\tid: '__header_layers__',\n\t\tlabel: `── Prompt layers (${layer_presets.length}) ──`,\n\t\tdescription: '',\n\t\tcurrentValue: '',\n\t});\n\tfor (const preset of layer_presets) {\n\t\titems.push({\n\t\t\tid: preset.name,\n\t\t\tlabel: preset.name,\n\t\t\tdescription: [\n\t\t\t\t`${get_prompt_source_label(preset.source)} • ${preset.description ?? 'layer'}`,\n\t\t\t].join('\\n'),\n\t\t\tcurrentValue: DISABLED,\n\t\t\tvalues: [ENABLED, DISABLED],\n\t\t});\n\t\tlayer_ids.add(preset.name);\n\t}\n\n\tfunction sync_values() {\n\t\tfor (const item of items) {\n\t\t\tif (base_ids.has(item.id)) {\n\t\t\t\tconst is_selected =\n\t\t\t\t\t(item.id === NONE_BASE_ID && !selected_base) ||\n\t\t\t\t\titem.id === selected_base;\n\t\t\t\titem.currentValue = is_selected ? SELECTED : UNSELECTED;\n\t\t\t} else if (layer_ids.has(item.id)) {\n\t\t\t\titem.currentValue = enabled_layers.has(item.id)\n\t\t\t\t\t? ENABLED\n\t\t\t\t\t: DISABLED;\n\t\t\t}\n\t\t}\n\t}\n\n\tsync_values();\n\n\tawait show_settings_modal(ctx, {\n\t\ttitle: 'Prompt presets',\n\t\tsubtitle: () =>\n\t\t\t`base: ${selected_base ?? '(none)'} • ${enabled_layers.size} layer(s) enabled`,\n\t\titems,\n\t\tmax_visible: Math.min(Math.max(items.length + 4, 8), 24),\n\t\tenable_search: true,\n\t\ton_change: (id, new_value) => {\n\t\t\tif (id.startsWith('__header_')) return;\n\n\t\t\tif (base_ids.has(id)) {\n\t\t\t\tselected_base =\n\t\t\t\t\tnew_value === SELECTED && id !== NONE_BASE_ID\n\t\t\t\t\t\t? id\n\t\t\t\t\t\t: undefined;\n\t\t\t\tsync_values();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (layer_ids.has(id)) {\n\t\t\t\tif (new_value === ENABLED) {\n\t\t\t\t\tenabled_layers.add(id);\n\t\t\t\t} else {\n\t\t\t\t\tenabled_layers.delete(id);\n\t\t\t\t}\n\t\t\t\tsync_values();\n\t\t\t}\n\t\t},\n\t});\n\n\tif (\n\t\tselected_base !== initial_base ||\n\t\t!sets_equal(initial_layers, enabled_layers)\n\t) {\n\t\ton_change(selected_base, enabled_layers);\n\t}\n}\n","import type { LoadedPromptPreset } from './types.js';\n\nexport function build_active_prompt_blocks(\n\tpresets: Record<string, LoadedPromptPreset>,\n\tactive_base_name: string | undefined,\n\tactive_layers: ReadonlySet<string>,\n): string[] {\n\tconst blocks: string[] = [];\n\tconst base = active_base_name\n\t\t? presets[active_base_name]\n\t\t: undefined;\n\tif (base?.instructions.trim()) {\n\t\tblocks.push(\n\t\t\t`## Active Base Prompt: ${base.name}\\n${base.instructions.trim()}`,\n\t\t);\n\t}\n\n\tconst layer_blocks = [...active_layers]\n\t\t.sort()\n\t\t.map((name) => presets[name])\n\t\t.filter((preset): preset is LoadedPromptPreset =>\n\t\t\tBoolean(preset?.instructions.trim()),\n\t\t)\n\t\t.map(\n\t\t\t(preset) => `### ${preset.name}\\n${preset.instructions.trim()}`,\n\t\t);\n\tif (layer_blocks.length > 0) {\n\t\tblocks.push(\n\t\t\t`## Active Prompt Layers\\n\\n${layer_blocks.join('\\n\\n')}`,\n\t\t);\n\t}\n\n\treturn blocks;\n}\n","import {\n\ttype ExtensionAPI,\n\ttype ExtensionCommandContext,\n\ttype ExtensionContext,\n} from '@earendil-works/pi-coding-agent';\nimport { existsSync } from 'node:fs';\nimport {\n\tformat_active_details,\n\tformat_summary,\n\tget_prompt_source_label,\n} from './catalog.js';\nimport { get_prompt_preset_completions } from './completions.js';\nimport {\n\tDEFAULT_BASE_PROMPT_PRESET_NAME,\n\tDEFAULT_PROMPT_PRESETS,\n} from './defaults.js';\nimport { set_status } from './footer.js';\nimport { format_prompt_preset_help, is_subcommand } from './help.js';\nimport { show_prompt_preset_manager } from './manager.js';\nimport { build_active_prompt_blocks } from './prompt-blocks.js';\nimport {\n\tget_last_preset_state,\n\tnormalize_active_state,\n\tparse_preset_flag,\n\tpersist_state,\n} from './state.js';\nimport {\n\tget_global_presets_dir,\n\tget_project_presets_dir,\n\tget_prompt_preset_file_path,\n\tload_persisted_prompt_state,\n\tload_prompt_presets,\n\tremove_project_prompt_preset,\n\tsave_global_prompt_preset_file,\n\tsave_project_prompt_preset_file,\n\tsave_prompt_preset_file,\n} from './storage.js';\nimport type {\n\tLoadedPromptPreset,\n\tPromptPresetKind,\n} from './types.js';\n\nexport {\n\tget_current_thinking_level,\n\tget_default_footer_thinking_level,\n\trender_footer_status_line,\n} from '@spences10/pi-footer';\nexport {\n\tDEFAULT_BASE_PROMPT_PRESET_NAME,\n\tDEFAULT_PROMPT_PRESETS,\n} from './defaults.js';\nexport {\n\tload_persisted_prompt_state,\n\tload_prompt_presets,\n\tmerge_prompt_presets,\n\tnormalize_prompt_presets,\n\tread_prompt_presets_dir,\n\tremove_project_prompt_preset,\n\tsave_persisted_prompt_state,\n\tsave_project_prompt_presets,\n\tsave_prompt_preset_file,\n} from './storage.js';\nexport type {\n\tLoadedPromptPreset,\n\tPromptPreset,\n\tPromptPresetKind,\n\tPromptPresetMap,\n\tPromptPresetSource,\n\tPromptPresetState,\n} from './types.js';\n\nexport default async function prompt_presets(pi: ExtensionAPI) {\n\tlet presets: Record<string, LoadedPromptPreset> = {};\n\tlet active_base_name: string | undefined;\n\tlet active_layers = new Set<string>();\n\n\tfunction get_base(\n\t\tname: string | undefined,\n\t): LoadedPromptPreset | undefined {\n\t\treturn name ? presets[name] : undefined;\n\t}\n\n\tfunction get_layer(name: string): LoadedPromptPreset | undefined {\n\t\tconst preset = presets[name];\n\t\treturn preset?.kind === 'layer' ? preset : undefined;\n\t}\n\n\tfunction commit_state(\n\t\tctx: ExtensionContext,\n\t\tnext_base_name: string | undefined,\n\t\tnext_layers: ReadonlySet<string>,\n\t\toptions?: { persist?: boolean; notify?: string },\n\t): void {\n\t\tactive_base_name = next_base_name;\n\t\tactive_layers = new Set(next_layers);\n\t\tset_status(ctx, active_base_name, active_layers);\n\t\tif (options?.persist !== false) {\n\t\t\tpersist_state(pi, ctx, active_base_name, active_layers);\n\t\t}\n\t\tif (options?.notify) {\n\t\t\tctx.ui.notify(options.notify, 'info');\n\t\t}\n\t}\n\n\tfunction activate_base(\n\t\tname: string | undefined,\n\t\tctx: ExtensionContext,\n\t\toptions?: { persist?: boolean },\n\t): boolean {\n\t\tif (!name) {\n\t\t\tcommit_state(ctx, undefined, active_layers, {\n\t\t\t\tpersist: options?.persist,\n\t\t\t\tnotify: 'Base preset cleared',\n\t\t\t});\n\t\t\treturn true;\n\t\t}\n\n\t\tconst preset = get_base(name);\n\t\tif (!preset) {\n\t\t\tctx.ui.notify(`Unknown base preset: ${name}`, 'warning');\n\t\t\treturn false;\n\t\t}\n\n\t\tcommit_state(ctx, preset.name, active_layers, {\n\t\t\tpersist: options?.persist,\n\t\t\tnotify: `Base preset \"${preset.name}\" activated`,\n\t\t});\n\t\treturn true;\n\t}\n\n\tfunction set_layer_enabled(\n\t\tname: string,\n\t\tenabled: boolean,\n\t\tctx: ExtensionContext,\n\t\toptions?: { persist?: boolean },\n\t): boolean {\n\t\tconst preset = get_layer(name);\n\t\tif (!preset) {\n\t\t\tctx.ui.notify(`Unknown prompt layer: ${name}`, 'warning');\n\t\t\treturn false;\n\t\t}\n\n\t\tconst next_layers = new Set(active_layers);\n\t\tif (enabled) {\n\t\t\tnext_layers.add(preset.name);\n\t\t} else {\n\t\t\tnext_layers.delete(preset.name);\n\t\t}\n\n\t\tcommit_state(ctx, active_base_name, next_layers, {\n\t\t\tpersist: options?.persist,\n\t\t\tnotify: enabled\n\t\t\t\t? `Layer \"${preset.name}\" enabled`\n\t\t\t\t: `Layer \"${preset.name}\" disabled`,\n\t\t});\n\t\treturn true;\n\t}\n\n\tfunction toggle_layer(\n\t\tname: string,\n\t\tctx: ExtensionContext,\n\t\toptions?: { persist?: boolean },\n\t): boolean {\n\t\treturn set_layer_enabled(\n\t\t\tname,\n\t\t\t!active_layers.has(name),\n\t\t\tctx,\n\t\t\toptions,\n\t\t);\n\t}\n\n\tasync function edit_preset(\n\t\tname: string,\n\t\tctx: ExtensionCommandContext,\n\t\tscope: 'project' | 'global' = 'project',\n\t): Promise<void> {\n\t\tconst existing = presets[name];\n\t\tconst kind_choice = await ctx.ui.select('Preset kind', [\n\t\t\texisting?.kind === 'layer'\n\t\t\t\t? 'layer (current)'\n\t\t\t\t: 'base (current)',\n\t\t\texisting?.kind === 'layer' ? 'base' : 'layer',\n\t\t]);\n\t\tif (!kind_choice) return;\n\t\tconst kind: PromptPresetKind = kind_choice.startsWith('layer')\n\t\t\t? 'layer'\n\t\t\t: 'base';\n\n\t\tconst description = await ctx.ui.input(\n\t\t\t`Description for ${name}`,\n\t\t\texisting?.description ?? '',\n\t\t);\n\t\tif (description === undefined) return;\n\n\t\tconst instructions = await ctx.ui.editor(\n\t\t\t`Edit ${kind} preset: ${name}`,\n\t\t\texisting?.instructions ?? '',\n\t\t);\n\t\tif (instructions === undefined) return;\n\n\t\tconst saved_path =\n\t\t\tscope === 'global'\n\t\t\t\t? save_global_prompt_preset_file(name, {\n\t\t\t\t\t\tkind,\n\t\t\t\t\t\tinstructions,\n\t\t\t\t\t\t...(description.trim()\n\t\t\t\t\t\t\t? { description: description.trim() }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t})\n\t\t\t\t: save_project_prompt_preset_file(ctx.cwd, name, {\n\t\t\t\t\t\tkind,\n\t\t\t\t\t\tinstructions,\n\t\t\t\t\t\t...(description.trim()\n\t\t\t\t\t\t\t? { description: description.trim() }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t});\n\n\t\tpresets = load_prompt_presets(ctx.cwd);\n\t\tconst normalized = normalize_active_state(\n\t\t\tpresets,\n\t\t\tactive_base_name,\n\t\t\tactive_layers,\n\t\t);\n\t\tactive_base_name = normalized.active_base_name;\n\t\tactive_layers = normalized.active_layers;\n\n\t\tif (kind === 'base') {\n\t\t\tactivate_base(name, ctx);\n\t\t} else {\n\t\t\tset_layer_enabled(name, true, ctx);\n\t\t}\n\t\tctx.ui.notify(`Saved preset \"${name}\" to ${saved_path}`, 'info');\n\t}\n\n\tfunction export_default_presets(\n\t\tctx: ExtensionCommandContext,\n\t\tscope: 'project' | 'global',\n\t): void {\n\t\tconst dir =\n\t\t\tscope === 'global'\n\t\t\t\t? get_global_presets_dir()\n\t\t\t\t: get_project_presets_dir(ctx.cwd);\n\t\tlet written = 0;\n\t\tlet skipped = 0;\n\t\tfor (const [name, preset] of Object.entries(\n\t\t\tDEFAULT_PROMPT_PRESETS,\n\t\t)) {\n\t\t\tconst path = get_prompt_preset_file_path(dir, name);\n\t\t\tif (existsSync(path)) {\n\t\t\t\tskipped += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tsave_prompt_preset_file(dir, name, preset);\n\t\t\twritten += 1;\n\t\t}\n\n\t\tpresets = load_prompt_presets(ctx.cwd);\n\t\tconst normalized = normalize_active_state(\n\t\t\tpresets,\n\t\t\tactive_base_name,\n\t\t\tactive_layers,\n\t\t);\n\t\tactive_base_name = normalized.active_base_name;\n\t\tactive_layers = normalized.active_layers;\n\t\tset_status(ctx, active_base_name, active_layers);\n\n\t\tctx.ui.notify(\n\t\t\t`Exported ${written} built-in preset file(s) to ${dir}${skipped ? ` (${skipped} already existed)` : ''}`,\n\t\t\t'info',\n\t\t);\n\t}\n\n\tfunction remove_custom_preset(\n\t\tname: string,\n\t\tctx: ExtensionCommandContext,\n\t\tmode: 'delete' | 'reset',\n\t): void {\n\t\tconst result = remove_project_prompt_preset(ctx.cwd, name);\n\t\tif (!result.removed) {\n\t\t\tctx.ui.notify(\n\t\t\t\t`No project-local preset named \"${name}\" to ${mode}`,\n\t\t\t\t'warning',\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tpresets = load_prompt_presets(ctx.cwd);\n\t\tconst normalized = normalize_active_state(\n\t\t\tpresets,\n\t\t\tactive_base_name,\n\t\t\tactive_layers,\n\t\t);\n\t\tactive_base_name = normalized.active_base_name;\n\t\tactive_layers = normalized.active_layers;\n\t\tset_status(ctx, active_base_name, active_layers);\n\t\tpersist_state(pi, ctx, active_base_name, active_layers);\n\n\t\tconst fallback = presets[name];\n\t\tif (mode === 'reset' && fallback) {\n\t\t\tctx.ui.notify(\n\t\t\t\t`Reset \"${name}\" to ${get_prompt_source_label(fallback.source)} preset`,\n\t\t\t\t'info',\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tctx.ui.notify(\n\t\t\tresult.remaining === 0\n\t\t\t\t? `Removed \"${name}\" and deleted ${result.path}`\n\t\t\t\t: `Removed \"${name}\" from ${result.path}`,\n\t\t\t'info',\n\t\t);\n\t}\n\n\tasync function show_manager(\n\t\tctx: ExtensionCommandContext,\n\t): Promise<void> {\n\t\tawait show_prompt_preset_manager(\n\t\t\tctx,\n\t\t\t{ presets, active_base_name, active_layers },\n\t\t\t(selected_base, enabled_layers) => {\n\t\t\t\tcommit_state(ctx, selected_base, enabled_layers, {\n\t\t\t\t\tnotify: 'Updated prompt preset selection',\n\t\t\t\t});\n\t\t\t},\n\t\t);\n\t}\n\n\tpi.registerFlag('preset', {\n\t\tdescription:\n\t\t\t'Activate prompt config on startup. Accepts a base preset or comma-separated preset/layer names.',\n\t\ttype: 'string',\n\t});\n\n\tconst prompt_preset_command: Parameters<\n\t\tExtensionAPI['registerCommand']\n\t>[1] = {\n\t\tdescription:\n\t\t\t'Manage prompt presets and layers. Try: /prompt-preset help, /prompt-preset export-defaults, /prompt-preset edit-global terse',\n\t\tgetArgumentCompletions: (prefix) =>\n\t\t\tget_prompt_preset_completions(presets, prefix),\n\t\thandler: async (args, ctx) => {\n\t\t\tconst trimmed = args.trim();\n\t\t\tif (!trimmed) {\n\t\t\t\tif (ctx.hasUI) {\n\t\t\t\t\tawait show_manager(ctx);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\tformat_summary(active_base_name, active_layers, presets),\n\t\t\t\t\t'info',\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst [first, ...rest] = trimmed.split(/\\s+/);\n\t\t\tconst arg = rest.join(' ').trim();\n\n\t\t\tswitch (first) {\n\t\t\t\tcase 'help':\n\t\t\t\t\tctx.ui.notify(format_prompt_preset_help(), 'info');\n\t\t\t\t\treturn;\n\t\t\t\tcase 'list':\n\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\tformat_summary(active_base_name, active_layers, presets),\n\t\t\t\t\t\t'info',\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\tcase 'show':\n\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\tformat_active_details(\n\t\t\t\t\t\t\tactive_base_name,\n\t\t\t\t\t\t\tactive_layers,\n\t\t\t\t\t\t\tpresets,\n\t\t\t\t\t\t),\n\t\t\t\t\t\t'info',\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\tcase 'clear':\n\t\t\t\t\tcommit_state(ctx, undefined, new Set(), {\n\t\t\t\t\t\tnotify: 'Cleared base preset and prompt layers',\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\tcase 'reload': {\n\t\t\t\t\tpresets = load_prompt_presets(ctx.cwd);\n\t\t\t\t\tconst normalized = normalize_active_state(\n\t\t\t\t\t\tpresets,\n\t\t\t\t\t\tactive_base_name,\n\t\t\t\t\t\tactive_layers,\n\t\t\t\t\t);\n\t\t\t\t\tactive_base_name = normalized.active_base_name;\n\t\t\t\t\tactive_layers = normalized.active_layers;\n\t\t\t\t\tset_status(ctx, active_base_name, active_layers);\n\t\t\t\t\tctx.ui.notify('Reloaded prompt presets', 'info');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase 'base':\n\t\t\t\t\tif (!arg) {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t'Usage: /prompt-preset base <name> (alias: /preset)',\n\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tactivate_base(arg, ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase 'enable':\n\t\t\t\t\tif (!arg) {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t'Usage: /prompt-preset enable <layer> (alias: /preset)',\n\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tset_layer_enabled(arg, true, ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase 'disable':\n\t\t\t\t\tif (!arg) {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t'Usage: /prompt-preset disable <layer> (alias: /preset)',\n\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tset_layer_enabled(arg, false, ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase 'toggle':\n\t\t\t\t\tif (!arg) {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t'Usage: /prompt-preset toggle <layer> (alias: /preset)',\n\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\ttoggle_layer(arg, ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase 'edit': {\n\t\t\t\t\tlet scope: 'project' | 'global' = 'project';\n\t\t\t\t\tlet name = arg;\n\t\t\t\t\tif (arg.startsWith('--global ')) {\n\t\t\t\t\t\tscope = 'global';\n\t\t\t\t\t\tname = arg.slice('--global '.length).trim();\n\t\t\t\t\t} else if (arg.startsWith('--project ')) {\n\t\t\t\t\t\tname = arg.slice('--project '.length).trim();\n\t\t\t\t\t}\n\t\t\t\t\tif (!name) {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t'Usage: /prompt-preset edit [--global|--project] <name> (alias: /preset)',\n\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tawait edit_preset(name, ctx, scope);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase 'edit-global':\n\t\t\t\t\tif (!arg) {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t'Usage: /prompt-preset edit-global <name> (alias: /preset)',\n\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tawait edit_preset(arg, ctx, 'global');\n\t\t\t\t\treturn;\n\t\t\t\tcase 'export-defaults': {\n\t\t\t\t\tconst scope = arg || 'global';\n\t\t\t\t\tif (scope !== 'global' && scope !== 'project') {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t'Usage: /prompt-preset export-defaults [global|project] (alias: /preset)',\n\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\texport_default_presets(ctx, scope);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase 'delete':\n\t\t\t\t\tif (!arg) {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t'Usage: /prompt-preset delete <name> (alias: /preset)',\n\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tremove_custom_preset(arg, ctx, 'delete');\n\t\t\t\t\treturn;\n\t\t\t\tcase 'reset':\n\t\t\t\t\tif (!arg) {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t'Usage: /prompt-preset reset <name> (alias: /preset)',\n\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tremove_custom_preset(arg, ctx, 'reset');\n\t\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (is_subcommand(first)) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Unsupported preset command: ${first}`,\n\t\t\t\t\t'warning',\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst preset = presets[trimmed];\n\t\t\tif (!preset) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Unknown preset or layer: ${trimmed}. Try /prompt-preset help.`,\n\t\t\t\t\t'warning',\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (preset.kind === 'base') {\n\t\t\t\tactivate_base(preset.name, ctx);\n\t\t\t} else {\n\t\t\t\ttoggle_layer(preset.name, ctx);\n\t\t\t}\n\t\t},\n\t};\n\n\tfor (const command_name of ['prompt-preset', 'preset']) {\n\t\tpi.registerCommand(command_name, prompt_preset_command);\n\t}\n\n\tpi.on('session_start', async (_event, ctx) => {\n\t\tpresets = load_prompt_presets(ctx.cwd);\n\t\tactive_base_name = undefined;\n\t\tactive_layers = new Set();\n\n\t\tconst preset_flag = pi.getFlag('preset');\n\t\tif (typeof preset_flag === 'string' && preset_flag.trim()) {\n\t\t\tfor (const name of parse_preset_flag(preset_flag)) {\n\t\t\t\tconst preset = presets[name];\n\t\t\t\tif (!preset) continue;\n\t\t\t\tif (preset.kind === 'base') {\n\t\t\t\t\tactive_base_name = name;\n\t\t\t\t} else {\n\t\t\t\t\tactive_layers.add(name);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst normalized = normalize_active_state(\n\t\t\t\tpresets,\n\t\t\t\tactive_base_name,\n\t\t\t\tactive_layers,\n\t\t\t);\n\t\t\tactive_base_name = normalized.active_base_name;\n\t\t\tactive_layers = normalized.active_layers;\n\t\t\tset_status(ctx, active_base_name, active_layers);\n\t\t\treturn;\n\t\t}\n\n\t\tconst restored = get_last_preset_state(ctx) ??\n\t\t\tload_persisted_prompt_state(ctx.cwd) ?? {\n\t\t\t\tbase_name: DEFAULT_BASE_PROMPT_PRESET_NAME,\n\t\t\t\tlayer_names: [],\n\t\t\t};\n\t\tactive_base_name = restored.base_name ?? undefined;\n\t\tactive_layers = new Set(restored.layer_names ?? []);\n\t\tconst normalized = normalize_active_state(\n\t\t\tpresets,\n\t\t\tactive_base_name,\n\t\t\tactive_layers,\n\t\t);\n\t\tactive_base_name = normalized.active_base_name;\n\t\tactive_layers = normalized.active_layers;\n\t\tset_status(ctx, active_base_name, active_layers);\n\t});\n\n\tpi.on('before_agent_start', async (event) => {\n\t\tconst blocks = build_active_prompt_blocks(\n\t\t\tpresets,\n\t\t\tactive_base_name,\n\t\t\tactive_layers,\n\t\t);\n\t\tif (blocks.length === 0) return;\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n\\n${blocks.join('\\n\\n')}`,\n\t\t};\n\t});\n\n\tpi.on('session_shutdown', async (_event, ctx) => {\n\t\tctx.ui.setStatus('preset', undefined);\n\t});\n}\n"],"mappings":"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"}
|