my-pi 0.2.4 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +15 -15
package/dist/index.js
CHANGED
|
@@ -28,7 +28,7 @@ function is_citty_no_flag_set(args, cli_arg) {
|
|
|
28
28
|
}
|
|
29
29
|
function resolve_builtin_extension_options(args) {
|
|
30
30
|
const no_builtin = is_citty_no_flag_set(args, "no-builtin");
|
|
31
|
-
return Object.fromEntries(BUILTIN_EXTENSIONS.map((extension) => [extension.option_name, !no_builtin && !is_citty_no_flag_set(args, extension.cli_arg)]));
|
|
31
|
+
return Object.fromEntries(BUILTIN_EXTENSIONS.map((extension) => [extension.option_name, !no_builtin && !is_citty_no_flag_set(args, extension.cli_arg) && extension.default_enabled]));
|
|
32
32
|
}
|
|
33
33
|
function parse_extension_cli_args(argv, known_args) {
|
|
34
34
|
const known_flags = /* @__PURE__ */ new Map();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/cli-args.ts","../src/runtime-preflight.ts","../src/warnings.ts","../src/index.ts"],"sourcesContent":["import { resolve } from 'node:path';\nimport {\n\tBUILTIN_EXTENSIONS,\n\ttype BuiltinExtensionOptionName,\n} from './extensions/builtin-registry.js';\n\nconst THINKING_LEVELS = new Set([\n\t'off',\n\t'minimal',\n\t'low',\n\t'medium',\n\t'high',\n\t'xhigh',\n]);\n\nexport type CliThinkingLevel =\n\t| 'off'\n\t| 'minimal'\n\t| 'low'\n\t| 'medium'\n\t| 'high'\n\t| 'xhigh';\n\nexport type BuiltinDisableCliArgs = Record<\n\tstring,\n\t{\n\t\ttype: 'boolean';\n\t\tdescription: string;\n\t\tdefault: false;\n\t}\n>;\n\nexport interface CliArgDefinition {\n\ttype: 'boolean' | 'string' | 'enum' | 'positional';\n\talias?: string | readonly string[];\n}\n\nexport type CliArgDefinitions = Record<string, CliArgDefinition>;\n\nexport interface ParsedExtensionCliArgs {\n\textension_flag_values: Map<string, boolean | string>;\n\tpositionals: string[];\n\tdiagnostics: string[];\n}\n\nexport function create_builtin_disable_cli_args(): BuiltinDisableCliArgs {\n\treturn Object.fromEntries(\n\t\tBUILTIN_EXTENSIONS.map((extension) => [\n\t\t\textension.cli_arg,\n\t\t\t{\n\t\t\t\ttype: 'boolean' as const,\n\t\t\t\tdescription: extension.cli_description,\n\t\t\t\tdefault: false as const,\n\t\t\t},\n\t\t]),\n\t);\n}\n\nfunction is_citty_no_flag_set(\n\targs: Record<string, unknown>,\n\tcli_arg: string,\n): boolean {\n\tif (args[cli_arg]) return true;\n\n\tconst positive_kebab = cli_arg.replace(/^no-/, '');\n\tconst positive_camel = positive_kebab.replace(\n\t\t/-([a-z])/g,\n\t\t(_, char) => String(char).toUpperCase(),\n\t);\n\treturn (\n\t\targs[positive_kebab] === false || args[positive_camel] === false\n\t);\n}\n\nexport function resolve_builtin_extension_options(\n\targs: Record<string, unknown>,\n): Partial<Record<BuiltinExtensionOptionName, boolean>> {\n\tconst no_builtin = is_citty_no_flag_set(args, 'no-builtin');\n\treturn Object.fromEntries(\n\t\tBUILTIN_EXTENSIONS.map((extension) => [\n\t\t\textension.option_name,\n\t\t\t!no_builtin && !is_citty_no_flag_set(args, extension.cli_arg),\n\t\t]),\n\t) as Partial<Record<BuiltinExtensionOptionName, boolean>>;\n}\n\nexport function parse_extension_cli_args(\n\targv: string[],\n\tknown_args: CliArgDefinitions,\n): ParsedExtensionCliArgs {\n\tconst known_flags = new Map<string, CliArgDefinition['type']>();\n\tfor (const [name, definition] of Object.entries(known_args)) {\n\t\tknown_flags.set(`--${name}`, definition.type);\n\t\tconst camel_name = name.replace(/-([a-z])/g, (_, char) =>\n\t\t\tString(char).toUpperCase(),\n\t\t);\n\t\tknown_flags.set(`--${camel_name}`, definition.type);\n\t\tif (definition.type === 'boolean')\n\t\t\tknown_flags.set(`--no-${name}`, definition.type);\n\t\tconst aliases = Array.isArray(definition.alias)\n\t\t\t? definition.alias\n\t\t\t: definition.alias\n\t\t\t\t? [definition.alias]\n\t\t\t\t: [];\n\t\tfor (const alias of aliases)\n\t\t\tknown_flags.set(`-${alias}`, definition.type);\n\t}\n\n\tconst extension_flag_values = new Map<string, boolean | string>();\n\tconst positionals: string[] = [];\n\tconst diagnostics: string[] = [];\n\n\tfor (let i = 0; i < argv.length; i++) {\n\t\tconst arg = argv[i];\n\t\tif (!arg) continue;\n\t\tif (arg === '--') {\n\t\t\tpositionals.push(...argv.slice(i + 1));\n\t\t\tbreak;\n\t\t}\n\n\t\tconst equals_index = arg.indexOf('=');\n\t\tconst flag_token =\n\t\t\tequals_index === -1 ? arg : arg.slice(0, equals_index);\n\t\tconst known_type = known_flags.get(flag_token);\n\t\tif (known_type) {\n\t\t\tif (\n\t\t\t\tequals_index === -1 &&\n\t\t\t\t(known_type === 'string' || known_type === 'enum') &&\n\t\t\t\ti + 1 < argv.length\n\t\t\t) {\n\t\t\t\ti += 1;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg.startsWith('--')) {\n\t\t\tif (equals_index !== -1) {\n\t\t\t\textension_flag_values.set(\n\t\t\t\t\targ.slice(2, equals_index),\n\t\t\t\t\targ.slice(equals_index + 1),\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst name = arg.slice(2);\n\t\t\tconst next = argv[i + 1];\n\t\t\tif (\n\t\t\t\tnext !== undefined &&\n\t\t\t\t!next.startsWith('-') &&\n\t\t\t\t!next.startsWith('@')\n\t\t\t) {\n\t\t\t\textension_flag_values.set(name, next);\n\t\t\t\ti += 1;\n\t\t\t} else {\n\t\t\t\textension_flag_values.set(name, true);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg.startsWith('-')) {\n\t\t\tdiagnostics.push(`Unknown option: ${arg}`);\n\t\t\tcontinue;\n\t\t}\n\t\tpositionals.push(arg);\n\t}\n\n\treturn { extension_flag_values, positionals, diagnostics };\n}\n\nexport function collect_flag_values(\n\targv: string[],\n\tflags: readonly string[],\n): string[] {\n\tconst values: string[] = [];\n\tconst flag_set = new Set(flags);\n\n\tfor (let i = 0; i < argv.length; i++) {\n\t\tconst arg = argv[i];\n\t\tif (!arg) continue;\n\n\t\tconst equals_index = arg.indexOf('=');\n\t\tif (equals_index !== -1) {\n\t\t\tconst name = arg.slice(0, equals_index);\n\t\t\tif (flag_set.has(name)) {\n\t\t\t\tvalues.push(arg.slice(equals_index + 1));\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (flag_set.has(arg) && i + 1 < argv.length) {\n\t\t\tconst next = argv[i + 1];\n\t\t\tif (next !== undefined) {\n\t\t\t\tvalues.push(next);\n\t\t\t\ti += 1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn values;\n}\n\nexport function parse_extension_paths(\n\targv: string[],\n\tcwd = process.cwd(),\n): string[] {\n\treturn collect_flag_values(argv, ['-e', '--extension'])\n\t\t.map((path) => path.trim())\n\t\t.filter(Boolean)\n\t\t.map((path) => resolve(cwd, path));\n}\n\nfunction parse_comma_list_flags(\n\targv: string[],\n\tflags: readonly string[],\n): string[] | undefined {\n\tconst values = collect_flag_values(argv, flags)\n\t\t.flatMap((value) => value.split(','))\n\t\t.map((value) => value.trim())\n\t\t.filter(Boolean);\n\treturn values.length ? [...new Set(values)] : undefined;\n}\n\nexport function parse_tool_allowlist(\n\targv: string[],\n): string[] | undefined {\n\treturn parse_comma_list_flags(argv, ['--tools', '-t']);\n}\n\nexport function parse_tool_excludelist(\n\targv: string[],\n): string[] | undefined {\n\treturn parse_comma_list_flags(argv, ['--exclude-tools', '-xt']);\n}\n\nexport function parse_skill_allowlist(\n\targv: string[],\n): string[] | undefined {\n\treturn parse_comma_list_flags(argv, ['--skill']);\n}\n\nexport function parse_thinking_level(\n\tvalue: string | undefined,\n): CliThinkingLevel | undefined {\n\tconst normalized = value?.trim().toLowerCase();\n\tif (!normalized) return undefined;\n\tif (!THINKING_LEVELS.has(normalized)) {\n\t\tthrow new Error(\n\t\t\t'--thinking must be one of: off, minimal, low, medium, high, xhigh.',\n\t\t);\n\t}\n\treturn normalized as CliThinkingLevel;\n}\n","export const MINIMUM_NODE_VERSION = '24.15.0';\n\nfunction parse_node_version(\n\tversion: string,\n): [number, number, number] | undefined {\n\tconst match = /^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:[-+].*)?$/.exec(version);\n\tif (!match) return undefined;\n\treturn [Number(match[1]), Number(match[2]), Number(match[3])];\n}\n\nexport function is_supported_node_version(version: string): boolean {\n\tconst current = parse_node_version(version);\n\tconst minimum = parse_node_version(MINIMUM_NODE_VERSION);\n\tif (!current || !minimum) return false;\n\n\tfor (let index = 0; index < current.length; index++) {\n\t\tif (current[index] > minimum[index]) return true;\n\t\tif (current[index] < minimum[index]) return false;\n\t}\n\treturn true;\n}\n\nexport function get_node_preflight_error(\n\tcurrent_version = process.versions.node,\n): string | undefined {\n\tif (is_supported_node_version(current_version)) return undefined;\n\treturn `my-pi requires Node >=${MINIMUM_NODE_VERSION}; current version is ${current_version}. Upgrade Node and retry.`;\n}\n","const SQLITE_EXPERIMENTAL_WARNING =\n\t'SQLite is an experimental feature';\nconst FILTER_INSTALLED = Symbol.for(\n\t'my-pi.sqlite-warning-filter-installed',\n);\nconst ORIGINAL_EMIT_WARNING = Symbol.for(\n\t'my-pi.original-emit-warning',\n);\n\ntype WarningEmitter = Pick<typeof process, 'emitWarning'> & {\n\t[FILTER_INSTALLED]?: boolean;\n\t[ORIGINAL_EMIT_WARNING]?: typeof process.emitWarning;\n};\n\nexport function should_suppress_warning(warning: Error): boolean {\n\treturn (\n\t\twarning.name === 'ExperimentalWarning' &&\n\t\twarning.message.includes(SQLITE_EXPERIMENTAL_WARNING)\n\t);\n}\n\nfunction should_suppress_emit_warning_args(args: unknown[]): boolean {\n\tconst [warning, options_or_type] = args;\n\tif (warning instanceof Error)\n\t\treturn should_suppress_warning(warning);\n\tconst warning_type =\n\t\ttypeof options_or_type === 'string'\n\t\t\t? options_or_type\n\t\t\t: options_or_type && typeof options_or_type === 'object'\n\t\t\t\t? (options_or_type as { type?: unknown }).type\n\t\t\t\t: undefined;\n\treturn (\n\t\twarning_type === 'ExperimentalWarning' &&\n\t\tString(warning).includes(SQLITE_EXPERIMENTAL_WARNING)\n\t);\n}\n\nexport function install_sqlite_warning_filter(\n\tprocess_like: WarningEmitter = process,\n): void {\n\tif (process_like[FILTER_INSTALLED]) return;\n\tprocess_like[FILTER_INSTALLED] = true;\n\n\tconst original_emit_warning =\n\t\tprocess_like[ORIGINAL_EMIT_WARNING] ?? process_like.emitWarning;\n\tprocess_like[ORIGINAL_EMIT_WARNING] = original_emit_warning;\n\n\tprocess_like.emitWarning = function emit_filtered_warning(\n\t\tthis: WarningEmitter,\n\t\t...args: unknown[]\n\t) {\n\t\tif (should_suppress_emit_warning_args(args)) return;\n\t\treturn (\n\t\t\toriginal_emit_warning as (...args: unknown[]) => void\n\t\t).apply(this, args);\n\t} as typeof process.emitWarning;\n}\n","#!/usr/bin/env node\n\nimport {\n\tdefineCommand,\n\trenderUsage,\n\trunMain,\n\ttype ArgsDef,\n\ttype CommandDef,\n} from 'citty';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport {\n\tcreate_builtin_disable_cli_args,\n\tparse_extension_cli_args,\n\tparse_extension_paths,\n\tparse_skill_allowlist,\n\tparse_thinking_level,\n\tparse_tool_allowlist,\n\tparse_tool_excludelist,\n\tresolve_builtin_extension_options,\n\ttype CliArgDefinitions,\n} from './cli-args.js';\nimport { get_node_preflight_error } from './runtime-preflight.js';\nimport { install_sqlite_warning_filter } from './warnings.js';\n\nconst node_preflight_error = get_node_preflight_error();\nif (node_preflight_error) {\n\tconsole.error(node_preflight_error);\n\tprocess.exit(1);\n}\n\ninstall_sqlite_warning_filter();\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst package_root = join(__dirname, '..');\nconst pkg = JSON.parse(\n\treadFileSync(join(package_root, 'package.json'), 'utf-8'),\n);\n\n// my-pi is a wrapper around Pi; upstream Pi update banners are useful in\n// this repo, but confusing for installed wrapper users.\nif (!existsSync(join(package_root, '.git'))) {\n\tprocess.env.PI_SKIP_VERSION_CHECK ??= '1';\n}\n\nasync function read_stdin(): Promise<string> {\n\tconst chunks: Buffer[] = [];\n\tfor await (const chunk of process.stdin) {\n\t\tchunks.push(chunk as Buffer);\n\t}\n\treturn Buffer.concat(chunks).toString('utf-8').trim();\n}\n\ntype MyPiRuntime = Awaited<\n\tReturnType<(typeof import('./api.js'))['create_my_pi']>\n>;\ntype InteractiveModeConstructor =\n\t(typeof import('@earendil-works/pi-coding-agent'))['InteractiveMode'];\n\nasync function run_interactive_mode(\n\truntime: MyPiRuntime,\n\tInteractiveModeClass: InteractiveModeConstructor,\n): Promise<void> {\n\tconst original_write = process.stdout.write.bind(process.stdout);\n\tprocess.stdout.write = ((\n\t\tchunk: string | Uint8Array,\n\t\t...args: Parameters<typeof original_write>\n\t) => {\n\t\tif (typeof chunk === 'string') {\n\t\t\tconst escape = String.fromCharCode(27);\n\t\t\tconst styled_hint = new RegExp(\n\t\t\t\t`(To resume this session:${escape}\\\\[[\\\\d;]*m )pi( --session )`,\n\t\t\t\t'g',\n\t\t\t);\n\t\t\tchunk = chunk.replace(styled_hint, '$1my-pi$2');\n\t\t\tchunk = chunk.replace(\n\t\t\t\t/(To resume this session: )pi( --session )/g,\n\t\t\t\t'$1my-pi$2',\n\t\t\t);\n\t\t}\n\t\treturn Reflect.apply(original_write, process.stdout, [\n\t\t\tchunk,\n\t\t\t...args,\n\t\t]);\n\t}) as typeof process.stdout.write;\n\ttry {\n\t\tconst mode = new InteractiveModeClass(runtime, {\n\t\t\tmigratedProviders: [],\n\t\t\tmodelFallbackMessage: undefined,\n\t\t\tinitialMessage: undefined,\n\t\t\tinitialImages: [],\n\t\t\tinitialMessages: [],\n\t\t});\n\t\tawait mode.run();\n\t} finally {\n\t\tprocess.stdout.write =\n\t\t\toriginal_write as typeof process.stdout.write;\n\t}\n}\n\nconst HELP_APPENDIX = `\nMODES\n\n my-pi\n Interactive TUI with slash commands, editor, and session UI.\n\n my-pi \"prompt\"\n my-pi -P \"prompt\"\n One-shot print mode with plain text output.\n\n my-pi --json \"prompt\"\n Non-interactive NDJSON mode for scripts, evals, and other agents.\n\n my-pi --mode rpc\n RPC mode over stdin/stdout JSONL for orchestrators and teammate sessions.\n\nNOTES\n\n - In non-interactive modes, my-pi keeps headless-capable built-ins like\n MCP, LSP, prompt presets, recall, nopeek, Omnisearch, SQLite tools, hooks, and secret redaction.\n - UI-only built-ins like session auto-naming are skipped.\n - Repeat -e / --extension to compose multiple extensions.\n\nNESTED RUNS\n\n - Child runs inherit cwd and environment unless you isolate them explicitly.\n - Use --agent-dir to isolate auth, config, sessions, and telemetry state.\n - For safer evals or unknown repos, use --untrusted plus an explicit\n --system-prompt.\n\nEXAMPLES\n\n my-pi\n my-pi \"fix the failing test\"\n my-pi -P \"summarize this repo\"\n my-pi --json \"list all TODO comments\"\n echo \"plan a login page\" | my-pi --json\n my-pi --telemetry --json \"run eval case\"\n my-pi --telemetry --telemetry-db ./tmp/evals.db --json \"run case\"\n my-pi observability\n my-pi --untrusted --agent-dir /tmp/pi-agent --json \"run case\"\n my-pi -e ./my-ext.ts -e ./other-ext.ts \"hello\"\n my-pi -m claude-haiku-4-5-20241022 \"explain this file\"\n XIAOMI_API_KEY=... my-pi -m xiaomi/mimo-v2.5-pro \"summarize this repo\"\n my-pi -m cloudflare-workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast \"explain this file\"\n my-pi --preset terse,no-purple-prose \"summarize this repo\"\n my-pi --system-prompt \"You are a JSON classifier. Return only JSON.\" --json \"classify this\"\n\nPROMPT PRESETS\n\n Interactive commands:\n /prompt-preset help\n /prompt-preset export-defaults\n /prompt-preset edit-global terse\n /prompt-preset base detailed\n /prompt-preset enable bullets\n\n Short alias: /preset\n\n Editable preset files:\n ~/.pi/agent/presets/*.md\n .pi/presets/*.md\n`;\n\nasync function render_rich_usage<T extends ArgsDef>(\n\tcmd: CommandDef<T>,\n\tparent?: CommandDef<T>,\n): Promise<string> {\n\treturn `${await renderUsage(cmd, parent)}\\n${HELP_APPENDIX}`;\n}\n\nasync function print_usage<T extends ArgsDef>(\n\tcmd: CommandDef<T>,\n\tparent?: CommandDef<T>,\n): Promise<void> {\n\tconsole.log(await render_rich_usage(cmd, parent));\n}\n\nconst main = defineCommand({\n\tmeta: {\n\t\tname: 'my-pi',\n\t\tversion: pkg.version,\n\t\tdescription:\n\t\t\t'Composable pi coding agent with MCP, LSP, presets, and local eval telemetry',\n\t},\n\targs: {\n\t\tprint: {\n\t\t\ttype: 'boolean',\n\t\t\talias: 'P',\n\t\t\tdescription: 'Print mode (non-interactive, one-shot)',\n\t\t\tdefault: false,\n\t\t},\n\t\t'agent-dir': {\n\t\t\ttype: 'string',\n\t\t\tdescription:\n\t\t\t\t'Override Pi auth/config/session directory for this process',\n\t\t\trequired: false,\n\t\t},\n\t\t'session-dir': {\n\t\t\ttype: 'string',\n\t\t\tdescription:\n\t\t\t\t'Override Pi session storage directory for this process',\n\t\t\trequired: false,\n\t\t},\n\t\tjson: {\n\t\t\ttype: 'boolean',\n\t\t\talias: 'j',\n\t\t\tdescription: 'Output NDJSON events (for agent consumption)',\n\t\t\tdefault: false,\n\t\t},\n\t\tmode: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Runtime mode: interactive, print, json, or rpc',\n\t\t\trequired: false,\n\t\t},\n\t\textension: {\n\t\t\ttype: 'string',\n\t\t\talias: 'e',\n\t\t\tdescription:\n\t\t\t\t'Extension path to load; repeatable via argv parsing',\n\t\t\trequired: false,\n\t\t},\n\t\t'no-builtin': {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Disable all built-in extensions',\n\t\t\tdefault: false,\n\t\t},\n\t\tuntrusted: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription:\n\t\t\t\t'Safe mode for unknown repos: skip project MCP, hooks, project prompt presets, project skills, and project LSP binaries unless explicitly re-enabled',\n\t\t\tdefault: false,\n\t\t},\n\t\t...create_builtin_disable_cli_args(),\n\t\ttelemetry: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Enable local SQLite telemetry for this process',\n\t\t\tdefault: false,\n\t\t},\n\t\t'no-telemetry': {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Disable local SQLite telemetry for this process',\n\t\t\tdefault: false,\n\t\t},\n\t\t'telemetry-db': {\n\t\t\ttype: 'string',\n\t\t\tdescription:\n\t\t\t\t'Override telemetry database path for this process',\n\t\t\trequired: false,\n\t\t},\n\t\tmodel: {\n\t\t\ttype: 'string',\n\t\t\talias: 'm',\n\t\t\tdescription:\n\t\t\t\t'Model to use (e.g. claude-sonnet-4-5-20241022, gpt-5.4, cloudflare-workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast)',\n\t\t},\n\t\tthinking: {\n\t\t\ttype: 'string',\n\t\t\tdescription:\n\t\t\t\t'Thinking level: off, minimal, low, medium, high, or xhigh',\n\t\t\trequired: false,\n\t\t},\n\t\ttools: {\n\t\t\ttype: 'string',\n\t\t\talias: 't',\n\t\t\tdescription:\n\t\t\t\t'Comma-separated allowlist of tool names to enable',\n\t\t\trequired: false,\n\t\t},\n\t\t'exclude-tools': {\n\t\t\ttype: 'string',\n\t\t\talias: 'xt',\n\t\t\tdescription: 'Comma-separated list of tool names to disable',\n\t\t\trequired: false,\n\t\t},\n\t\tsession: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Resume a specific session file or session ID',\n\t\t\trequired: false,\n\t\t},\n\t\t'session-id': {\n\t\t\ttype: 'string',\n\t\t\tdescription:\n\t\t\t\t'Create or resume an exact project-local session ID',\n\t\t\trequired: false,\n\t\t},\n\t\tname: {\n\t\t\ttype: 'string',\n\t\t\talias: 'n',\n\t\t\tdescription: 'Set the session display name at startup',\n\t\t\trequired: false,\n\t\t},\n\t\tskill: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Skill name to allow; repeatable in argv parsing',\n\t\t\trequired: false,\n\t\t},\n\t\t'system-prompt': {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Replace the base system prompt',\n\t\t\trequired: false,\n\t\t},\n\t\t'append-system-prompt': {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Append one-off instructions to the system prompt',\n\t\t\trequired: false,\n\t\t},\n\t\tprompt: {\n\t\t\ttype: 'string',\n\t\t\talias: 'p',\n\t\t\tdescription: 'Prompt text (alternative to positional argument)',\n\t\t\trequired: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst cwd = process.cwd();\n\t\tconst parsed_extension_cli = parse_extension_cli_args(\n\t\t\tprocess.argv.slice(2),\n\t\t\tmain.args as CliArgDefinitions,\n\t\t);\n\t\tif (parsed_extension_cli.diagnostics.length) {\n\t\t\tfor (const message of parsed_extension_cli.diagnostics)\n\t\t\t\tconsole.error(`Error: ${message}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst extension_paths = parse_extension_paths(process.argv, cwd);\n\t\tconst selected_tools = parse_tool_allowlist(process.argv);\n\t\tconst excluded_tools = parse_tool_excludelist(process.argv);\n\t\tconst selected_skills = parse_skill_allowlist(process.argv);\n\t\tlet selected_thinking;\n\t\ttry {\n\t\t\tselected_thinking = parse_thinking_level(args.thinking);\n\t\t} catch (error) {\n\t\t\tconsole.error(\n\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tlet runtime_mode: 'interactive' | 'print' | 'json' | 'rpc' =\n\t\t\t'interactive';\n\t\tif (args.mode) {\n\t\t\tconst requested = String(args.mode).trim().toLowerCase();\n\t\t\tif (\n\t\t\t\t!['interactive', 'print', 'json', 'rpc'].includes(requested)\n\t\t\t) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t'Error: --mode must be one of interactive, print, json, rpc.',\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\truntime_mode = requested as\n\t\t\t\t| 'interactive'\n\t\t\t\t| 'print'\n\t\t\t\t| 'json'\n\t\t\t\t| 'rpc';\n\t\t}\n\t\tif (args.json) runtime_mode = 'json';\n\t\telse if (args.print) runtime_mode = 'print';\n\n\t\tconst positionals = parsed_extension_cli.positionals;\n\t\tif (positionals?.[0] === 'observability') {\n\t\t\tconst { start_observability_server } =\n\t\t\t\tawait import('@spences10/pi-observability/server');\n\t\t\tstart_observability_server();\n\t\t\treturn;\n\t\t}\n\n\t\t// Resolve prompt: named --prompt flag > positional > stdin\n\t\tlet prompt = args.prompt;\n\t\tif (!prompt && positionals && positionals.length > 0) {\n\t\t\tprompt = positionals[0];\n\t\t}\n\t\tif (!prompt && !process.stdin.isTTY && runtime_mode !== 'rpc') {\n\t\t\tprompt = await read_stdin();\n\t\t}\n\t\tif (prompt && runtime_mode === 'interactive')\n\t\t\truntime_mode = 'print';\n\n\t\tif (\n\t\t\t!args.print &&\n\t\t\t!args.json &&\n\t\t\truntime_mode !== 'rpc' &&\n\t\t\t!prompt &&\n\t\t\t!process.stdout.isTTY\n\t\t) {\n\t\t\tawait print_usage(main);\n\t\t\treturn;\n\t\t}\n\n\t\t// Startup feedback so silence = broken (issue #3)\n\t\tif (runtime_mode !== 'interactive') {\n\t\t\tprocess.stderr.write(\n\t\t\t\t`my-pi: connecting to ${args.model || 'default model'}...\\n`,\n\t\t\t);\n\t\t}\n\n\t\tif (args.telemetry && args['no-telemetry']) {\n\t\t\tconsole.error(\n\t\t\t\t'Error: --telemetry and --no-telemetry cannot be used together.',\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tif (args.session && args['session-id']) {\n\t\t\tconsole.error(\n\t\t\t\t'Error: --session and --session-id cannot be used together.',\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tlet telemetry_override: boolean | undefined;\n\t\tif (args.telemetry) {\n\t\t\ttelemetry_override = true;\n\t\t} else if (args['no-telemetry']) {\n\t\t\ttelemetry_override = false;\n\t\t}\n\n\t\tconst [\n\t\t\t{ create_my_pi },\n\t\t\t{ InteractiveMode, runPrintMode, runRpcMode },\n\t\t] = await Promise.all([\n\t\t\timport('./api.js'),\n\t\t\timport('@earendil-works/pi-coding-agent'),\n\t\t]);\n\n\t\tconst runtime = await create_my_pi({\n\t\t\tcwd,\n\t\t\tagent_dir: args['agent-dir'],\n\t\t\tsession_dir: args['session-dir'],\n\t\t\textensions: extension_paths,\n\t\t\textension_flag_values:\n\t\t\t\tparsed_extension_cli.extension_flag_values,\n\t\t\truntime_mode,\n\t\t\t...resolve_builtin_extension_options(args),\n\t\t\ttelemetry: telemetry_override,\n\t\t\ttelemetry_db_path: args['telemetry-db'],\n\t\t\tmodel: args.model,\n\t\t\tthinking: selected_thinking,\n\t\t\tselected_tools,\n\t\t\texcluded_tools,\n\t\t\tselected_skills,\n\t\t\tsession: args.session,\n\t\t\tsession_id: args['session-id'],\n\t\t\tstartup_session_name: args.name,\n\t\t\tsystem_prompt: args['system-prompt'],\n\t\t\tappend_system_prompt: args['append-system-prompt'],\n\t\t\tuntrusted_repo: args.untrusted,\n\t\t});\n\n\t\tfor (const diagnostic of runtime.diagnostics) {\n\t\t\tconst prefix =\n\t\t\t\tdiagnostic.type === 'error'\n\t\t\t\t\t? 'Error: '\n\t\t\t\t\t: diagnostic.type === 'warning'\n\t\t\t\t\t\t? 'Warning: '\n\t\t\t\t\t\t: '';\n\t\t\tconsole.error(`${prefix}${diagnostic.message}`);\n\t\t}\n\t\tif (\n\t\t\truntime.diagnostics.some(\n\t\t\t\t(diagnostic) => diagnostic.type === 'error',\n\t\t\t)\n\t\t) {\n\t\t\tawait runtime.dispose();\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (runtime_mode === 'rpc') {\n\t\t\tawait runRpcMode(runtime);\n\t\t} else if (args.print || args.json || prompt) {\n\t\t\tlet output_mode: 'json' | 'text' = 'text';\n\t\t\tif (args.json) {\n\t\t\t\toutput_mode = 'json';\n\t\t\t}\n\t\t\tconst code = await runPrintMode(runtime, {\n\t\t\t\tmode: output_mode,\n\t\t\t\tinitialMessage: prompt || '',\n\t\t\t\tinitialImages: [],\n\t\t\t\tmessages: [],\n\t\t\t});\n\t\t\tprocess.exit(code);\n\t\t} else if (!process.stdout.isTTY) {\n\t\t\tawait print_usage(main);\n\t\t} else {\n\t\t\tawait run_interactive_mode(runtime, InteractiveMode);\n\t\t}\n\t},\n});\n\nvoid runMain(main, {\n\tshowUsage: async (cmd, parent) => {\n\t\tawait print_usage(cmd, parent);\n\t},\n});\n"],"mappings":";;;;;;;AAMA,MAAM,kCAAkB,IAAI,IAAI;CAC/B;CACA;CACA;CACA;CACA;CACA;AACD,CAAC;AAgCD,SAAgB,kCAAyD;CACxE,OAAO,OAAO,YACb,mBAAmB,KAAK,cAAc,CACrC,UAAU,SACV;EACC,MAAM;EACN,aAAa,UAAU;EACvB,SAAS;CACV,CACD,CAAC,CACF;AACD;AAEA,SAAS,qBACR,MACA,SACU;CACV,IAAI,KAAK,UAAU,OAAO;CAE1B,MAAM,iBAAiB,QAAQ,QAAQ,QAAQ,EAAE;CACjD,MAAM,iBAAiB,eAAe,QACrC,cACC,GAAG,SAAS,OAAO,IAAI,CAAC,CAAC,YAAY,CACvC;CACA,OACC,KAAK,oBAAoB,SAAS,KAAK,oBAAoB;AAE7D;AAEA,SAAgB,kCACf,MACuD;CACvD,MAAM,aAAa,qBAAqB,MAAM,YAAY;CAC1D,OAAO,OAAO,YACb,mBAAmB,KAAK,cAAc,CACrC,UAAU,aACV,CAAC,cAAc,CAAC,qBAAqB,MAAM,UAAU,OAAO,CAC7D,CAAC,CACF;AACD;AAEA,SAAgB,yBACf,MACA,YACyB;CACzB,MAAM,8BAAc,IAAI,IAAsC;CAC9D,KAAK,MAAM,CAAC,MAAM,eAAe,OAAO,QAAQ,UAAU,GAAG;EAC5D,YAAY,IAAI,KAAK,QAAQ,WAAW,IAAI;EAC5C,MAAM,aAAa,KAAK,QAAQ,cAAc,GAAG,SAChD,OAAO,IAAI,CAAC,CAAC,YAAY,CAC1B;EACA,YAAY,IAAI,KAAK,cAAc,WAAW,IAAI;EAClD,IAAI,WAAW,SAAS,WACvB,YAAY,IAAI,QAAQ,QAAQ,WAAW,IAAI;EAChD,MAAM,UAAU,MAAM,QAAQ,WAAW,KAAK,IAC3C,WAAW,QACX,WAAW,QACV,CAAC,WAAW,KAAK,IACjB,CAAC;EACL,KAAK,MAAM,SAAS,SACnB,YAAY,IAAI,IAAI,SAAS,WAAW,IAAI;CAC9C;CAEA,MAAM,wCAAwB,IAAI,IAA8B;CAChE,MAAM,cAAwB,CAAC;CAC/B,MAAM,cAAwB,CAAC;CAE/B,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;EACrC,MAAM,MAAM,KAAK;EACjB,IAAI,CAAC,KAAK;EACV,IAAI,QAAQ,MAAM;GACjB,YAAY,KAAK,GAAG,KAAK,MAAM,IAAI,CAAC,CAAC;GACrC;EACD;EAEA,MAAM,eAAe,IAAI,QAAQ,GAAG;EACpC,MAAM,aACL,iBAAiB,KAAK,MAAM,IAAI,MAAM,GAAG,YAAY;EACtD,MAAM,aAAa,YAAY,IAAI,UAAU;EAC7C,IAAI,YAAY;GACf,IACC,iBAAiB,OAChB,eAAe,YAAY,eAAe,WAC3C,IAAI,IAAI,KAAK,QAEb,KAAK;GAEN;EACD;EAEA,IAAI,IAAI,WAAW,IAAI,GAAG;GACzB,IAAI,iBAAiB,IAAI;IACxB,sBAAsB,IACrB,IAAI,MAAM,GAAG,YAAY,GACzB,IAAI,MAAM,eAAe,CAAC,CAC3B;IACA;GACD;GACA,MAAM,OAAO,IAAI,MAAM,CAAC;GACxB,MAAM,OAAO,KAAK,IAAI;GACtB,IACC,SAAS,KAAA,KACT,CAAC,KAAK,WAAW,GAAG,KACpB,CAAC,KAAK,WAAW,GAAG,GACnB;IACD,sBAAsB,IAAI,MAAM,IAAI;IACpC,KAAK;GACN,OACC,sBAAsB,IAAI,MAAM,IAAI;GAErC;EACD;EAEA,IAAI,IAAI,WAAW,GAAG,GAAG;GACxB,YAAY,KAAK,mBAAmB,KAAK;GACzC;EACD;EACA,YAAY,KAAK,GAAG;CACrB;CAEA,OAAO;EAAE;EAAuB;EAAa;CAAY;AAC1D;AAEA,SAAgB,oBACf,MACA,OACW;CACX,MAAM,SAAmB,CAAC;CAC1B,MAAM,WAAW,IAAI,IAAI,KAAK;CAE9B,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;EACrC,MAAM,MAAM,KAAK;EACjB,IAAI,CAAC,KAAK;EAEV,MAAM,eAAe,IAAI,QAAQ,GAAG;EACpC,IAAI,iBAAiB,IAAI;GACxB,MAAM,OAAO,IAAI,MAAM,GAAG,YAAY;GACtC,IAAI,SAAS,IAAI,IAAI,GACpB,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC,CAAC;GAExC;EACD;EAEA,IAAI,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,QAAQ;GAC7C,MAAM,OAAO,KAAK,IAAI;GACtB,IAAI,SAAS,KAAA,GAAW;IACvB,OAAO,KAAK,IAAI;IAChB,KAAK;GACN;EACD;CACD;CAEA,OAAO;AACR;AAEA,SAAgB,sBACf,MACA,MAAM,QAAQ,IAAI,GACP;CACX,OAAO,oBAAoB,MAAM,CAAC,MAAM,aAAa,CAAC,CAAC,CACrD,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAC1B,OAAO,OAAO,CAAC,CACf,KAAK,SAAS,QAAQ,KAAK,IAAI,CAAC;AACnC;AAEA,SAAS,uBACR,MACA,OACuB;CACvB,MAAM,SAAS,oBAAoB,MAAM,KAAK,CAAC,CAC7C,SAAS,UAAU,MAAM,MAAM,GAAG,CAAC,CAAC,CACpC,KAAK,UAAU,MAAM,KAAK,CAAC,CAAC,CAC5B,OAAO,OAAO;CAChB,OAAO,OAAO,SAAS,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,IAAI,KAAA;AAC/C;AAEA,SAAgB,qBACf,MACuB;CACvB,OAAO,uBAAuB,MAAM,CAAC,WAAW,IAAI,CAAC;AACtD;AAEA,SAAgB,uBACf,MACuB;CACvB,OAAO,uBAAuB,MAAM,CAAC,mBAAmB,KAAK,CAAC;AAC/D;AAEA,SAAgB,sBACf,MACuB;CACvB,OAAO,uBAAuB,MAAM,CAAC,SAAS,CAAC;AAChD;AAEA,SAAgB,qBACf,OAC+B;CAC/B,MAAM,aAAa,OAAO,KAAK,CAAC,CAAC,YAAY;CAC7C,IAAI,CAAC,YAAY,OAAO,KAAA;CACxB,IAAI,CAAC,gBAAgB,IAAI,UAAU,GAClC,MAAM,IAAI,MACT,oEACD;CAED,OAAO;AACR;;;AC1PA,MAAa,uBAAuB;AAEpC,SAAS,mBACR,SACuC;CACvC,MAAM,QAAQ,qCAAqC,KAAK,OAAO;CAC/D,IAAI,CAAC,OAAO,OAAO,KAAA;CACnB,OAAO;EAAC,OAAO,MAAM,EAAE;EAAG,OAAO,MAAM,EAAE;EAAG,OAAO,MAAM,EAAE;CAAC;AAC7D;AAEA,SAAgB,0BAA0B,SAA0B;CACnE,MAAM,UAAU,mBAAmB,OAAO;CAC1C,MAAM,UAAU,mBAAmB,oBAAoB;CACvD,IAAI,CAAC,WAAW,CAAC,SAAS,OAAO;CAEjC,KAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS;EACpD,IAAI,QAAQ,SAAS,QAAQ,QAAQ,OAAO;EAC5C,IAAI,QAAQ,SAAS,QAAQ,QAAQ,OAAO;CAC7C;CACA,OAAO;AACR;AAEA,SAAgB,yBACf,kBAAkB,QAAQ,SAAS,MACd;CACrB,IAAI,0BAA0B,eAAe,GAAG,OAAO,KAAA;CACvD,OAAO,yBAAyB,qBAAqB,uBAAuB,gBAAgB;AAC7F;;;AC3BA,MAAM,8BACL;AACD,MAAM,mBAAmB,OAAO,IAC/B,uCACD;AACA,MAAM,wBAAwB,OAAO,IACpC,6BACD;AAOA,SAAgB,wBAAwB,SAAyB;CAChE,OACC,QAAQ,SAAS,yBACjB,QAAQ,QAAQ,SAAS,2BAA2B;AAEtD;AAEA,SAAS,kCAAkC,MAA0B;CACpE,MAAM,CAAC,SAAS,mBAAmB;CACnC,IAAI,mBAAmB,OACtB,OAAO,wBAAwB,OAAO;CAOvC,QALC,OAAO,oBAAoB,WACxB,kBACA,mBAAmB,OAAO,oBAAoB,WAC5C,gBAAuC,OACxC,KAAA,OAEa,yBACjB,OAAO,OAAO,CAAC,CAAC,SAAS,2BAA2B;AAEtD;AAEA,SAAgB,8BACf,eAA+B,SACxB;CACP,IAAI,aAAa,mBAAmB;CACpC,aAAa,oBAAoB;CAEjC,MAAM,wBACL,aAAa,0BAA0B,aAAa;CACrD,aAAa,yBAAyB;CAEtC,aAAa,cAAc,SAAS,sBAEnC,GAAG,MACF;EACD,IAAI,kCAAkC,IAAI,GAAG;EAC7C,OACC,sBACC,MAAM,MAAM,IAAI;CACnB;AACD;;;AC9BA,MAAM,uBAAuB,yBAAyB;AACtD,IAAI,sBAAsB;CACzB,QAAQ,MAAM,oBAAoB;CAClC,QAAQ,KAAK,CAAC;AACf;AAEA,8BAA8B;AAE9B,MAAM,YAAY,QAAQ,cAAc,YAAY,GAAG,CAAC;AACxD,MAAM,eAAe,KAAK,WAAW,IAAI;AACzC,MAAM,MAAM,KAAK,MAChB,aAAa,KAAK,cAAc,cAAc,GAAG,OAAO,CACzD;AAIA,IAAI,CAAC,WAAW,KAAK,cAAc,MAAM,CAAC,GACzC,QAAQ,IAAI,0BAA0B;AAGvC,eAAe,aAA8B;CAC5C,MAAM,SAAmB,CAAC;CAC1B,WAAW,MAAM,SAAS,QAAQ,OACjC,OAAO,KAAK,KAAe;CAE5B,OAAO,OAAO,OAAO,MAAM,CAAC,CAAC,SAAS,OAAO,CAAC,CAAC,KAAK;AACrD;AAQA,eAAe,qBACd,SACA,sBACgB;CAChB,MAAM,iBAAiB,QAAQ,OAAO,MAAM,KAAK,QAAQ,MAAM;CAC/D,QAAQ,OAAO,UACd,OACA,GAAG,SACC;EACJ,IAAI,OAAO,UAAU,UAAU;GAE9B,MAAM,cAAc,IAAI,OACvB,2BAFc,OAAO,aAAa,EAEF,EAAE,+BAClC,GACD;GACA,QAAQ,MAAM,QAAQ,aAAa,WAAW;GAC9C,QAAQ,MAAM,QACb,8CACA,WACD;EACD;EACA,OAAO,QAAQ,MAAM,gBAAgB,QAAQ,QAAQ,CACpD,OACA,GAAG,IACJ,CAAC;CACF;CACA,IAAI;EAQH,MAAM,IAPW,qBAAqB,SAAS;GAC9C,mBAAmB,CAAC;GACpB,sBAAsB,KAAA;GACtB,gBAAgB,KAAA;GAChB,eAAe,CAAC;GAChB,iBAAiB,CAAC;EACnB,CACS,CAAC,CAAC,IAAI;CAChB,UAAU;EACT,QAAQ,OAAO,QACd;CACF;AACD;AAEA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgEtB,eAAe,kBACd,KACA,QACkB;CAClB,OAAO,GAAG,MAAM,YAAY,KAAK,MAAM,EAAE,IAAI;AAC9C;AAEA,eAAe,YACd,KACA,QACgB;CAChB,QAAQ,IAAI,MAAM,kBAAkB,KAAK,MAAM,CAAC;AACjD;AAEA,MAAM,OAAO,cAAc;CAC1B,MAAM;EACL,MAAM;EACN,SAAS,IAAI;EACb,aACC;CACF;CACA,MAAM;EACL,OAAO;GACN,MAAM;GACN,OAAO;GACP,aAAa;GACb,SAAS;EACV;EACA,aAAa;GACZ,MAAM;GACN,aACC;GACD,UAAU;EACX;EACA,eAAe;GACd,MAAM;GACN,aACC;GACD,UAAU;EACX;EACA,MAAM;GACL,MAAM;GACN,OAAO;GACP,aAAa;GACb,SAAS;EACV;EACA,MAAM;GACL,MAAM;GACN,aAAa;GACb,UAAU;EACX;EACA,WAAW;GACV,MAAM;GACN,OAAO;GACP,aACC;GACD,UAAU;EACX;EACA,cAAc;GACb,MAAM;GACN,aAAa;GACb,SAAS;EACV;EACA,WAAW;GACV,MAAM;GACN,aACC;GACD,SAAS;EACV;EACA,GAAG,gCAAgC;EACnC,WAAW;GACV,MAAM;GACN,aAAa;GACb,SAAS;EACV;EACA,gBAAgB;GACf,MAAM;GACN,aAAa;GACb,SAAS;EACV;EACA,gBAAgB;GACf,MAAM;GACN,aACC;GACD,UAAU;EACX;EACA,OAAO;GACN,MAAM;GACN,OAAO;GACP,aACC;EACF;EACA,UAAU;GACT,MAAM;GACN,aACC;GACD,UAAU;EACX;EACA,OAAO;GACN,MAAM;GACN,OAAO;GACP,aACC;GACD,UAAU;EACX;EACA,iBAAiB;GAChB,MAAM;GACN,OAAO;GACP,aAAa;GACb,UAAU;EACX;EACA,SAAS;GACR,MAAM;GACN,aAAa;GACb,UAAU;EACX;EACA,cAAc;GACb,MAAM;GACN,aACC;GACD,UAAU;EACX;EACA,MAAM;GACL,MAAM;GACN,OAAO;GACP,aAAa;GACb,UAAU;EACX;EACA,OAAO;GACN,MAAM;GACN,aAAa;GACb,UAAU;EACX;EACA,iBAAiB;GAChB,MAAM;GACN,aAAa;GACb,UAAU;EACX;EACA,wBAAwB;GACvB,MAAM;GACN,aAAa;GACb,UAAU;EACX;EACA,QAAQ;GACP,MAAM;GACN,OAAO;GACP,aAAa;GACb,UAAU;EACX;CACD;CACA,MAAM,IAAI,EAAE,QAAQ;EACnB,MAAM,MAAM,QAAQ,IAAI;EACxB,MAAM,uBAAuB,yBAC5B,QAAQ,KAAK,MAAM,CAAC,GACpB,KAAK,IACN;EACA,IAAI,qBAAqB,YAAY,QAAQ;GAC5C,KAAK,MAAM,WAAW,qBAAqB,aAC1C,QAAQ,MAAM,UAAU,SAAS;GAClC,QAAQ,KAAK,CAAC;EACf;EACA,MAAM,kBAAkB,sBAAsB,QAAQ,MAAM,GAAG;EAC/D,MAAM,iBAAiB,qBAAqB,QAAQ,IAAI;EACxD,MAAM,iBAAiB,uBAAuB,QAAQ,IAAI;EAC1D,MAAM,kBAAkB,sBAAsB,QAAQ,IAAI;EAC1D,IAAI;EACJ,IAAI;GACH,oBAAoB,qBAAqB,KAAK,QAAQ;EACvD,SAAS,OAAO;GACf,QAAQ,MACP,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACtD;GACA,QAAQ,KAAK,CAAC;EACf;EAEA,IAAI,eACH;EACD,IAAI,KAAK,MAAM;GACd,MAAM,YAAY,OAAO,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY;GACvD,IACC,CAAC;IAAC;IAAe;IAAS;IAAQ;GAAK,CAAC,CAAC,SAAS,SAAS,GAC1D;IACD,QAAQ,MACP,6DACD;IACA,QAAQ,KAAK,CAAC;GACf;GACA,eAAe;EAKhB;EACA,IAAI,KAAK,MAAM,eAAe;OACzB,IAAI,KAAK,OAAO,eAAe;EAEpC,MAAM,cAAc,qBAAqB;EACzC,IAAI,cAAc,OAAO,iBAAiB;GACzC,MAAM,EAAE,+BACP,MAAM,OAAO;GACd,2BAA2B;GAC3B;EACD;EAGA,IAAI,SAAS,KAAK;EAClB,IAAI,CAAC,UAAU,eAAe,YAAY,SAAS,GAClD,SAAS,YAAY;EAEtB,IAAI,CAAC,UAAU,CAAC,QAAQ,MAAM,SAAS,iBAAiB,OACvD,SAAS,MAAM,WAAW;EAE3B,IAAI,UAAU,iBAAiB,eAC9B,eAAe;EAEhB,IACC,CAAC,KAAK,SACN,CAAC,KAAK,QACN,iBAAiB,SACjB,CAAC,UACD,CAAC,QAAQ,OAAO,OACf;GACD,MAAM,YAAY,IAAI;GACtB;EACD;EAGA,IAAI,iBAAiB,eACpB,QAAQ,OAAO,MACd,wBAAwB,KAAK,SAAS,gBAAgB,MACvD;EAGD,IAAI,KAAK,aAAa,KAAK,iBAAiB;GAC3C,QAAQ,MACP,gEACD;GACA,QAAQ,KAAK,CAAC;EACf;EACA,IAAI,KAAK,WAAW,KAAK,eAAe;GACvC,QAAQ,MACP,4DACD;GACA,QAAQ,KAAK,CAAC;EACf;EAEA,IAAI;EACJ,IAAI,KAAK,WACR,qBAAqB;OACf,IAAI,KAAK,iBACf,qBAAqB;EAGtB,MAAM,CACL,EAAE,gBACF,EAAE,iBAAiB,cAAc,gBAC9B,MAAM,QAAQ,IAAI,CACrB,OAAO,aACP,OAAO,kCACR,CAAC;EAED,MAAM,UAAU,MAAM,aAAa;GAClC;GACA,WAAW,KAAK;GAChB,aAAa,KAAK;GAClB,YAAY;GACZ,uBACC,qBAAqB;GACtB;GACA,GAAG,kCAAkC,IAAI;GACzC,WAAW;GACX,mBAAmB,KAAK;GACxB,OAAO,KAAK;GACZ,UAAU;GACV;GACA;GACA;GACA,SAAS,KAAK;GACd,YAAY,KAAK;GACjB,sBAAsB,KAAK;GAC3B,eAAe,KAAK;GACpB,sBAAsB,KAAK;GAC3B,gBAAgB,KAAK;EACtB,CAAC;EAED,KAAK,MAAM,cAAc,QAAQ,aAAa;GAC7C,MAAM,SACL,WAAW,SAAS,UACjB,YACA,WAAW,SAAS,YACnB,cACA;GACL,QAAQ,MAAM,GAAG,SAAS,WAAW,SAAS;EAC/C;EACA,IACC,QAAQ,YAAY,MAClB,eAAe,WAAW,SAAS,OACrC,GACC;GACD,MAAM,QAAQ,QAAQ;GACtB,QAAQ,KAAK,CAAC;EACf;EAEA,IAAI,iBAAiB,OACpB,MAAM,WAAW,OAAO;OAClB,IAAI,KAAK,SAAS,KAAK,QAAQ,QAAQ;GAC7C,IAAI,cAA+B;GACnC,IAAI,KAAK,MACR,cAAc;GAEf,MAAM,OAAO,MAAM,aAAa,SAAS;IACxC,MAAM;IACN,gBAAgB,UAAU;IAC1B,eAAe,CAAC;IAChB,UAAU,CAAC;GACZ,CAAC;GACD,QAAQ,KAAK,IAAI;EAClB,OAAO,IAAI,CAAC,QAAQ,OAAO,OAC1B,MAAM,YAAY,IAAI;OAEtB,MAAM,qBAAqB,SAAS,eAAe;CAErD;AACD,CAAC;AAEI,QAAQ,MAAM,EAClB,WAAW,OAAO,KAAK,WAAW;CACjC,MAAM,YAAY,KAAK,MAAM;AAC9B,EACD,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/cli-args.ts","../src/runtime-preflight.ts","../src/warnings.ts","../src/index.ts"],"sourcesContent":["import { resolve } from 'node:path';\nimport {\n\tBUILTIN_EXTENSIONS,\n\ttype BuiltinExtensionOptionName,\n} from './extensions/builtin-registry.js';\n\nconst THINKING_LEVELS = new Set([\n\t'off',\n\t'minimal',\n\t'low',\n\t'medium',\n\t'high',\n\t'xhigh',\n]);\n\nexport type CliThinkingLevel =\n\t| 'off'\n\t| 'minimal'\n\t| 'low'\n\t| 'medium'\n\t| 'high'\n\t| 'xhigh';\n\nexport type BuiltinDisableCliArgs = Record<\n\tstring,\n\t{\n\t\ttype: 'boolean';\n\t\tdescription: string;\n\t\tdefault: false;\n\t}\n>;\n\nexport interface CliArgDefinition {\n\ttype: 'boolean' | 'string' | 'enum' | 'positional';\n\talias?: string | readonly string[];\n}\n\nexport type CliArgDefinitions = Record<string, CliArgDefinition>;\n\nexport interface ParsedExtensionCliArgs {\n\textension_flag_values: Map<string, boolean | string>;\n\tpositionals: string[];\n\tdiagnostics: string[];\n}\n\nexport function create_builtin_disable_cli_args(): BuiltinDisableCliArgs {\n\treturn Object.fromEntries(\n\t\tBUILTIN_EXTENSIONS.map((extension) => [\n\t\t\textension.cli_arg,\n\t\t\t{\n\t\t\t\ttype: 'boolean' as const,\n\t\t\t\tdescription: extension.cli_description,\n\t\t\t\tdefault: false as const,\n\t\t\t},\n\t\t]),\n\t);\n}\n\nfunction is_citty_no_flag_set(\n\targs: Record<string, unknown>,\n\tcli_arg: string,\n): boolean {\n\tif (args[cli_arg]) return true;\n\n\tconst positive_kebab = cli_arg.replace(/^no-/, '');\n\tconst positive_camel = positive_kebab.replace(\n\t\t/-([a-z])/g,\n\t\t(_, char) => String(char).toUpperCase(),\n\t);\n\treturn (\n\t\targs[positive_kebab] === false || args[positive_camel] === false\n\t);\n}\n\nexport function resolve_builtin_extension_options(\n\targs: Record<string, unknown>,\n): Partial<Record<BuiltinExtensionOptionName, boolean>> {\n\tconst no_builtin = is_citty_no_flag_set(args, 'no-builtin');\n\treturn Object.fromEntries(\n\t\tBUILTIN_EXTENSIONS.map((extension) => [\n\t\t\textension.option_name,\n\t\t\t!no_builtin &&\n\t\t\t\t!is_citty_no_flag_set(args, extension.cli_arg) &&\n\t\t\t\textension.default_enabled,\n\t\t]),\n\t) as Partial<Record<BuiltinExtensionOptionName, boolean>>;\n}\n\nexport function parse_extension_cli_args(\n\targv: string[],\n\tknown_args: CliArgDefinitions,\n): ParsedExtensionCliArgs {\n\tconst known_flags = new Map<string, CliArgDefinition['type']>();\n\tfor (const [name, definition] of Object.entries(known_args)) {\n\t\tknown_flags.set(`--${name}`, definition.type);\n\t\tconst camel_name = name.replace(/-([a-z])/g, (_, char) =>\n\t\t\tString(char).toUpperCase(),\n\t\t);\n\t\tknown_flags.set(`--${camel_name}`, definition.type);\n\t\tif (definition.type === 'boolean')\n\t\t\tknown_flags.set(`--no-${name}`, definition.type);\n\t\tconst aliases = Array.isArray(definition.alias)\n\t\t\t? definition.alias\n\t\t\t: definition.alias\n\t\t\t\t? [definition.alias]\n\t\t\t\t: [];\n\t\tfor (const alias of aliases)\n\t\t\tknown_flags.set(`-${alias}`, definition.type);\n\t}\n\n\tconst extension_flag_values = new Map<string, boolean | string>();\n\tconst positionals: string[] = [];\n\tconst diagnostics: string[] = [];\n\n\tfor (let i = 0; i < argv.length; i++) {\n\t\tconst arg = argv[i];\n\t\tif (!arg) continue;\n\t\tif (arg === '--') {\n\t\t\tpositionals.push(...argv.slice(i + 1));\n\t\t\tbreak;\n\t\t}\n\n\t\tconst equals_index = arg.indexOf('=');\n\t\tconst flag_token =\n\t\t\tequals_index === -1 ? arg : arg.slice(0, equals_index);\n\t\tconst known_type = known_flags.get(flag_token);\n\t\tif (known_type) {\n\t\t\tif (\n\t\t\t\tequals_index === -1 &&\n\t\t\t\t(known_type === 'string' || known_type === 'enum') &&\n\t\t\t\ti + 1 < argv.length\n\t\t\t) {\n\t\t\t\ti += 1;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg.startsWith('--')) {\n\t\t\tif (equals_index !== -1) {\n\t\t\t\textension_flag_values.set(\n\t\t\t\t\targ.slice(2, equals_index),\n\t\t\t\t\targ.slice(equals_index + 1),\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst name = arg.slice(2);\n\t\t\tconst next = argv[i + 1];\n\t\t\tif (\n\t\t\t\tnext !== undefined &&\n\t\t\t\t!next.startsWith('-') &&\n\t\t\t\t!next.startsWith('@')\n\t\t\t) {\n\t\t\t\textension_flag_values.set(name, next);\n\t\t\t\ti += 1;\n\t\t\t} else {\n\t\t\t\textension_flag_values.set(name, true);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg.startsWith('-')) {\n\t\t\tdiagnostics.push(`Unknown option: ${arg}`);\n\t\t\tcontinue;\n\t\t}\n\t\tpositionals.push(arg);\n\t}\n\n\treturn { extension_flag_values, positionals, diagnostics };\n}\n\nexport function collect_flag_values(\n\targv: string[],\n\tflags: readonly string[],\n): string[] {\n\tconst values: string[] = [];\n\tconst flag_set = new Set(flags);\n\n\tfor (let i = 0; i < argv.length; i++) {\n\t\tconst arg = argv[i];\n\t\tif (!arg) continue;\n\n\t\tconst equals_index = arg.indexOf('=');\n\t\tif (equals_index !== -1) {\n\t\t\tconst name = arg.slice(0, equals_index);\n\t\t\tif (flag_set.has(name)) {\n\t\t\t\tvalues.push(arg.slice(equals_index + 1));\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (flag_set.has(arg) && i + 1 < argv.length) {\n\t\t\tconst next = argv[i + 1];\n\t\t\tif (next !== undefined) {\n\t\t\t\tvalues.push(next);\n\t\t\t\ti += 1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn values;\n}\n\nexport function parse_extension_paths(\n\targv: string[],\n\tcwd = process.cwd(),\n): string[] {\n\treturn collect_flag_values(argv, ['-e', '--extension'])\n\t\t.map((path) => path.trim())\n\t\t.filter(Boolean)\n\t\t.map((path) => resolve(cwd, path));\n}\n\nfunction parse_comma_list_flags(\n\targv: string[],\n\tflags: readonly string[],\n): string[] | undefined {\n\tconst values = collect_flag_values(argv, flags)\n\t\t.flatMap((value) => value.split(','))\n\t\t.map((value) => value.trim())\n\t\t.filter(Boolean);\n\treturn values.length ? [...new Set(values)] : undefined;\n}\n\nexport function parse_tool_allowlist(\n\targv: string[],\n): string[] | undefined {\n\treturn parse_comma_list_flags(argv, ['--tools', '-t']);\n}\n\nexport function parse_tool_excludelist(\n\targv: string[],\n): string[] | undefined {\n\treturn parse_comma_list_flags(argv, ['--exclude-tools', '-xt']);\n}\n\nexport function parse_skill_allowlist(\n\targv: string[],\n): string[] | undefined {\n\treturn parse_comma_list_flags(argv, ['--skill']);\n}\n\nexport function parse_thinking_level(\n\tvalue: string | undefined,\n): CliThinkingLevel | undefined {\n\tconst normalized = value?.trim().toLowerCase();\n\tif (!normalized) return undefined;\n\tif (!THINKING_LEVELS.has(normalized)) {\n\t\tthrow new Error(\n\t\t\t'--thinking must be one of: off, minimal, low, medium, high, xhigh.',\n\t\t);\n\t}\n\treturn normalized as CliThinkingLevel;\n}\n","export const MINIMUM_NODE_VERSION = '24.15.0';\n\nfunction parse_node_version(\n\tversion: string,\n): [number, number, number] | undefined {\n\tconst match = /^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:[-+].*)?$/.exec(version);\n\tif (!match) return undefined;\n\treturn [Number(match[1]), Number(match[2]), Number(match[3])];\n}\n\nexport function is_supported_node_version(version: string): boolean {\n\tconst current = parse_node_version(version);\n\tconst minimum = parse_node_version(MINIMUM_NODE_VERSION);\n\tif (!current || !minimum) return false;\n\n\tfor (let index = 0; index < current.length; index++) {\n\t\tif (current[index] > minimum[index]) return true;\n\t\tif (current[index] < minimum[index]) return false;\n\t}\n\treturn true;\n}\n\nexport function get_node_preflight_error(\n\tcurrent_version = process.versions.node,\n): string | undefined {\n\tif (is_supported_node_version(current_version)) return undefined;\n\treturn `my-pi requires Node >=${MINIMUM_NODE_VERSION}; current version is ${current_version}. Upgrade Node and retry.`;\n}\n","const SQLITE_EXPERIMENTAL_WARNING =\n\t'SQLite is an experimental feature';\nconst FILTER_INSTALLED = Symbol.for(\n\t'my-pi.sqlite-warning-filter-installed',\n);\nconst ORIGINAL_EMIT_WARNING = Symbol.for(\n\t'my-pi.original-emit-warning',\n);\n\ntype WarningEmitter = Pick<typeof process, 'emitWarning'> & {\n\t[FILTER_INSTALLED]?: boolean;\n\t[ORIGINAL_EMIT_WARNING]?: typeof process.emitWarning;\n};\n\nexport function should_suppress_warning(warning: Error): boolean {\n\treturn (\n\t\twarning.name === 'ExperimentalWarning' &&\n\t\twarning.message.includes(SQLITE_EXPERIMENTAL_WARNING)\n\t);\n}\n\nfunction should_suppress_emit_warning_args(args: unknown[]): boolean {\n\tconst [warning, options_or_type] = args;\n\tif (warning instanceof Error)\n\t\treturn should_suppress_warning(warning);\n\tconst warning_type =\n\t\ttypeof options_or_type === 'string'\n\t\t\t? options_or_type\n\t\t\t: options_or_type && typeof options_or_type === 'object'\n\t\t\t\t? (options_or_type as { type?: unknown }).type\n\t\t\t\t: undefined;\n\treturn (\n\t\twarning_type === 'ExperimentalWarning' &&\n\t\tString(warning).includes(SQLITE_EXPERIMENTAL_WARNING)\n\t);\n}\n\nexport function install_sqlite_warning_filter(\n\tprocess_like: WarningEmitter = process,\n): void {\n\tif (process_like[FILTER_INSTALLED]) return;\n\tprocess_like[FILTER_INSTALLED] = true;\n\n\tconst original_emit_warning =\n\t\tprocess_like[ORIGINAL_EMIT_WARNING] ?? process_like.emitWarning;\n\tprocess_like[ORIGINAL_EMIT_WARNING] = original_emit_warning;\n\n\tprocess_like.emitWarning = function emit_filtered_warning(\n\t\tthis: WarningEmitter,\n\t\t...args: unknown[]\n\t) {\n\t\tif (should_suppress_emit_warning_args(args)) return;\n\t\treturn (\n\t\t\toriginal_emit_warning as (...args: unknown[]) => void\n\t\t).apply(this, args);\n\t} as typeof process.emitWarning;\n}\n","#!/usr/bin/env node\n\nimport {\n\tdefineCommand,\n\trenderUsage,\n\trunMain,\n\ttype ArgsDef,\n\ttype CommandDef,\n} from 'citty';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport {\n\tcreate_builtin_disable_cli_args,\n\tparse_extension_cli_args,\n\tparse_extension_paths,\n\tparse_skill_allowlist,\n\tparse_thinking_level,\n\tparse_tool_allowlist,\n\tparse_tool_excludelist,\n\tresolve_builtin_extension_options,\n\ttype CliArgDefinitions,\n} from './cli-args.js';\nimport { get_node_preflight_error } from './runtime-preflight.js';\nimport { install_sqlite_warning_filter } from './warnings.js';\n\nconst node_preflight_error = get_node_preflight_error();\nif (node_preflight_error) {\n\tconsole.error(node_preflight_error);\n\tprocess.exit(1);\n}\n\ninstall_sqlite_warning_filter();\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst package_root = join(__dirname, '..');\nconst pkg = JSON.parse(\n\treadFileSync(join(package_root, 'package.json'), 'utf-8'),\n);\n\n// my-pi is a wrapper around Pi; upstream Pi update banners are useful in\n// this repo, but confusing for installed wrapper users.\nif (!existsSync(join(package_root, '.git'))) {\n\tprocess.env.PI_SKIP_VERSION_CHECK ??= '1';\n}\n\nasync function read_stdin(): Promise<string> {\n\tconst chunks: Buffer[] = [];\n\tfor await (const chunk of process.stdin) {\n\t\tchunks.push(chunk as Buffer);\n\t}\n\treturn Buffer.concat(chunks).toString('utf-8').trim();\n}\n\ntype MyPiRuntime = Awaited<\n\tReturnType<(typeof import('./api.js'))['create_my_pi']>\n>;\ntype InteractiveModeConstructor =\n\t(typeof import('@earendil-works/pi-coding-agent'))['InteractiveMode'];\n\nasync function run_interactive_mode(\n\truntime: MyPiRuntime,\n\tInteractiveModeClass: InteractiveModeConstructor,\n): Promise<void> {\n\tconst original_write = process.stdout.write.bind(process.stdout);\n\tprocess.stdout.write = ((\n\t\tchunk: string | Uint8Array,\n\t\t...args: Parameters<typeof original_write>\n\t) => {\n\t\tif (typeof chunk === 'string') {\n\t\t\tconst escape = String.fromCharCode(27);\n\t\t\tconst styled_hint = new RegExp(\n\t\t\t\t`(To resume this session:${escape}\\\\[[\\\\d;]*m )pi( --session )`,\n\t\t\t\t'g',\n\t\t\t);\n\t\t\tchunk = chunk.replace(styled_hint, '$1my-pi$2');\n\t\t\tchunk = chunk.replace(\n\t\t\t\t/(To resume this session: )pi( --session )/g,\n\t\t\t\t'$1my-pi$2',\n\t\t\t);\n\t\t}\n\t\treturn Reflect.apply(original_write, process.stdout, [\n\t\t\tchunk,\n\t\t\t...args,\n\t\t]);\n\t}) as typeof process.stdout.write;\n\ttry {\n\t\tconst mode = new InteractiveModeClass(runtime, {\n\t\t\tmigratedProviders: [],\n\t\t\tmodelFallbackMessage: undefined,\n\t\t\tinitialMessage: undefined,\n\t\t\tinitialImages: [],\n\t\t\tinitialMessages: [],\n\t\t});\n\t\tawait mode.run();\n\t} finally {\n\t\tprocess.stdout.write =\n\t\t\toriginal_write as typeof process.stdout.write;\n\t}\n}\n\nconst HELP_APPENDIX = `\nMODES\n\n my-pi\n Interactive TUI with slash commands, editor, and session UI.\n\n my-pi \"prompt\"\n my-pi -P \"prompt\"\n One-shot print mode with plain text output.\n\n my-pi --json \"prompt\"\n Non-interactive NDJSON mode for scripts, evals, and other agents.\n\n my-pi --mode rpc\n RPC mode over stdin/stdout JSONL for orchestrators and teammate sessions.\n\nNOTES\n\n - In non-interactive modes, my-pi keeps headless-capable built-ins like\n MCP, LSP, prompt presets, recall, nopeek, Omnisearch, SQLite tools, hooks, and secret redaction.\n - UI-only built-ins like session auto-naming are skipped.\n - Repeat -e / --extension to compose multiple extensions.\n\nNESTED RUNS\n\n - Child runs inherit cwd and environment unless you isolate them explicitly.\n - Use --agent-dir to isolate auth, config, sessions, and telemetry state.\n - For safer evals or unknown repos, use --untrusted plus an explicit\n --system-prompt.\n\nEXAMPLES\n\n my-pi\n my-pi \"fix the failing test\"\n my-pi -P \"summarize this repo\"\n my-pi --json \"list all TODO comments\"\n echo \"plan a login page\" | my-pi --json\n my-pi --telemetry --json \"run eval case\"\n my-pi --telemetry --telemetry-db ./tmp/evals.db --json \"run case\"\n my-pi observability\n my-pi --untrusted --agent-dir /tmp/pi-agent --json \"run case\"\n my-pi -e ./my-ext.ts -e ./other-ext.ts \"hello\"\n my-pi -m claude-haiku-4-5-20241022 \"explain this file\"\n XIAOMI_API_KEY=... my-pi -m xiaomi/mimo-v2.5-pro \"summarize this repo\"\n my-pi -m cloudflare-workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast \"explain this file\"\n my-pi --preset terse,no-purple-prose \"summarize this repo\"\n my-pi --system-prompt \"You are a JSON classifier. Return only JSON.\" --json \"classify this\"\n\nPROMPT PRESETS\n\n Interactive commands:\n /prompt-preset help\n /prompt-preset export-defaults\n /prompt-preset edit-global terse\n /prompt-preset base detailed\n /prompt-preset enable bullets\n\n Short alias: /preset\n\n Editable preset files:\n ~/.pi/agent/presets/*.md\n .pi/presets/*.md\n`;\n\nasync function render_rich_usage<T extends ArgsDef>(\n\tcmd: CommandDef<T>,\n\tparent?: CommandDef<T>,\n): Promise<string> {\n\treturn `${await renderUsage(cmd, parent)}\\n${HELP_APPENDIX}`;\n}\n\nasync function print_usage<T extends ArgsDef>(\n\tcmd: CommandDef<T>,\n\tparent?: CommandDef<T>,\n): Promise<void> {\n\tconsole.log(await render_rich_usage(cmd, parent));\n}\n\nconst main = defineCommand({\n\tmeta: {\n\t\tname: 'my-pi',\n\t\tversion: pkg.version,\n\t\tdescription:\n\t\t\t'Composable pi coding agent with MCP, LSP, presets, and local eval telemetry',\n\t},\n\targs: {\n\t\tprint: {\n\t\t\ttype: 'boolean',\n\t\t\talias: 'P',\n\t\t\tdescription: 'Print mode (non-interactive, one-shot)',\n\t\t\tdefault: false,\n\t\t},\n\t\t'agent-dir': {\n\t\t\ttype: 'string',\n\t\t\tdescription:\n\t\t\t\t'Override Pi auth/config/session directory for this process',\n\t\t\trequired: false,\n\t\t},\n\t\t'session-dir': {\n\t\t\ttype: 'string',\n\t\t\tdescription:\n\t\t\t\t'Override Pi session storage directory for this process',\n\t\t\trequired: false,\n\t\t},\n\t\tjson: {\n\t\t\ttype: 'boolean',\n\t\t\talias: 'j',\n\t\t\tdescription: 'Output NDJSON events (for agent consumption)',\n\t\t\tdefault: false,\n\t\t},\n\t\tmode: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Runtime mode: interactive, print, json, or rpc',\n\t\t\trequired: false,\n\t\t},\n\t\textension: {\n\t\t\ttype: 'string',\n\t\t\talias: 'e',\n\t\t\tdescription:\n\t\t\t\t'Extension path to load; repeatable via argv parsing',\n\t\t\trequired: false,\n\t\t},\n\t\t'no-builtin': {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Disable all built-in extensions',\n\t\t\tdefault: false,\n\t\t},\n\t\tuntrusted: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription:\n\t\t\t\t'Safe mode for unknown repos: skip project MCP, hooks, project prompt presets, project skills, and project LSP binaries unless explicitly re-enabled',\n\t\t\tdefault: false,\n\t\t},\n\t\t...create_builtin_disable_cli_args(),\n\t\ttelemetry: {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Enable local SQLite telemetry for this process',\n\t\t\tdefault: false,\n\t\t},\n\t\t'no-telemetry': {\n\t\t\ttype: 'boolean',\n\t\t\tdescription: 'Disable local SQLite telemetry for this process',\n\t\t\tdefault: false,\n\t\t},\n\t\t'telemetry-db': {\n\t\t\ttype: 'string',\n\t\t\tdescription:\n\t\t\t\t'Override telemetry database path for this process',\n\t\t\trequired: false,\n\t\t},\n\t\tmodel: {\n\t\t\ttype: 'string',\n\t\t\talias: 'm',\n\t\t\tdescription:\n\t\t\t\t'Model to use (e.g. claude-sonnet-4-5-20241022, gpt-5.4, cloudflare-workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast)',\n\t\t},\n\t\tthinking: {\n\t\t\ttype: 'string',\n\t\t\tdescription:\n\t\t\t\t'Thinking level: off, minimal, low, medium, high, or xhigh',\n\t\t\trequired: false,\n\t\t},\n\t\ttools: {\n\t\t\ttype: 'string',\n\t\t\talias: 't',\n\t\t\tdescription:\n\t\t\t\t'Comma-separated allowlist of tool names to enable',\n\t\t\trequired: false,\n\t\t},\n\t\t'exclude-tools': {\n\t\t\ttype: 'string',\n\t\t\talias: 'xt',\n\t\t\tdescription: 'Comma-separated list of tool names to disable',\n\t\t\trequired: false,\n\t\t},\n\t\tsession: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Resume a specific session file or session ID',\n\t\t\trequired: false,\n\t\t},\n\t\t'session-id': {\n\t\t\ttype: 'string',\n\t\t\tdescription:\n\t\t\t\t'Create or resume an exact project-local session ID',\n\t\t\trequired: false,\n\t\t},\n\t\tname: {\n\t\t\ttype: 'string',\n\t\t\talias: 'n',\n\t\t\tdescription: 'Set the session display name at startup',\n\t\t\trequired: false,\n\t\t},\n\t\tskill: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Skill name to allow; repeatable in argv parsing',\n\t\t\trequired: false,\n\t\t},\n\t\t'system-prompt': {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Replace the base system prompt',\n\t\t\trequired: false,\n\t\t},\n\t\t'append-system-prompt': {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Append one-off instructions to the system prompt',\n\t\t\trequired: false,\n\t\t},\n\t\tprompt: {\n\t\t\ttype: 'string',\n\t\t\talias: 'p',\n\t\t\tdescription: 'Prompt text (alternative to positional argument)',\n\t\t\trequired: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst cwd = process.cwd();\n\t\tconst parsed_extension_cli = parse_extension_cli_args(\n\t\t\tprocess.argv.slice(2),\n\t\t\tmain.args as CliArgDefinitions,\n\t\t);\n\t\tif (parsed_extension_cli.diagnostics.length) {\n\t\t\tfor (const message of parsed_extension_cli.diagnostics)\n\t\t\t\tconsole.error(`Error: ${message}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst extension_paths = parse_extension_paths(process.argv, cwd);\n\t\tconst selected_tools = parse_tool_allowlist(process.argv);\n\t\tconst excluded_tools = parse_tool_excludelist(process.argv);\n\t\tconst selected_skills = parse_skill_allowlist(process.argv);\n\t\tlet selected_thinking;\n\t\ttry {\n\t\t\tselected_thinking = parse_thinking_level(args.thinking);\n\t\t} catch (error) {\n\t\t\tconsole.error(\n\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tlet runtime_mode: 'interactive' | 'print' | 'json' | 'rpc' =\n\t\t\t'interactive';\n\t\tif (args.mode) {\n\t\t\tconst requested = String(args.mode).trim().toLowerCase();\n\t\t\tif (\n\t\t\t\t!['interactive', 'print', 'json', 'rpc'].includes(requested)\n\t\t\t) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t'Error: --mode must be one of interactive, print, json, rpc.',\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\truntime_mode = requested as\n\t\t\t\t| 'interactive'\n\t\t\t\t| 'print'\n\t\t\t\t| 'json'\n\t\t\t\t| 'rpc';\n\t\t}\n\t\tif (args.json) runtime_mode = 'json';\n\t\telse if (args.print) runtime_mode = 'print';\n\n\t\tconst positionals = parsed_extension_cli.positionals;\n\t\tif (positionals?.[0] === 'observability') {\n\t\t\tconst { start_observability_server } =\n\t\t\t\tawait import('@spences10/pi-observability/server');\n\t\t\tstart_observability_server();\n\t\t\treturn;\n\t\t}\n\n\t\t// Resolve prompt: named --prompt flag > positional > stdin\n\t\tlet prompt = args.prompt;\n\t\tif (!prompt && positionals && positionals.length > 0) {\n\t\t\tprompt = positionals[0];\n\t\t}\n\t\tif (!prompt && !process.stdin.isTTY && runtime_mode !== 'rpc') {\n\t\t\tprompt = await read_stdin();\n\t\t}\n\t\tif (prompt && runtime_mode === 'interactive')\n\t\t\truntime_mode = 'print';\n\n\t\tif (\n\t\t\t!args.print &&\n\t\t\t!args.json &&\n\t\t\truntime_mode !== 'rpc' &&\n\t\t\t!prompt &&\n\t\t\t!process.stdout.isTTY\n\t\t) {\n\t\t\tawait print_usage(main);\n\t\t\treturn;\n\t\t}\n\n\t\t// Startup feedback so silence = broken (issue #3)\n\t\tif (runtime_mode !== 'interactive') {\n\t\t\tprocess.stderr.write(\n\t\t\t\t`my-pi: connecting to ${args.model || 'default model'}...\\n`,\n\t\t\t);\n\t\t}\n\n\t\tif (args.telemetry && args['no-telemetry']) {\n\t\t\tconsole.error(\n\t\t\t\t'Error: --telemetry and --no-telemetry cannot be used together.',\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tif (args.session && args['session-id']) {\n\t\t\tconsole.error(\n\t\t\t\t'Error: --session and --session-id cannot be used together.',\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tlet telemetry_override: boolean | undefined;\n\t\tif (args.telemetry) {\n\t\t\ttelemetry_override = true;\n\t\t} else if (args['no-telemetry']) {\n\t\t\ttelemetry_override = false;\n\t\t}\n\n\t\tconst [\n\t\t\t{ create_my_pi },\n\t\t\t{ InteractiveMode, runPrintMode, runRpcMode },\n\t\t] = await Promise.all([\n\t\t\timport('./api.js'),\n\t\t\timport('@earendil-works/pi-coding-agent'),\n\t\t]);\n\n\t\tconst runtime = await create_my_pi({\n\t\t\tcwd,\n\t\t\tagent_dir: args['agent-dir'],\n\t\t\tsession_dir: args['session-dir'],\n\t\t\textensions: extension_paths,\n\t\t\textension_flag_values:\n\t\t\t\tparsed_extension_cli.extension_flag_values,\n\t\t\truntime_mode,\n\t\t\t...resolve_builtin_extension_options(args),\n\t\t\ttelemetry: telemetry_override,\n\t\t\ttelemetry_db_path: args['telemetry-db'],\n\t\t\tmodel: args.model,\n\t\t\tthinking: selected_thinking,\n\t\t\tselected_tools,\n\t\t\texcluded_tools,\n\t\t\tselected_skills,\n\t\t\tsession: args.session,\n\t\t\tsession_id: args['session-id'],\n\t\t\tstartup_session_name: args.name,\n\t\t\tsystem_prompt: args['system-prompt'],\n\t\t\tappend_system_prompt: args['append-system-prompt'],\n\t\t\tuntrusted_repo: args.untrusted,\n\t\t});\n\n\t\tfor (const diagnostic of runtime.diagnostics) {\n\t\t\tconst prefix =\n\t\t\t\tdiagnostic.type === 'error'\n\t\t\t\t\t? 'Error: '\n\t\t\t\t\t: diagnostic.type === 'warning'\n\t\t\t\t\t\t? 'Warning: '\n\t\t\t\t\t\t: '';\n\t\t\tconsole.error(`${prefix}${diagnostic.message}`);\n\t\t}\n\t\tif (\n\t\t\truntime.diagnostics.some(\n\t\t\t\t(diagnostic) => diagnostic.type === 'error',\n\t\t\t)\n\t\t) {\n\t\t\tawait runtime.dispose();\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (runtime_mode === 'rpc') {\n\t\t\tawait runRpcMode(runtime);\n\t\t} else if (args.print || args.json || prompt) {\n\t\t\tlet output_mode: 'json' | 'text' = 'text';\n\t\t\tif (args.json) {\n\t\t\t\toutput_mode = 'json';\n\t\t\t}\n\t\t\tconst code = await runPrintMode(runtime, {\n\t\t\t\tmode: output_mode,\n\t\t\t\tinitialMessage: prompt || '',\n\t\t\t\tinitialImages: [],\n\t\t\t\tmessages: [],\n\t\t\t});\n\t\t\tprocess.exit(code);\n\t\t} else if (!process.stdout.isTTY) {\n\t\t\tawait print_usage(main);\n\t\t} else {\n\t\t\tawait run_interactive_mode(runtime, InteractiveMode);\n\t\t}\n\t},\n});\n\nvoid runMain(main, {\n\tshowUsage: async (cmd, parent) => {\n\t\tawait print_usage(cmd, parent);\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.2.
|
|
3
|
+
"version": "0.2.6",
|
|
4
4
|
"description": "Composable pi coding agent with MCP, LSP, prompt presets, and local eval telemetry",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -43,46 +43,46 @@
|
|
|
43
43
|
}
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@earendil-works/pi-ai": "0.84.
|
|
47
|
-
"@earendil-works/pi-coding-agent": "0.84.
|
|
48
|
-
"@earendil-works/pi-tui": "0.84.
|
|
49
|
-
"citty": "^0.2.2",
|
|
50
|
-
"@spences10/pi-settings": "0.0.3",
|
|
46
|
+
"@earendil-works/pi-ai": "0.84.3",
|
|
47
|
+
"@earendil-works/pi-coding-agent": "0.84.3",
|
|
48
|
+
"@earendil-works/pi-tui": "0.84.3",
|
|
51
49
|
"@spences10/pi-project-trust": "0.0.19",
|
|
50
|
+
"@spences10/pi-settings": "0.0.3",
|
|
52
51
|
"@spences10/pi-themes": "0.0.10",
|
|
53
|
-
"@spences10/pi-tui-modal": "0.0.24"
|
|
52
|
+
"@spences10/pi-tui-modal": "0.0.24",
|
|
53
|
+
"citty": "^0.2.2"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@changesets/cli": "^3.0.0",
|
|
57
57
|
"@resvg/resvg-js": "^2.6.2",
|
|
58
58
|
"@types/node": "^25.8.0",
|
|
59
59
|
"@vitest/coverage-v8": "4.1.11",
|
|
60
|
-
"vite-plus": "^0.
|
|
60
|
+
"vite-plus": "^0.3.0",
|
|
61
61
|
"vitest": "4.1.11"
|
|
62
62
|
},
|
|
63
63
|
"optionalDependencies": {
|
|
64
64
|
"@spences10/pi-child-env": "0.1.10",
|
|
65
65
|
"@spences10/pi-codex-usage": "0.0.2",
|
|
66
66
|
"@spences10/pi-coding-preferences": "0.0.15",
|
|
67
|
-
"@spences10/pi-context": "0.1.16",
|
|
68
67
|
"@spences10/pi-confirm-destructive": "0.0.20",
|
|
69
|
-
"@spences10/pi-
|
|
68
|
+
"@spences10/pi-context": "0.1.16",
|
|
69
|
+
"@spences10/pi-factory": "0.0.16",
|
|
70
70
|
"@spences10/pi-footer": "0.0.16",
|
|
71
71
|
"@spences10/pi-git-ui": "0.0.16",
|
|
72
|
+
"@spences10/pi-harness": "0.1.1",
|
|
72
73
|
"@spences10/pi-kimi-usage": "0.0.2",
|
|
73
|
-
"@spences10/pi-mcp": "0.0.60",
|
|
74
74
|
"@spences10/pi-lsp": "0.0.46",
|
|
75
|
-
"@spences10/pi-
|
|
75
|
+
"@spences10/pi-mcp": "0.0.60",
|
|
76
76
|
"@spences10/pi-nopeek": "0.0.16",
|
|
77
|
-
"@spences10/pi-omnisearch": "0.0.15",
|
|
78
77
|
"@spences10/pi-observability": "0.0.23",
|
|
78
|
+
"@spences10/pi-omnisearch": "0.0.15",
|
|
79
79
|
"@spences10/pi-recall": "0.0.16",
|
|
80
80
|
"@spences10/pi-redact": "0.0.15",
|
|
81
|
-
"@spences10/pi-skills": "0.0.36",
|
|
82
81
|
"@spences10/pi-skill-importer": "0.0.13",
|
|
82
|
+
"@spences10/pi-skills": "0.0.36",
|
|
83
|
+
"@spences10/pi-sqlite-tools": "0.0.15",
|
|
83
84
|
"@spences10/pi-svelte-guardrails": "0.0.16",
|
|
84
85
|
"@spences10/pi-team-mode": "0.0.57",
|
|
85
|
-
"@spences10/pi-sqlite-tools": "0.0.15",
|
|
86
86
|
"@spences10/pi-telemetry": "0.0.33"
|
|
87
87
|
},
|
|
88
88
|
"engines": {
|