@narumitw/pi-files 0.0.0-stage → 0.1.0
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/CHANGELOG.md +9 -0
- package/LICENSE +21 -0
- package/README.md +102 -2
- package/dist/chunks/chunk-3GQ7VS22.ts +273 -0
- package/dist/chunks/chunk-3GQ7VS22.ts.map +7 -0
- package/dist/chunks/chunk-AXW73HDJ.ts +31 -0
- package/dist/chunks/chunk-AXW73HDJ.ts.map +7 -0
- package/dist/chunks/chunk-F5QFC255.ts +101 -0
- package/dist/chunks/chunk-F5QFC255.ts.map +7 -0
- package/dist/chunks/chunk-NFNGJETD.ts +77 -0
- package/dist/chunks/chunk-NFNGJETD.ts.map +7 -0
- package/dist/chunks/chunk-OPGTWNJI.ts +258 -0
- package/dist/chunks/chunk-OPGTWNJI.ts.map +7 -0
- package/dist/chunks/chunk-WOTDNRTG.ts +242 -0
- package/dist/chunks/chunk-WOTDNRTG.ts.map +7 -0
- package/dist/chunks/file-context-explorer-WR6GQZHF.ts +1793 -0
- package/dist/chunks/file-context-explorer-WR6GQZHF.ts.map +7 -0
- package/dist/chunks/file-context-menu-VPLHUUQ6.ts +302 -0
- package/dist/chunks/file-context-menu-VPLHUUQ6.ts.map +7 -0
- package/dist/chunks/files-menu-MES4MQ4F.ts +119 -0
- package/dist/chunks/files-menu-MES4MQ4F.ts.map +7 -0
- package/dist/chunks/files-settings-NYXQU2HV.ts +295 -0
- package/dist/chunks/files-settings-NYXQU2HV.ts.map +7 -0
- package/dist/chunks/menu-P6IBMROH.ts +876 -0
- package/dist/chunks/menu-P6IBMROH.ts.map +7 -0
- package/dist/index.ts +1789 -0
- package/dist/index.ts.map +7 -0
- package/docs/edit-scope-reference.md +142 -0
- package/docs/file-context-reference.md +91 -0
- package/docs/migration.md +105 -0
- package/docs/verification.md +99 -0
- package/package.json +58 -4
- package/src/content-search-session.ts +204 -0
- package/src/content-search-ui.ts +159 -0
- package/src/content-search.ts +170 -0
- package/src/context-service.ts +515 -0
- package/src/external-editor.ts +143 -0
- package/src/file-browser-ui.ts +128 -0
- package/src/file-browser.ts +76 -0
- package/src/file-context-explorer.ts +992 -0
- package/src/file-context-menu.ts +360 -0
- package/src/file-context-preview-ui.ts +354 -0
- package/src/file-context-settings.ts +301 -0
- package/src/file-context.ts +321 -0
- package/src/file-search.ts +246 -0
- package/src/files-menu.ts +125 -0
- package/src/files-settings.ts +314 -0
- package/src/files-widget.ts +65 -0
- package/src/files.ts +148 -0
- package/src/git-context.ts +485 -0
- package/src/index.ts +1 -0
- package/src/scope/contracts.ts +243 -0
- package/src/scope/display.ts +27 -0
- package/src/scope/edit-scope.ts +435 -0
- package/src/scope/files.ts +118 -0
- package/src/scope/input.ts +207 -0
- package/src/scope/menu.ts +277 -0
- package/src/scope/paths.ts +142 -0
- package/src/scope/picker-keys.ts +154 -0
- package/src/scope/picker.ts +484 -0
- package/src/scope/policy.ts +55 -0
- package/src/scope/settings.ts +138 -0
- package/src/scope/state.ts +91 -0
- package/src/scope/ui.ts +106 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/scope/menu.ts", "../../src/scope/files.ts", "../../src/scope/picker.ts", "../../src/scope/picker-keys.ts"],
|
|
4
|
+
"sourcesContent": ["import { isAbsolute, relative, sep } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runMenu, runTask } from \"@narumitw/pi-tui-kit\";\nimport { displayError, displayPath } from \"./display.js\";\nimport { discoverScopeFiles } from \"./files.js\";\nimport { showScopePathInput } from \"./input.js\";\nimport { assertScopeTarget, resolveScopeTarget, type ScopeTarget } from \"./paths.js\";\nimport { showScopePicker } from \"./picker.js\";\nimport type { ScopeSettings } from \"./settings.js\";\nimport { createSnapshot, MAX_TARGETS } from \"./state.js\";\nimport { scopeOverlayContext } from \"./ui.js\";\n\nexport interface ScopeView {\n state: \"inactive\" | \"active\" | \"blocked\";\n cwd: string;\n targets: readonly ScopeTarget[];\n error?: string;\n}\n\nexport interface ScopeMenuOptions {\n signal: AbortSignal;\n isCurrent(): boolean;\n getView(): ScopeView;\n getSettings(): ScopeSettings;\n saveShowHiddenFiles(value: boolean): Promise<void>;\n apply(targets: readonly ScopeTarget[], newFile?: boolean, signal?: AbortSignal): Promise<void>;\n off(): Promise<void>;\n}\n\ntype Screen = \"main\" | \"settings\" | \"status\" | \"help\" | \"new-review\";\ntype Action = \"select\" | \"new\" | \"apply-new\" | \"hidden\" | \"off\";\n\nfunction stateLines(view: ScopeView): string[] {\n return [\n `Cwd: ${displayPath(view.cwd)}`,\n view.state === \"inactive\"\n ? \"Not restricted\"\n : `Editing limited to ${view.targets.length} file${view.targets.length === 1 ? \"\" : \"s\"}`,\n ...(view.state === \"blocked\"\n ? [\"Restriction blocked: repair the allowed files or explicitly end the restriction.\"]\n : []),\n ...(view.error ? [displayError(view.error)] : []),\n ];\n}\n\nexport async function showScopeMenu(context: ExtensionCommandContext, options: ScopeMenuOptions): Promise<void> {\n if (context.mode !== \"tui\" || !context.hasUI) throw new Error(\"/edit-scope requires interactive TUI mode.\");\n const ctx = scopeOverlayContext(context);\n const current = () => !options.signal.aborted && options.isCurrent();\n const notify = (error: unknown) => {\n if (current()) ctx.ui.notify(displayError(error), \"error\");\n };\n let pendingNew: ScopeTarget | undefined;\n const definition = defineMenu<ScopeView, Screen, Action>({\n start: \"main\",\n screens: {\n main: ({ state }) => ({\n kind: \"actions\",\n title: \"Edit Scope\",\n lines: stateLines(state),\n hint: \"close\",\n items: [\n {\n id: \"select\",\n label: state.state === \"inactive\" ? \"Select files\u2026\" : \"Change allowed files\u2026\",\n action: \"select\",\n },\n { id: \"new\", label: state.state === \"inactive\" ? \"New file\u2026\" : \"Use only a new file\u2026\", action: \"new\" },\n { id: \"settings\", label: \"Settings\", to: \"settings\" },\n { id: \"status\", label: \"Status\", to: \"status\" },\n { id: \"help\", label: \"Help\", to: \"help\" },\n ...(state.state === \"inactive\" ? [] : [{ id: \"off\", label: \"End restriction\", action: \"off\" as const }]),\n { id: \"close\", label: \"Close\", close: true },\n ],\n }),\n \"new-review\": ({ state }) => {\n if (!pendingNew) throw new Error(\"No new-file target to review.\");\n const outside = [pendingNew.path, pendingNew.canonical].some((path) => {\n const fromCwd = relative(state.cwd, path);\n return isAbsolute(fromCwd) || fromCwd === \"..\" || fromCwd.startsWith(`..${sep}`);\n });\n return {\n kind: \"review\",\n title: \"Review new file\",\n content: [\n ...(state.state === \"inactive\" ? [] : [\"This replaces the complete allowed-file set with one file.\"]),\n ...(outside ? [\"Outside the current directory.\"] : []),\n ...(pendingNew.canonical !== pendingNew.path\n ? [\"The canonical target differs from the entered path.\"]\n : []),\n `Path: ${displayPath(pendingNew.path)}`,\n ...(pendingNew.canonical !== pendingNew.path\n ? [`Canonical target: ${displayPath(pendingNew.canonical)}`]\n : []),\n \"Reserved only. The first normal write creates the file and parent directories.\",\n ].join(\"\\n\"),\n format: { kind: \"text\" },\n viewportSize: \"adaptive\",\n confirm: {\n id: \"apply-new\",\n label: state.state === \"inactive\" ? \"Start restriction\" : \"Replace allowed files with this new file\",\n action: \"apply-new\",\n },\n hint: \"back\",\n };\n },\n settings: () => ({\n kind: \"settings\",\n title: \"Edit Scope Settings\",\n lines: [\"User setting. Changes are saved immediately.\"],\n items: [\n {\n id: \"hidden\",\n label: \"Show hidden files\",\n description:\n \"Include hidden files and directories in the picker. This does not change the active restriction.\",\n currentValue: options.getSettings().showHiddenFiles ? \"true\" : \"false\",\n values: [\"false\", \"true\"],\n action: \"hidden\",\n },\n ],\n }),\n status: ({ state }) => ({\n kind: \"review\",\n title: \"Edit Scope Status\",\n lines: stateLines(state),\n content: [\n ...state.targets.flatMap((target, index) => [\n `${index + 1}. ${displayPath(target.path)}`,\n ...(target.path === target.canonical ? [] : [` Canonical: ${displayPath(target.canonical)}`]),\n ]),\n \"\",\n \"Missing selected paths are reserved. The first normal write creates the file and parent directories.\",\n \"While restricted, write/edit are limited to exact allowed targets. Supported readers remain available.\",\n \"Shell commands, tests, formatters, and opaque writing/delegation tools are blocked; use /edit-scope off first.\",\n \"This guard is not an OS sandbox. User shell commands, other programs, filesystem races, and trusted extensions are outside its boundary.\",\n ].join(\"\\n\"),\n format: { kind: \"text\" },\n viewportSize: \"adaptive\",\n hint: \"back\",\n }),\n help: () => ({\n kind: \"detail\",\n title: \"Edit Scope Help\",\n lines: [\n \"Select files to start a restriction or replace the complete allowed-file set.\",\n \"Typing searches files, including spaces and directory fragments. By default, Tab toggles and moves down, Shift+Tab toggles and moves up, and Enter applies the checked files. Marking stops at the first or last match. The footer follows your configured keys.\",\n \"Project paths are relative to cwd by default. Use Full paths to switch views without changing the search or selected files.\",\n \"Use Add file for an existing full, ~/ or relative path, including files outside cwd. This separate field preserves the search and checked draft; adding does not apply the restriction.\",\n \"New file reserves one target; it replaces all allowed files and creates no content here.\",\n \"Cancelling a draft, closing this menu, and run completion do not release the restriction.\",\n \"Use End restriction or /edit-scope off to release it explicitly.\",\n \"Discovery starts at cwd, skips symlinks and fixed generated/dependency/version-control directories, and does not use .gitignore.\",\n \"Settings controls only hidden-file discovery. Selected targets remain visible even when discovery would exclude them.\",\n \"Status lists every selected path and the tool limitations.\",\n ],\n hint: \"back\",\n }),\n },\n actions: {\n select: async ({ signal }) => {\n const view = options.getView();\n const live = new Map(view.targets.map((target) => [target.path, target]));\n const result = await showScopePicker(ctx, {\n cwd: view.cwd,\n targets: view.targets,\n completionLabel: view.state === \"inactive\" ? \"Start restriction\" : \"Apply changes\",\n signal,\n isCurrent: current,\n discover: (scanSignal) => discoverScopeFiles(view.cwd, options.getSettings().showHiddenFiles, scanSignal),\n resolvePath: async (raw, validationSignal) => {\n const target = await resolveScopeTarget(raw, view.cwd, \"existing\", validationSignal);\n if (!current() || validationSignal.aborted)\n throw validationSignal.reason ?? new Error(\"Scope flow is stale.\");\n return target;\n },\n validate: async (paths, validationSignal, added) => {\n if (paths.length > MAX_TARGETS) throw new Error(`Select no more than ${MAX_TARGETS} files.`);\n const manual = new Map(added.map((target) => [target.path, target] as const));\n const known = new Map([...live, ...manual]);\n const targets: ScopeTarget[] = [];\n for (const path of paths) {\n // Discovery/snapshots already contain lexical native paths. A file\n // URL preserves literal Unicode spaces through Pi's raw-input resolver.\n const nativePath = pathToFileURL(path).href;\n const existing = known.get(path);\n if (existing) {\n let checked = existing;\n if (manual.has(path)) {\n checked = await resolveScopeTarget(nativePath, view.cwd, \"existing\", validationSignal);\n if (!current() || validationSignal.aborted)\n throw validationSignal.reason ?? new Error(\"Scope flow is stale.\");\n if (checked.canonical !== existing.canonical)\n throw new Error(`The added target changed: ${displayPath(path)}. Add it again.`);\n }\n await assertScopeTarget(nativePath, view.cwd, [existing], validationSignal);\n if (!current() || validationSignal.aborted)\n throw validationSignal.reason ?? new Error(\"Scope flow is stale.\");\n targets.push(checked);\n } else {\n const target = await resolveScopeTarget(nativePath, view.cwd, \"existing\", validationSignal);\n if (!current() || validationSignal.aborted)\n throw validationSignal.reason ?? new Error(\"Scope flow is stale.\");\n targets.push(target);\n }\n }\n createSnapshot(view.cwd, targets);\n return targets;\n },\n });\n if (!current() || signal.aborted || result.kind === \"stale\") return { kind: \"close\" };\n if (result.kind !== \"completed\") return { kind: \"stay\" };\n if (result.value.kind === \"cancelled\") return { kind: result.value.reason === \"close\" ? \"close\" : \"stay\" };\n if (result.value.kind === \"error\") {\n notify(result.value.error);\n return { kind: \"stay\" };\n }\n if (result.value.targets.length === 0) {\n ctx.ui.notify(\"No files selected. The restriction is unchanged.\", \"info\");\n return { kind: \"stay\" };\n }\n const selected = result.value.targets;\n const applied = await runTask(ctx, {\n label: \"Applying editing scope\u2026\",\n signal,\n isCurrent: current,\n task: ({ signal: operation }) => options.apply(selected, false, operation),\n onError: (_ctx, error) => notify(error),\n });\n return { kind: applied.kind === \"completed\" || applied.kind === \"stale\" ? \"close\" : \"stay\" };\n },\n new: async ({ signal }) => {\n const view = options.getView();\n const result = await showScopePathInput(ctx, {\n cwd: view.cwd,\n signal,\n isCurrent: current,\n });\n if (!current() || signal.aborted || result.kind === \"stale\") return { kind: \"close\" };\n if (result.kind !== \"completed\") return { kind: \"stay\" };\n if (result.value.kind === \"cancelled\") return { kind: result.value.reason === \"close\" ? \"close\" : \"stay\" };\n pendingNew = result.value.target;\n return { kind: \"to\", screen: \"new-review\" };\n },\n \"apply-new\": async ({ signal }) => {\n if (!current() || signal.aborted || !pendingNew) return { kind: \"close\" };\n const target = pendingNew;\n const applied = await runTask(ctx, {\n label: \"Applying new-file scope\u2026\",\n signal,\n isCurrent: current,\n task: ({ signal: operation }) => options.apply([target], true, operation),\n onError: (_ctx, error) => notify(error),\n });\n return { kind: applied.kind === \"completed\" || applied.kind === \"stale\" ? \"close\" : \"stay\" };\n },\n hidden: async ({ value, signal }) => {\n if (!current() || signal.aborted) return { kind: \"close\" };\n await options.saveShowHiddenFiles(value === \"true\");\n if (!current() || signal.aborted) return { kind: \"close\" };\n return { kind: \"stay\" };\n },\n off: async ({ signal }) => {\n if (!current() || signal.aborted) return { kind: \"close\" };\n await options.off();\n return { kind: \"close\" };\n },\n },\n });\n await runMenu(ctx, definition, {\n signal: options.signal,\n isCurrent: current,\n getState: () => options.getView(),\n onError: (_ctx, error) => notify(error),\n });\n}\n", "import type { Dir, Dirent } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\n/** Internal discovery limits, not settings; exceeding any limit fails the whole scan. */\nexport const MAX_SCOPE_FILES = 5_000;\nexport const MAX_SCOPE_ENTRIES = 20_000;\n/** cwd is depth zero; directories through depth 64 are scanned. */\nexport const MAX_SCOPE_DEPTH = 64;\n\n/** Exact directory names skipped at every depth; .gitignore is not read. */\nexport const SCOPE_EXCLUDED_DIRECTORIES: readonly string[] = Object.freeze([\n \".git\",\n \".hg\",\n \".svn\",\n \"node_modules\",\n \".venv\",\n \"venv\",\n \"__pycache__\",\n \"build\",\n \"coverage\",\n \"dist\",\n \"target\",\n \".next\",\n]);\nconst excludedDirectories = new Set(SCOPE_EXCLUDED_DIRECTORIES);\n\nfunction scanError(action: string, path: string, cause: unknown): Error {\n const code = cause && typeof cause === \"object\" && \"code\" in cause ? ` (${String(cause.code)})` : \"\";\n return new Error(`Scope cannot ${action} ${JSON.stringify(path)}${code}. Check access and retry.`, { cause });\n}\n\nasync function closeDirectory(handle: Dir, path: string, signal?: AbortSignal): Promise<void> {\n try {\n await handle.close();\n } catch (error) {\n signal?.throwIfAborted();\n throw scanError(\"close directory\", path, error);\n }\n signal?.throwIfAborted();\n}\n\n/**\n * Scan breadth-first and return sorted absolute lexical paths beneath cwd. Skip symlink entries and\n * nonregular files. Hidden entries still count toward the work cap. No writes,\n * .gitignore processing, or partial results. A symlink used as cwd is permitted.\n */\nexport async function discoverScopeFiles(\n cwd: string,\n showHiddenFiles: boolean,\n signal?: AbortSignal,\n): Promise<string[]> {\n const files: string[] = [];\n let entryCount = 0;\n const directories = [{ directory: resolve(cwd), depth: 0 }];\n\n // Appended directories are visited after every directory already in the queue.\n for (const { directory, depth } of directories) {\n signal?.throwIfAborted();\n if (depth > MAX_SCOPE_DEPTH) {\n throw new Error(`Scope scan exceeds depth ${MAX_SCOPE_DEPTH}. Open a narrower working directory.`);\n }\n let handle: Awaited<ReturnType<typeof fs.opendir>>;\n try {\n handle = await fs.opendir(directory);\n } catch (error) {\n signal?.throwIfAborted();\n throw scanError(\"open directory\", directory, error);\n }\n // Own the handle before checking cancellation, including an abort during open.\n try {\n signal?.throwIfAborted();\n while (true) {\n let entry: Dirent | null;\n try {\n entry = await handle.read();\n } catch (error) {\n signal?.throwIfAborted();\n throw scanError(\"read directory\", directory, error);\n }\n signal?.throwIfAborted();\n if (!entry) break;\n entryCount += 1;\n if (entryCount > MAX_SCOPE_ENTRIES) {\n throw new Error(`Scope scan exceeds ${MAX_SCOPE_ENTRIES} entries. Open a narrower working directory.`);\n }\n if (entry.isSymbolicLink() || (!showHiddenFiles && entry.name.startsWith(\".\"))) continue;\n if (entry.isDirectory() && excludedDirectories.has(entry.name)) continue;\n const path = resolve(directory, entry.name);\n let stats: Awaited<ReturnType<typeof fs.lstat>>;\n try {\n stats = await fs.lstat(path);\n } catch (error) {\n signal?.throwIfAborted();\n throw scanError(\"inspect entry\", path, error);\n }\n signal?.throwIfAborted();\n // Recheck metadata so a previously observed directory symlink is not followed.\n if (stats.isSymbolicLink()) continue;\n if (stats.isDirectory()) {\n if (!excludedDirectories.has(entry.name)) directories.push({ directory: path, depth: depth + 1 });\n } else if (stats.isFile()) {\n files.push(path);\n if (files.length > MAX_SCOPE_FILES) {\n throw new Error(`Scope scan exceeds ${MAX_SCOPE_FILES} files. Open a narrower working directory.`);\n }\n }\n }\n } finally {\n // Always drain close, even on cancellation or read failure. Do not race I/O\n // against an abort event and leave directory handles owned by a stale flow.\n await closeDirectory(handle, directory, signal);\n }\n }\n\n signal?.throwIfAborted();\n return files.sort((left, right) => (left < right ? -1 : left > right ? 1 : 0));\n}\n", "import { isAbsolute, relative, sep } from \"node:path\";\nimport type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport {\n fuzzyFilter,\n type SelectItem,\n SelectList,\n stripTerminalSequences,\n type TuiMouseEvent,\n visibleWidth,\n} from \"@earendil-works/pi-tui\";\nimport { runCustomInteraction } from \"@narumitw/pi-tui-kit\";\nimport { displayError, displayFilePath, displayPath } from \"./display.js\";\nimport { ScopeInput } from \"./input.js\";\nimport type { ScopeTarget } from \"./paths.js\";\nimport { type PickerAction, type PickerPanel, pickerKeys } from \"./picker-keys.js\";\nimport { MAX_TARGETS } from \"./state.js\";\nimport { exactRows, scopeFrame } from \"./ui.js\";\n\ntype PickerValue =\n | { kind: \"selected\"; targets: readonly ScopeTarget[] }\n | { kind: \"cancelled\"; reason: \"back\" | \"close\" }\n | { kind: \"error\"; error: unknown };\n\nexport interface ScopePickerOptions {\n cwd: string;\n targets: readonly ScopeTarget[];\n completionLabel: string;\n signal: AbortSignal;\n isCurrent(): boolean;\n discover(signal: AbortSignal): Promise<string[]>;\n resolvePath(raw: string, signal: AbortSignal): Promise<ScopeTarget>;\n validate(\n paths: readonly string[],\n signal: AbortSignal,\n added: readonly ScopeTarget[],\n ): Promise<readonly ScopeTarget[]>;\n}\n\nconst LIST_ROWS = 10;\nfunction outsideCwd(cwd: string, path: string): boolean {\n const fromCwd = relative(cwd, path);\n return isAbsolute(fromCwd) || fromCwd === \"..\" || fromCwd.startsWith(`..${sep}`);\n}\n\ntype Button = { action: PickerAction; label: string; enabled: boolean };\ntype Pressed = { kind: \"file\"; id: string } | { kind: \"button\"; action: PickerAction } | { kind: \"cancelled\" };\n\nexport function showScopePicker(ctx: ExtensionCommandContext, options: ScopePickerOptions) {\n return runCustomInteraction<PickerValue>(ctx, {\n signal: options.signal,\n isCurrent: options.isCurrent,\n create: ({ tui, theme, keybindings, signal: ownerSignal, complete }) => {\n const controller = new AbortController();\n const signal = AbortSignal.any([ownerSignal, controller.signal]);\n const placeholder = (text: string) => theme.fg(\"dim\", text);\n const search = new ScopeInput(\"Search files\u2026\", placeholder);\n const pathInput = new ScopeInput(\"Existing file path\u2026\", placeholder);\n const keys = pickerKeys(tui, keybindings);\n const checked = new Set(options.targets.map((target) => target.path));\n const added = new Map<string, ScopeTarget>();\n let panel: PickerPanel = \"files\";\n let focused = false;\n let fullPaths = false;\n let paths: string[] = [];\n let rows: SelectItem[] = [];\n let list: SelectList;\n let loading = true;\n let validating: \"path\" | \"selection\" | undefined;\n let operation: AbortController | undefined;\n let pending = Promise.resolve();\n let disposed = false;\n let closing = false;\n let error = \"\";\n let notice = \"\";\n let pressed: Pressed | undefined;\n let mouseLayout:\n | {\n width: number;\n input?: number;\n rows: Map<number, string>;\n buttons: Array<{ row: number; start: number; end: number; action: PickerAction }>;\n }\n | undefined;\n // Absorb the later native click instead of reusing it as a fresh gesture.\n const cancelPress = () => {\n if (pressed) pressed = { kind: \"cancelled\" };\n };\n const relativePath = (path: string) =>\n outsideCwd(options.cwd, path) ? path : relative(options.cwd, path) || \".\";\n const pathLabel = (path: string) => displayFilePath(fullPaths ? path : relativePath(path));\n const syncFocus = () => {\n search.input.focused = focused && panel === \"files\";\n pathInput.input.focused = focused && panel === \"path\";\n };\n const current = () => {\n if (disposed || closing || signal.aborted) return false;\n if (options.isCurrent()) return true;\n closing = true;\n complete({ kind: \"cancelled\", reason: \"close\" });\n controller.abort();\n return false;\n };\n const close = (value: PickerValue) => {\n if (!current()) return;\n closing = true;\n complete(value);\n controller.abort();\n };\n const rebuild = (selectedId = list?.getSelectedItem()?.value) => {\n cancelPress();\n // Escape display identities before fuzzy matching; raw absolute IDs stay payloads.\n const query = displayPath(search.input.getValue()).slice(1, -1);\n rows = fuzzyFilter(paths, query, (path) => displayPath(relativePath(path)).slice(1, -1)).map((path) => ({\n value: path,\n label: `${checked.has(path) ? \"[x]\" : \"[ ]\"} ${outsideCwd(options.cwd, path) ? \"(outside) \" : \"\"}${pathLabel(path)}`,\n }));\n list = new SelectList(rows, LIST_ROWS, {\n selectedPrefix: (text) => theme.fg(\"accent\", text),\n selectedText: (text) => theme.fg(\"accent\", text),\n description: (text) => theme.fg(\"muted\", text),\n scrollInfo: (text) => theme.fg(\"dim\", text),\n noMatch: (text) => theme.fg(\"warning\", text),\n });\n list.setSelectedIndex(\n Math.max(\n 0,\n rows.findIndex((row) => row.value === selectedId),\n ),\n );\n };\n const runValidation = (kind: \"path\" | \"selection\", work: (operationSignal: AbortSignal) => Promise<void>) => {\n const owned = new AbortController();\n const operationSignal = AbortSignal.any([signal, owned.signal]);\n operation = owned;\n validating = kind;\n error = \"\";\n pending = (async () => {\n try {\n await work(operationSignal);\n } catch (failure) {\n if (current() && !operationSignal.aborted) error = displayError(failure);\n } finally {\n if (operation === owned) {\n operation = undefined;\n validating = undefined;\n }\n if (current()) tui.requestRender();\n }\n })();\n };\n const apply = () => {\n if (!current() || loading || validating) return;\n const selectedPaths = paths.filter((path) => checked.has(path));\n if (!selectedPaths.length) {\n error = \"Select at least one file first.\";\n return;\n }\n runValidation(\"selection\", async (operationSignal) => {\n const targets = await options.validate(selectedPaths, operationSignal, [...added.values()]);\n if (current() && !operationSignal.aborted) close({ kind: \"selected\", targets });\n });\n };\n const addPath = () => {\n if (!current() || loading || validating) return;\n const raw = pathInput.input.getValue();\n if (!raw.length) {\n error = \"Enter an existing file path.\";\n return;\n }\n runValidation(\"path\", async (operationSignal) => {\n const target = await options.resolvePath(raw, operationSignal);\n if (!current() || operationSignal.aborted) return;\n if (!added.has(target.path) && added.size >= MAX_TARGETS) {\n throw new Error(`Add no more than ${MAX_TARGETS} distinct paths in one picker.`);\n }\n const previous = list.getSelectedItem()?.value;\n added.set(target.path, { path: target.path, canonical: target.canonical });\n if (!paths.includes(target.path)) paths.push(target.path);\n checked.add(target.path);\n pathInput.input.setValue(\"\");\n panel = \"files\";\n syncFocus();\n rebuild(target.path);\n if (!rows.some((row) => row.value === target.path))\n list.setSelectedIndex(\n Math.max(\n 0,\n rows.findIndex((row) => row.value === previous),\n ),\n );\n notice = `Added ${pathLabel(target.path)}`;\n });\n };\n const mark = (id: string, move = 0) => {\n if (!current() || loading || validating) return;\n const index = rows.findIndex((row) => row.value === id);\n if (index < 0) return;\n if (checked.has(id)) checked.delete(id);\n else checked.add(id);\n error = \"\";\n notice = \"\";\n // Marking stops at the result boundaries; ordinary arrow navigation still wraps.\n const next = rows[Math.max(0, Math.min(rows.length - 1, index + move))]?.value;\n rebuild(next);\n };\n const perform = (command: PickerAction) => {\n if (command === \"close\") close({ kind: \"cancelled\", reason: \"close\" });\n else if (command === \"cancel\") {\n if (panel === \"files\") close({ kind: \"cancelled\", reason: \"back\" });\n else {\n operation?.abort();\n panel = \"files\";\n error = \"\";\n syncFocus();\n }\n } else if (loading || validating) return;\n else if (command === \"apply\") apply();\n else if (command === \"submit\") addPath();\n else if (command === \"add\") {\n panel = \"path\";\n error = \"\";\n notice = \"\";\n cancelPress();\n syncFocus();\n } else if (command === \"paths\") {\n fullPaths = !fullPaths;\n rebuild();\n } else if (command === \"mark\" || command === \"markUp\") {\n const id = list.getSelectedItem()?.value;\n if (id) mark(id, command === \"mark\" ? 1 : -1);\n } else if (command === \"up\" || command === \"down\" || command === \"pageUp\" || command === \"pageDown\") {\n const index = rows.findIndex((row) => row.value === list.getSelectedItem()?.value);\n if (index < 0) return;\n if (command === \"pageUp\" || command === \"pageDown\")\n list.setSelectedIndex(index + (command === \"pageUp\" ? -LIST_ROWS : LIST_ROWS));\n else list.setSelectedIndex((index + (command === \"up\" ? -1 : 1) + rows.length) % rows.length);\n }\n };\n const handleInput = (data: string): void => {\n if (!current()) return;\n cancelPress();\n // A fragmented paste keeps its original input owner across async panel changes.\n const activeInput = search.isPasting\n ? search\n : pathInput.isPasting\n ? pathInput\n : panel === \"files\"\n ? search\n : pathInput;\n const previous = activeInput.input.getValue();\n let remaining: string | undefined;\n activeInput.handleInput(\n data,\n (data) => {\n const command = keys.action(data, panel);\n if (command === \"cancel\" || command === \"close\") {\n perform(command);\n return true;\n }\n if (validating) return true;\n if (!command || command === \"input\") return false;\n perform(command);\n return true;\n },\n !validating,\n (tail) => {\n remaining = tail;\n },\n );\n if (!current()) return;\n if (activeInput.input.getValue() !== previous) {\n error = \"\";\n notice = \"\";\n if (activeInput === search && !loading) rebuild(\"\");\n }\n // Publish the pasted query before dispatching list actions from its tail.\n if (remaining) handleInput(remaining);\n if (current()) tui.requestRender();\n };\n rebuild();\n pending = (async () => {\n try {\n const discovered = await options.discover(signal);\n if (!current()) return;\n paths = [...new Set([...options.targets.map((target) => target.path), ...discovered])];\n loading = false;\n rebuild();\n tui.requestRender();\n } catch (failure) {\n if (current()) close({ kind: \"error\", error: failure });\n }\n })();\n return {\n get focused() {\n return focused;\n },\n set focused(value: boolean) {\n focused = value;\n syncFocus();\n },\n render(width: number) {\n const safeWidth = Math.max(1, width);\n const activeInput = panel === \"files\" ? search : pathInput;\n const pasting = search.isPasting || pathInput.isPasting;\n const busy = loading || validating !== undefined || pasting;\n const selectedIndex = rows.findIndex((row) => row.value === list.getSelectedItem()?.value);\n const start = Math.max(0, Math.min(selectedIndex - Math.floor(LIST_ROWS / 2), rows.length - LIST_ROWS));\n const activeRow = rows[selectedIndex];\n const content = [...activeInput.render(safeWidth)];\n const filesStart = content.length + 1;\n let focusedRow = 0;\n if (panel === \"files\") {\n const listRows = loading\n ? [theme.fg(\"dim\", \"Scanning files\u2026\")]\n : rows.length\n ? list.render(safeWidth)\n : [theme.fg(\"dim\", \"No matching files\")];\n content.push(\"\", ...listRows);\n focusedRow = rows.length && !loading ? filesStart + selectedIndex - start : 0;\n const target =\n added.get(activeRow?.value ?? \"\") ?? options.targets.find((target) => target.path === activeRow?.value);\n const preview = [\n ...(activeRow && !stripTerminalSequences(listRows[selectedIndex - start] ?? \"\").includes(activeRow.label)\n ? [`Path: ${pathLabel(activeRow.value)}`]\n : []),\n ...(target && (outsideCwd(options.cwd, target.path) || outsideCwd(options.cwd, target.canonical))\n ? [\"Outside the current directory.\"]\n : []),\n ...(target && target.path !== target.canonical\n ? [`Canonical target: ${pathLabel(target.canonical)}`]\n : []),\n ];\n content.push(\n ...preview.flatMap((line) => exactRows(line, safeWidth).map((part) => theme.fg(\"muted\", part))),\n );\n } else if (pathInput.input.getValue()) {\n content.push(\n ...exactRows(`Path: ${displayPath(pathInput.input.getValue())}`, safeWidth).map((line) =>\n theme.fg(\"muted\", line),\n ),\n );\n }\n if (notice) content.push(...exactRows(notice, safeWidth).map((line) => theme.fg(\"muted\", line)));\n if (error) content.push(...exactRows(error, safeWidth).map((line) => theme.fg(\"error\", line)));\n if (validating)\n content.push(\n theme.fg(\n \"dim\",\n operation?.signal.aborted\n ? \"Finishing file check\u2026\"\n : validating === \"path\"\n ? \"Checking file\u2026\"\n : \"Checking selected files\u2026\",\n ),\n );\n const pathModeLabel = fullPaths ? \"Relative paths\" : \"Full paths\";\n const buttons: Button[] =\n panel === \"files\"\n ? [\n { action: \"apply\", label: options.completionLabel, enabled: !busy && checked.size > 0 },\n { action: \"add\", label: pasting ? \"Add file\u2026\" : keys.label(\"add\", \"Add file\u2026\"), enabled: !busy },\n {\n action: \"paths\",\n label: pasting ? pathModeLabel : keys.label(\"paths\", pathModeLabel),\n enabled: !busy,\n },\n ]\n : [\n { action: \"cancel\", label: \"Back\", enabled: !pasting },\n { action: \"submit\", label: \"Add file\", enabled: !busy && pathInput.input.getValue().length > 0 },\n ];\n let column = 0;\n const spans = buttons.map((button) => {\n const text = `[ ${button.label} ]`;\n const span = {\n start: column,\n end: column + visibleWidth(text),\n action: button.action,\n enabled: button.enabled,\n };\n column = span.end + 2;\n return { ...span, text: theme.fg(button.enabled ? \"muted\" : \"dim\", text) };\n });\n const buttonRow = content.length;\n content.push(spans.map((span) => span.text).join(\" \"));\n const frame = scopeFrame(\n tui,\n theme,\n width,\n panel === \"files\" ? \"Select files\" : \"Add existing file\",\n [`Cwd: ${displayFilePath(options.cwd)}`],\n content,\n [focusedRow, 0, buttonRow],\n focusedRow,\n [pasting ? `${checked.size} selected \u2022 Pasting\u2026` : keys.hints(panel, checked.size, busy)],\n );\n const buttonFrameRow = frame.contentRows.find((row) => row.contentIndex === buttonRow)?.frameIndex;\n mouseLayout = {\n width,\n input: frame.contentRows.find((row) => row.contentIndex === 0)?.frameIndex,\n rows: new Map(\n panel === \"files\"\n ? frame.contentRows.flatMap((row) => {\n const native = row.contentIndex - filesStart;\n const id = rows[start + native]?.value;\n return native >= 0 && native < Math.min(LIST_ROWS, rows.length) && id ? [[row.frameIndex, id]] : [];\n })\n : [],\n ),\n buttons:\n buttonFrameRow === undefined\n ? []\n : spans\n .filter((span) => span.enabled && span.end <= width)\n .map((span) => ({ row: buttonFrameRow, start: span.start, end: span.end, action: span.action })),\n };\n return frame.lines;\n },\n handleInput,\n handleMouse(event: TuiMouseEvent) {\n if (\n !current() ||\n !mouseLayout ||\n event.width !== mouseLayout.width ||\n search.isPasting ||\n pathInput.isPasting\n )\n return;\n // Native click follows the original press even if a render moves the rows.\n if (event.type === \"click\" && event.button === \"left\" && pressed) {\n const target = pressed;\n pressed = undefined;\n if (target.kind === \"file\") mark(target.id);\n else if (target.kind === \"button\") perform(target.action);\n return { handled: true, render: target.kind !== \"cancelled\" };\n }\n if (event.type === \"press\" && event.button === \"left\") pressed = undefined;\n const button = mouseLayout.buttons.find(\n (button) => button.row === event.y && event.x >= button.start && event.x < button.end,\n );\n if (button && event.button === \"left\") {\n if (event.type === \"press\") pressed = { kind: \"button\", action: button.action };\n else if (event.type === \"click\") perform(button.action);\n else return;\n return { handled: true, render: true, focus: event.type === \"press\" };\n }\n if (loading || validating) return;\n if (event.y === mouseLayout.input) {\n const result = (panel === \"files\" ? search : pathInput).handleMouse({ ...event, y: 0, height: 1 });\n // Input edits the caret on press only; its later click must not hit a moved button.\n if (event.type === \"press\" && result?.handled) pressed = { kind: \"cancelled\" };\n return result;\n }\n const id = mouseLayout.rows.get(event.y);\n if (!id) return;\n if (event.type === \"wheel\" && event.wheelDelta) {\n cancelPress();\n const selected = rows.findIndex((row) => row.value === list.getSelectedItem()?.value);\n list.setSelectedIndex(Math.max(0, Math.min(rows.length - 1, selected + (event.wheelDelta < 0 ? -1 : 1))));\n } else if (event.type === \"press\" && event.button === \"left\") {\n pressed = { kind: \"file\", id };\n list.setSelectedIndex(rows.findIndex((row) => row.value === id));\n } else if (event.type === \"click\" && event.button === \"left\") mark(id);\n else return;\n return { handled: true, render: true, focus: event.type === \"press\" };\n },\n invalidate() {\n cancelPress();\n mouseLayout = undefined;\n search.input.invalidate();\n pathInput.input.invalidate();\n list.invalidate();\n },\n waitForPending: () => pending,\n dispose() {\n if (disposed) return;\n disposed = true;\n pressed = undefined;\n controller.abort();\n },\n };\n },\n });\n}\n", "import type { KeybindingsManager } from \"@earendil-works/pi-coding-agent\";\nimport { getKeybindings, matchesKey, type TUI, TUI_KEYBINDINGS } from \"@earendil-works/pi-tui\";\nimport { formatInteractionHints } from \"@narumitw/pi-tui-kit\";\n\nexport type PickerPanel = \"files\" | \"path\";\nexport type PickerAction =\n | \"close\"\n | \"cancel\"\n | \"up\"\n | \"down\"\n | \"pageUp\"\n | \"pageDown\"\n | \"apply\"\n | \"mark\"\n | \"markUp\"\n | \"paths\"\n | \"add\"\n | \"submit\"\n | \"input\";\nconst selection = [\n [\"cancel\", \"tui.select.cancel\"],\n [\"up\", \"tui.select.up\"],\n [\"down\", \"tui.select.down\"],\n [\"pageUp\", \"tui.select.pageUp\"],\n [\"pageDown\", \"tui.select.pageDown\"],\n [\"apply\", \"tui.select.confirm\"],\n] as const;\nconst editing = [\n \"tui.editor.undo\",\n \"tui.input.submit\",\n \"tui.editor.deleteCharBackward\",\n \"tui.editor.deleteCharForward\",\n \"tui.editor.deleteWordBackward\",\n \"tui.editor.deleteWordForward\",\n \"tui.editor.deleteToLineStart\",\n \"tui.editor.deleteToLineEnd\",\n \"tui.editor.yank\",\n \"tui.editor.yankPop\",\n \"tui.editor.cursorLeft\",\n \"tui.editor.cursorRight\",\n \"tui.editor.cursorLineStart\",\n \"tui.editor.cursorLineEnd\",\n \"tui.editor.cursorWordLeft\",\n \"tui.editor.cursorWordRight\",\n] as const;\nconst viewportBindings = Object.keys(TUI_KEYBINDINGS).filter(\n (binding) => binding.startsWith(\"tui.altScreen.\") && !binding.startsWith(\"tui.altScreen.search\"),\n) as (keyof typeof TUI_KEYBINDINGS)[];\n// Prove familiar input families with Pi's matcher, without guessing arbitrary remaps.\n// Unproven keys still dispatch natively, but do not receive a literal key hint.\nconst hintInputs = [\n \"\\r\",\n \"\\n\",\n \"\\x1bOM\",\n \"\\x1b\",\n \"\\t\",\n \"\\x1b[Z\",\n \"\\x10\",\n \"\\x0f\",\n \"\\x1bo\",\n \"\\x1b[111;3u\",\n \"\\x1b[A\",\n \"\\x1b[B\",\n \"\\x1b[5~\",\n \"\\x1b[6~\",\n ...[\"OP\", \"OQ\", \"OR\", \"OS\", \"[15~\", \"[17~\", \"[18~\", \"[19~\", \"[20~\", \"[21~\", \"[23~\", \"[24~\"].map(\n (suffix) => `\\x1b${suffix}`,\n ),\n ...\"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 \",\n];\n\nexport function pickerKeys(tui: TUI, keybindings: KeybindingsManager) {\n const hostAllows = (data: string) => {\n if (tui.onDebug && matchesKey(data, \"shift+ctrl+d\")) return false;\n if (tui.mode !== \"fullscreen\") return true;\n const host = getKeybindings();\n if (host.matches(data, \"tui.altScreen.search\")) return false;\n return tui.hasOverlay() || !viewportBindings.some((binding) => host.matches(data, binding));\n };\n const filesAction = (data: string): PickerAction | undefined => {\n if (matchesKey(data, \"ctrl+c\")) return \"close\";\n for (const [name, binding] of selection) if (keybindings.matches(data, binding)) return name;\n // Native editing/submission wins over additional marking and view shortcuts.\n if (data === \"\\n\" || editing.some((binding) => keybindings.matches(data, binding))) return \"input\";\n if (keybindings.matches(data, \"tui.input.tab\")) return \"mark\";\n if (matchesKey(data, \"shift+tab\")) return \"markUp\";\n if (keybindings.matches(data, \"app.session.togglePath\")) return \"paths\";\n };\n const addKey = () =>\n ([\"ctrl+o\", \"alt+o\"] as const).find((key) => {\n const inputs = hintInputs.filter((input) => matchesKey(input, key));\n return inputs.length > 0 && inputs.every((input) => hostAllows(input) && filesAction(input) === undefined);\n });\n const action = (data: string, panel: PickerPanel): PickerAction | undefined => {\n if (panel === \"files\") {\n const native = filesAction(data);\n if (native) return native;\n const add = addKey();\n if (add && matchesKey(data, add)) return \"add\";\n return;\n }\n if (matchesKey(data, \"ctrl+c\")) return \"close\";\n if (keybindings.matches(data, \"tui.select.cancel\")) return \"cancel\";\n // Match Input's ordering: cancellation, undo, then submission (including LF).\n if (keybindings.matches(data, \"tui.editor.undo\")) return \"input\";\n if (keybindings.matches(data, \"tui.input.submit\") || data === \"\\n\") return \"submit\";\n return \"input\";\n };\n const bindings = (panel: PickerPanel) => ({\n getKeys(name: PickerAction): string[] {\n const binding =\n name === \"mark\"\n ? \"tui.input.tab\"\n : name === \"paths\"\n ? \"app.session.togglePath\"\n : name === \"submit\"\n ? \"tui.input.submit\"\n : selection.find(([action]) => action === name)?.[1];\n const candidates =\n name === \"markUp\"\n ? ([\"shift+tab\"] as const)\n : name === \"add\"\n ? [addKey()].filter((key) => key !== undefined)\n : binding\n ? keybindings.getKeys(binding)\n : [];\n const key = candidates.find((key) => {\n const inputs = hintInputs.filter((input) => matchesKey(input, key));\n return inputs.length > 0 && inputs.every((input) => hostAllows(input) && action(input, panel) === name);\n });\n return key ? [key] : [];\n },\n });\n const label = (name: PickerAction, text: string, panel: PickerPanel = \"files\") =>\n formatInteractionHints(bindings(panel), [{ bindings: [name], label: text }]) || text;\n const hints = (panel: PickerPanel, count: number, busy: boolean) => {\n const keys = bindings(panel);\n const controls = formatInteractionHints(keys, [\n ...(!busy\n ? panel === \"files\"\n ? [\n { bindings: [\"mark\"] as const, label: \"select\" },\n { bindings: [\"apply\"] as const, label: count ? \"apply\" : \"apply (select files)\" },\n { bindings: [\"markUp\"] as const, label: \"select \u2191\" },\n ]\n : [{ bindings: [\"submit\"] as const, label: \"add file\" }]\n : []),\n { bindings: [\"cancel\"], excludeKeys: [\"ctrl+c\"], label: panel === \"files\" ? \"cancel\" : \"back\" },\n ...(!keys.getKeys(\"cancel\").length && hostAllows(\"\\x03\") ? [{ keys: [\"ctrl+c\"], label: \"close\" }] : []),\n ]);\n return panel === \"files\" ? `${count} selected \u2022 ${controls}` : controls;\n };\n return { action, hints, label };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["isAbsolute", "relative", "sep", "action", "key", "data", "target", "button", "relative", "isAbsolute", "sep"]
|
|
7
|
+
}
|