{
  "version": 3,
  "sources": ["../../src/manager-ui.ts", "../../src/git-ui.ts", "../../src/manager-attention.ts", "../../src/manager-recovery.ts", "../../src/operation-availability.ts", "../../src/manager-state.ts", "../../src/sync-setups-ui.ts", "../../src/secret-input.ts", "../../src/s3-credentials-ui.ts", "../../src/settings-ui.ts", "../../src/storage-connections-ui.ts", "../../src/webdav-ui.ts"],
  "sourcesContent": ["import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { type ActionMenuItem, defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport { type RunRoute, runCancellableOperation } from \"./cancellable-operation.js\";\nimport { setSyncSetupCompletions } from \"./command.js\";\nimport {\n\tconfiguredSyncSetupNames,\n\tisCloudflareR2Endpoint,\n\tloadConfig,\n\tloadOnSwitch,\n\tloadPartialConfig,\n\tlocalConfigPath,\n\treadLocalConfigObject,\n\tsyncConfigReviewIdentity,\n} from \"./config.js\";\nimport { showAddGitTarget, showEditGitTarget, showGitSetup } from \"./git-ui.js\";\nimport {\n\tattentionMainMenuItems,\n\tblockedSyncMenuItem,\n\ttype SyncManagerAttentionOptions,\n\tshowManagerAttention,\n} from \"./manager-attention.js\";\nimport {\n\terrorMessage,\n\townRecord,\n\trequiredExistingBucket,\n\trequiredInput,\n\tsafeTerminalText,\n} from \"./manager-helpers.js\";\nimport { recoverSyncAccess } from \"./manager-recovery.js\";\nimport { dispatchManagerResult } from \"./manager-result-dispatcher.js\";\nimport { backendStorageDescription, describeManagerState } from \"./manager-state.js\";\nimport { operationCanRecover } from \"./operation-availability.js\";\nimport { chooseS3Credentials } from \"./s3-credentials-ui.js\";\nimport {\n\taddSyncSetup,\n\tremoveSyncSetup,\n\tsaveNewV3Settings,\n\tupdateSyncSetup,\n} from \"./settings-management.js\";\nimport { showSyncSettings } from \"./settings-ui.js\";\nimport { useSyncSetup } from \"./setup-switch.js\";\nimport { showAddStorageConnection, showStorageConnections } from \"./storage-connections-ui.js\";\nimport { DEFAULT_SYNC_INCLUDE, syncIncludeSelection } from \"./sync-policy.js\";\nimport { showSyncSetups } from \"./sync-setups-ui.js\";\nimport type { AnySyncConfig } from \"./types.js\";\nimport { showAddWebDavTarget, showEditWebDavTarget, showWebDavSetup } from \"./webdav-ui.js\";\n\nexport async function showSyncManager(\n\tctx: ExtensionCommandContext,\n\trunRoute: RunRoute,\n\tsessionSignal?: AbortSignal,\n\toptions: SyncManagerAttentionOptions = {},\n): Promise<void> {\n\tif (!ctx.hasUI) {\n\t\tawait runRoute(\"help\");\n\t\treturn;\n\t}\n\ttype Screen = \"main\" | \"more\" | \"recovery\";\n\ttype Action =\n\t\t| \"review-attention\"\n\t\t| \"sync\"\n\t\t| \"switch\"\n\t\t| \"diff\"\n\t\t| \"settings\"\n\t\t| \"pull\"\n\t\t| \"push\"\n\t\t| \"setups\"\n\t\t| \"connections\"\n\t\t| \"history\"\n\t\t| \"doctor\"\n\t\t| \"unlock\"\n\t\t| \"recover\"\n\t\t| \"refresh\"\n\t\t| \"help\"\n\t\t| \"init\"\n\t\t| \"back\";\n\tinterface State {\n\t\tmanager: Awaited<ReturnType<typeof describeManagerState>>;\n\t}\n\tconst menu = defineMenu<State, Screen, Action, ExtensionCommandContext>({\n\t\tstart: \"main\",\n\t\tscreens: {\n\t\t\tmain: ({ state }) => {\n\t\t\t\tconst attentionItems = attentionMainMenuItems(state.manager);\n\t\t\t\tconst managerItems = state.manager.actions.map(\n\t\t\t\t\t(label) => blockedSyncMenuItem(label, state.manager) ?? syncMainMenuItem(label),\n\t\t\t\t);\n\t\t\t\tconst operationFirst =\n\t\t\t\t\tstate.manager.operation !== undefined && state.manager.operation.kind !== \"free\";\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\ttitle: \"Manage sync\",\n\t\t\t\t\tlines: state.manager.title.split(\"\\n\").slice(1),\n\t\t\t\t\titems: operationFirst\n\t\t\t\t\t\t? [...managerItems, ...attentionItems]\n\t\t\t\t\t\t: [...attentionItems, ...managerItems],\n\t\t\t\t\thint: \"close\",\n\t\t\t\t};\n\t\t\t},\n\t\t\tmore: () => ({\n\t\t\t\tkind: \"actions\",\n\t\t\t\ttitle: \"More options\",\n\t\t\t\titems: [\n\t\t\t\t\t{ id: \"pull\", label: \"Pull from remote\u2026\", action: \"pull\" },\n\t\t\t\t\t{ id: \"push\", label: \"Push to remote\u2026\", action: \"push\" },\n\t\t\t\t\t{ id: \"setups\", label: \"Sync setups\u2026\", action: \"setups\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"connections\",\n\t\t\t\t\t\tlabel: \"Storage connections\u2026\",\n\t\t\t\t\t\taction: \"connections\",\n\t\t\t\t\t},\n\t\t\t\t\t{ id: \"recovery\", label: \"History & recovery\u2026\", to: \"recovery\" },\n\t\t\t\t\t{ id: \"help\", label: \"Help\", action: \"help\" },\n\t\t\t\t\t{ id: \"back\", label: \"Back\", action: \"back\" },\n\t\t\t\t],\n\t\t\t\thint: \"back\",\n\t\t\t}),\n\t\t\trecovery: ({ state }) => ({\n\t\t\t\tkind: \"actions\",\n\t\t\t\ttitle: \"History & recovery\",\n\t\t\t\titems: [\n\t\t\t\t\t{ id: \"history\", label: \"Browse history\", action: \"history\" },\n\t\t\t\t\t{ id: \"doctor\", label: \"Check setup\", action: \"doctor\" },\n\t\t\t\t\t...(state.manager.operation && operationCanRecover(state.manager.operation)\n\t\t\t\t\t\t? [{ id: \"unlock\", label: \"Recover stale operation\", action: \"unlock\" as const }]\n\t\t\t\t\t\t: []),\n\t\t\t\t\t{ id: \"back\", label: \"Back\", action: \"back\" },\n\t\t\t\t],\n\t\t\t\thint: \"back\",\n\t\t\t}),\n\t\t},\n\t\tactions: {\n\t\t\t\"review-attention\": async () => {\n\t\t\t\tconst attention = options.getAttention?.();\n\t\t\t\tif (!attention) return { kind: \"stay\" };\n\t\t\t\tconst disposition = await showManagerAttention(\n\t\t\t\t\tctx,\n\t\t\t\t\tattention,\n\t\t\t\t\trunRoute,\n\t\t\t\t\tsessionSignal,\n\t\t\t\t\t() => options.onSelectionResolved?.(attention),\n\t\t\t\t);\n\t\t\t\treturn { kind: disposition };\n\t\t\t},\n\t\t\tsync: async () => {\n\t\t\t\tconst pendingAttention = options.getAttention?.();\n\t\t\t\tif (pendingAttention) {\n\t\t\t\t\tconst activeConfig = await loadConfig();\n\t\t\t\t\tif (sessionSignal?.aborted) return { kind: \"close\" };\n\t\t\t\t\tif (pendingAttention.decision.setupName === activeConfig.setupName) {\n\t\t\t\t\t\tctx.ui.notify(\"Review synced content before starting Sync now.\", \"warning\");\n\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst result = await runCancellableOperation(\n\t\t\t\t\tctx,\n\t\t\t\t\t\"Checking current sync setup\u2026\",\n\t\t\t\t\t\"sync\",\n\t\t\t\t\trunRoute,\n\t\t\t\t\t{\n\t\t\t\t\t\tcommitAware: true,\n\t\t\t\t\t\tsignal: sessionSignal,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst disposition = await dispatchManagerResult(\n\t\t\t\t\tctx,\n\t\t\t\t\tresult,\n\t\t\t\t\t\"sync\",\n\t\t\t\t\trunRoute,\n\t\t\t\t\tsessionSignal,\n\t\t\t\t);\n\t\t\t\treturn disposition.kind === \"close\" ? { kind: \"close\" } : { kind: \"stay\" };\n\t\t\t},\n\t\t\tswitch: async () => {\n\t\t\t\tconst result = await showSetupSwitcher(ctx, runRoute, undefined, sessionSignal);\n\t\t\t\treturn result === \"pull-attempted\" || result === \"closed\"\n\t\t\t\t\t? { kind: \"close\" }\n\t\t\t\t\t: { kind: \"stay\" };\n\t\t\t},\n\t\t\tdiff: async () => {\n\t\t\t\tconst result = await runCancellableOperation(\n\t\t\t\t\tctx,\n\t\t\t\t\t\"Checking current sync setup\u2026\",\n\t\t\t\t\t\"diff\",\n\t\t\t\t\trunRoute,\n\t\t\t\t\t{ signal: sessionSignal },\n\t\t\t\t);\n\t\t\t\treturn result.kind === \"closed\" ? { kind: \"close\" } : { kind: \"stay\" };\n\t\t\t},\n\t\t\tsettings: async () => {\n\t\t\t\tawait showSyncSettings(ctx, runRoute, sessionSignal);\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\tpull: async () => {\n\t\t\t\tconst result = await runCancellableOperation(\n\t\t\t\t\tctx,\n\t\t\t\t\t\"Checking remote changes\u2026\",\n\t\t\t\t\t\"pull\",\n\t\t\t\t\trunRoute,\n\t\t\t\t\t{\n\t\t\t\t\t\tcommitAware: true,\n\t\t\t\t\t\tcancelledMessage: \"Pull check cancelled; no local files were changed.\",\n\t\t\t\t\t\tsignal: sessionSignal,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst disposition = await dispatchManagerResult(\n\t\t\t\t\tctx,\n\t\t\t\t\tresult,\n\t\t\t\t\t\"pull\",\n\t\t\t\t\trunRoute,\n\t\t\t\t\tsessionSignal,\n\t\t\t\t);\n\t\t\t\treturn disposition.kind === \"close\" ? { kind: \"close\" } : { kind: \"stay\" };\n\t\t\t},\n\t\t\tpush: async () => {\n\t\t\t\tconst result = await runCancellableOperation(\n\t\t\t\t\tctx,\n\t\t\t\t\t\"Preparing push preview\u2026\",\n\t\t\t\t\t\"push\",\n\t\t\t\t\trunRoute,\n\t\t\t\t\t{\n\t\t\t\t\t\tcommitAware: true,\n\t\t\t\t\t\tcancelledMessage: \"Push preparation cancelled; no remote files were changed.\",\n\t\t\t\t\t\tsignal: sessionSignal,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst disposition = await dispatchManagerResult(\n\t\t\t\t\tctx,\n\t\t\t\t\tresult,\n\t\t\t\t\t\"push\",\n\t\t\t\t\trunRoute,\n\t\t\t\t\tsessionSignal,\n\t\t\t\t);\n\t\t\t\treturn disposition.kind === \"close\" ? { kind: \"close\" } : { kind: \"stay\" };\n\t\t\t},\n\t\t\tsetups: async () => {\n\t\t\t\tconst result = await showSyncSetupManager(ctx, runRoute, sessionSignal);\n\t\t\t\treturn result === \"exit\" ? { kind: \"close\" } : { kind: \"stay\" };\n\t\t\t},\n\t\t\tconnections: async () => {\n\t\t\t\tawait showStorageConnections(ctx, sessionSignal);\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\thistory: async () => {\n\t\t\t\tawait runRoute(\"history\");\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\tdoctor: async () => {\n\t\t\t\tawait runRoute(\"doctor\");\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\tunlock: async ({ state, signal: actionSignal }) => {\n\t\t\t\tconst result = await recoverSyncAccess(\n\t\t\t\t\tctx,\n\t\t\t\t\tstate.manager,\n\t\t\t\t\trunRoute,\n\t\t\t\t\tsessionSignal,\n\t\t\t\t\tactionSignal,\n\t\t\t\t);\n\t\t\t\tif (result === \"close\") return { kind: \"close\" };\n\t\t\t\treturn result === \"restored\" ? { kind: \"to\", screen: \"main\" } : { kind: \"stay\" };\n\t\t\t},\n\t\t\trecover: async ({ state, signal: actionSignal }) => {\n\t\t\t\tconst result = await recoverSyncAccess(\n\t\t\t\t\tctx,\n\t\t\t\t\tstate.manager,\n\t\t\t\t\trunRoute,\n\t\t\t\t\tsessionSignal,\n\t\t\t\t\tactionSignal,\n\t\t\t\t);\n\t\t\t\treturn { kind: result === \"close\" ? \"close\" : \"stay\" };\n\t\t\t},\n\t\t\trefresh: async () => ({ kind: \"stay\" }),\n\t\t\thelp: async () => {\n\t\t\t\tawait runRoute(\"help\");\n\t\t\t\treturn { kind: \"close\" };\n\t\t\t},\n\t\t\tinit: async () => {\n\t\t\t\tawait runRoute(\"init\");\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\tback: async () => ({ kind: \"back\" }),\n\t\t},\n\t});\n\tawait runMenu(ctx, menu, {\n\t\tgetState: async () => {\n\t\t\tconst pendingAttention = options.getAttention?.();\n\t\t\tconst manager = await describeManagerState(sessionSignal, pendingAttention);\n\t\t\tif (pendingAttention && options.getAttention?.() === pendingAttention && !manager.attention) {\n\t\t\t\toptions.onSelectionResolved?.(pendingAttention);\n\t\t\t}\n\t\t\treturn { manager };\n\t\t},\n\t\tsignal: sessionSignal,\n\t\tisCurrent: () => !sessionSignal?.aborted,\n\t});\n}\n\nfunction syncMainMenuItem(\n\tlabel: string,\n): ActionMenuItem<\n\t\"main\" | \"more\" | \"recovery\",\n\t| \"sync\"\n\t| \"switch\"\n\t| \"diff\"\n\t| \"settings\"\n\t| \"setups\"\n\t| \"connections\"\n\t| \"recover\"\n\t| \"refresh\"\n\t| \"help\"\n\t| \"init\"\n> {\n\tif (label === \"More\u2026\") return { id: \"more\", label, to: \"more\" };\n\tif (label === \"History & recovery\u2026\") return { id: \"recovery\", label, to: \"recovery\" };\n\tconst actions = new Map<\n\t\tstring,\n\t\t| \"sync\"\n\t\t| \"switch\"\n\t\t| \"diff\"\n\t\t| \"settings\"\n\t\t| \"setups\"\n\t\t| \"connections\"\n\t\t| \"recover\"\n\t\t| \"refresh\"\n\t\t| \"help\"\n\t\t| \"init\"\n\t>([\n\t\t[\"Sync now (recommended)\", \"sync\"],\n\t\t[\"Switch sync setup\", \"switch\"],\n\t\t[\"Status & changes\", \"diff\"],\n\t\t[\"Settings\", \"settings\"],\n\t\t[\"Restore sync access\u2026 (recommended)\", \"recover\"],\n\t\t[\"Refresh operation status\", \"refresh\"],\n\t\t[\"Sync setups\u2026\", \"setups\"],\n\t\t[\"Storage connections\u2026\", \"connections\"],\n\t\t[\"Help\", \"help\"],\n\t\t[\"Set up sync\", \"init\"],\n\t\t[\"Use existing settings\", \"init\"],\n\t]);\n\treturn { id: actions.get(label) ?? \"help\", label, action: actions.get(label) ?? \"help\" };\n}\n\nexport async function showSetupWizard(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n\tif (ctx.mode !== \"tui\") {\n\t\tctx.ui.notify(\n\t\t\t`Guided sync setup requires TUI mode for masked credential input. Create version 3 settings in ${safeTerminalText(localConfigPath())}.`,\n\t\t\t\"warning\",\n\t\t);\n\t\treturn false;\n\t}\n\tconst preset = await ctx.ui.select(\n\t\t\"Set up sync\\n\\nWhere will Pi settings be stored?\",\n\t\t[\"Cloudflare R2\", \"Other S3-compatible storage\", \"WebDAV\", \"Git\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tif (signal?.aborted || !preset || preset === \"Cancel\") return false;\n\tconst targetName = await chooseInitialTargetName(ctx, signal);\n\tif (!targetName) return false;\n\tif (preset === \"WebDAV\") {\n\t\tconst saved = await showWebDavSetup(ctx, targetName, signal);\n\t\tif (signal?.aborted) return false;\n\t\tif (saved) await refreshTargetCompletions();\n\t\treturn saved;\n\t}\n\tif (preset === \"Git\") {\n\t\tconst saved = await showGitSetup(ctx, targetName, signal);\n\t\tif (signal?.aborted) return false;\n\t\tif (saved) await refreshTargetCompletions();\n\t\treturn saved;\n\t}\n\tconst endpoint = await requiredInput(\n\t\tctx,\n\t\tpreset === \"Cloudflare R2\" ? \"Cloudflare R2 endpoint\" : \"S3-compatible endpoint\",\n\t\tpreset === \"Cloudflare R2\"\n\t\t\t? \"https://<account-id>.r2.cloudflarestorage.com\"\n\t\t\t: \"https://s3.example.com\",\n\t\tsignal,\n\t);\n\tif (!endpoint) return false;\n\tlet region = \"auto\";\n\tif (preset !== \"Cloudflare R2\") {\n\t\tconst selectedRegion = await requiredInput(ctx, \"Storage region\", \"us-east-1\", signal);\n\t\tif (!selectedRegion) return false;\n\t\tregion = selectedRegion;\n\t}\n\tconst location = await chooseInitialRemoteLocation(ctx, preset, targetName, signal);\n\tif (!location) return false;\n\tconst { connectionName, bucket, path: storagePath } = location;\n\tconst credentials = await chooseS3Credentials(ctx, signal);\n\tif (!credentials) return false;\n\tconst contentChoice = await ctx.ui.select(\n\t\t\"Choose an initial sync preset\",\n\t\t[\"Recommended Pi settings\", \"Minimal settings\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tif (signal?.aborted || !contentChoice || contentChoice === \"Cancel\") return false;\n\tconst syncFiles =\n\t\tcontentChoice === \"Minimal settings\"\n\t\t\t? [\"settings.json\", \"AGENTS.md\"]\n\t\t\t: [...DEFAULT_SYNC_INCLUDE];\n\tconst automaticChoice = await ctx.ui.select(\n\t\t\"Automatic sync for this setup\",\n\t\t[\"Enable automatic sync\", \"Keep automatic sync off\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tif (signal?.aborted || !automaticChoice || automaticChoice === \"Cancel\") return false;\n\tconst sessionChoice = await ctx.ui.select(\n\t\t\"Session conversations\\n\\nSessions can contain prompts, tool output, paths, screenshots, and secrets.\",\n\t\t[\"Keep sessions off (recommended)\", \"Include session conversations\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tif (signal?.aborted || !sessionChoice || sessionChoice === \"Cancel\") return false;\n\tconst syncSessions = sessionChoice === \"Include session conversations\";\n\tif (\n\t\tsyncSessions &&\n\t\t!(await ctx.ui.confirm(\n\t\t\t\"Include session conversations?\",\n\t\t\t\"I understand that session JSONL can contain prompts, tool output, paths, screenshots, and secrets.\",\n\t\t\t{ signal },\n\t\t))\n\t) {\n\t\treturn false;\n\t}\n\tconst autoSync = automaticChoice === \"Enable automatic sync\";\n\tconst choice = await ctx.ui.select(\n\t\t[\n\t\t\t\"Review sync setup\",\n\t\t\t\"\",\n\t\t\t`Sync setup: ${safeTerminalText(targetName)}`,\n\t\t\t`Storage connection: ${safeTerminalText(connectionName)} (${preset})`,\n\t\t\t`Endpoint: ${safeTerminalText(endpoint)}`,\n\t\t\t`Bucket: ${safeTerminalText(bucket)}`,\n\t\t\t`Storage location: ${safeTerminalText(storagePath)}`,\n\t\t\t\"Bucket must already exist. pi-sync will not create it.\",\n\t\t\t`Included content: ${syncFiles.length} built-in groups \u00B7 Sessions: ${syncSessions ? \"On \u2014 privacy warning acknowledged\" : \"Off\"}`,\n\t\t\t`Automatic sync: ${autoSync ? \"On\" : \"Off\"}`,\n\t\t\t`Credentials: ${safeTerminalText(credentials.summary)}`,\n\t\t].join(\"\\n\"),\n\t\t[\"Save sync setup\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tif (signal?.aborted || choice !== \"Save sync setup\") return false;\n\tawait saveNewV3Settings(\n\t\t{\n\t\t\tsetupName: targetName,\n\t\t\tconnectionName,\n\t\t\tconnection: {\n\t\t\t\ttype: \"s3\",\n\t\t\t\tendpoint,\n\t\t\t\tregion,\n\t\t\t\tcredentials: {\n\t\t\t\t\taccessKeyId: credentials.profileFields.accessKeyId ?? \"\",\n\t\t\t\t\tsecretAccessKey: credentials.profileFields.secretAccessKey ?? \"\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tsetup: {\n\t\t\t\tstorage: { connection: connectionName, bucket, path: storagePath },\n\t\t\t\tsync: {\n\t\t\t\t\tinclude: [...syncFiles, ...(syncSessions ? [\"sessions\"] : [])],\n\t\t\t\t\tautomatic: autoSync,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tsignal,\n\t);\n\tif (signal?.aborted) return false;\n\tawait refreshTargetCompletions();\n\tif (signal?.aborted) return true;\n\tctx.ui.notify(\n\t\tcredentials.ready\n\t\t\t? `Sync setup \u201C${safeTerminalText(targetName)}\u201D is ready. Use Sync now when ready.`\n\t\t\t: `Saved sync setup \u201C${safeTerminalText(targetName)}\u201D; add credentials before syncing.`,\n\t\t\"info\",\n\t);\n\treturn true;\n}\n\nasync function selectSetupForSwitch(\n\tctx: ExtensionCommandContext,\n\traw: Record<string, unknown>,\n\ttargets: Record<string, unknown>,\n\tactive: string | undefined,\n\tsignal?: AbortSignal,\n) {\n\tlet selectedName: string | undefined;\n\tconst nameById = new Map<string, string>();\n\tconst profiles = ownRecord(raw.storageConnections);\n\tconst menu = defineMenu<undefined, \"setups\", \"select\", ExtensionCommandContext>({\n\t\tstart: \"setups\",\n\t\tscreens: {\n\t\t\tsetups: () => ({\n\t\t\t\tkind: \"actions\",\n\t\t\t\ttitle: \"Switch sync setup\",\n\t\t\t\tlines: [`Current sync setup: ${safeTerminalText(active ?? \"none\")}`],\n\t\t\t\titems: Object.keys(targets)\n\t\t\t\t\t.sort((left, right) => left.localeCompare(right))\n\t\t\t\t\t.map((candidate, index) => {\n\t\t\t\t\t\tconst target = ownRecord(targets[candidate]);\n\t\t\t\t\t\tconst storage = ownRecord(target?.storage);\n\t\t\t\t\t\tconst profileName =\n\t\t\t\t\t\t\ttypeof storage?.connection === \"string\" ? storage.connection : undefined;\n\t\t\t\t\t\tconst profile = profileName && profiles ? ownRecord(profiles[profileName]) : undefined;\n\t\t\t\t\t\tconst location = profile\n\t\t\t\t\t\t\t? profile.type === \"git\"\n\t\t\t\t\t\t\t\t? `${String(storage?.branch ?? \"missing branch\")}:${String(storage?.path ?? \"missing path\")}`\n\t\t\t\t\t\t\t\t: profile.type === \"s3\"\n\t\t\t\t\t\t\t\t\t? `${String(storage?.bucket ?? \"missing bucket\")}/${String(storage?.path ?? \"missing path\")}`\n\t\t\t\t\t\t\t\t\t: String(storage?.path ?? \"missing path\")\n\t\t\t\t\t\t\t: `invalid: missing connection ${profileName ?? \"reference\"}`;\n\t\t\t\t\t\tconst id = `setup:${index}`;\n\t\t\t\t\t\tnameById.set(id, candidate);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\tlabel: `${safeTerminalText(candidate)}${candidate === active ? \" (current)\" : \"\"}`,\n\t\t\t\t\t\t\tdescription: `${safeTerminalText(profileName ?? \"unknown\")} \u00B7 ${safeTerminalText(location)}`,\n\t\t\t\t\t\t\taction: \"select\" as const,\n\t\t\t\t\t\t};\n\t\t\t\t\t}),\n\t\t\t\thint: \"close\",\n\t\t\t}),\n\t\t},\n\t\tactions: {\n\t\t\tselect: async ({ itemId }) => {\n\t\t\t\tselectedName = nameById.get(itemId);\n\t\t\t\treturn { kind: \"close\" };\n\t\t\t},\n\t\t},\n\t});\n\tawait runMenu(ctx, menu, {\n\t\tgetState: () => undefined,\n\t\tsignal,\n\t\tisCurrent: () => !signal?.aborted,\n\t});\n\treturn selectedName;\n}\n\nasync function showSetupSwitcher(\n\tctx: ExtensionCommandContext,\n\trunRoute: RunRoute,\n\tselectedName?: string,\n\tsignal?: AbortSignal,\n) {\n\tconst raw = await readLocalConfigObject();\n\tif (signal?.aborted) return false;\n\tif (raw?.version !== 3) {\n\t\tctx.ui.notify(\"Add a second sync setup before switching setups.\", \"info\");\n\t\treturn false;\n\t}\n\tconst targets = ownRecord(raw.syncSetups);\n\tif (!targets) {\n\t\tctx.ui.notify(\"No sync setups are configured.\", \"warning\");\n\t\treturn false;\n\t}\n\tconst active = typeof raw.activeSyncSetup === \"string\" ? raw.activeSyncSetup : undefined;\n\tlet name = selectedName;\n\tif (!name) {\n\t\tname = await selectSetupForSwitch(ctx, raw, targets, active, signal);\n\t\tif (!name) return false;\n\t}\n\tif (!name || !Object.hasOwn(targets, name)) {\n\t\tctx.ui.notify(\n\t\t\t`Sync setup \u201C${safeTerminalText(name ?? \"unknown\")}\u201D no longer exists.`,\n\t\t\t\"warning\",\n\t\t);\n\t\treturn false;\n\t}\n\tif (name === active) {\n\t\tctx.ui.notify(`Sync setup \u201C${safeTerminalText(name)}\u201D is already current.`, \"info\");\n\t\treturn false;\n\t}\n\tlet config: AnySyncConfig;\n\ttry {\n\t\tconfig = await loadConfig(name);\n\t\tif (signal?.aborted) return false;\n\t} catch (error) {\n\t\tctx.ui.notify(\n\t\t\t`Cannot use sync setup \u201C${safeTerminalText(name)}\u201D: ${safeTerminalText(errorMessage(error))}`,\n\t\t\t\"error\",\n\t\t);\n\t\treturn false;\n\t}\n\tconst onSwitch = await loadOnSwitch();\n\tif (signal?.aborted) return false;\n\tconst switchEffect =\n\t\tonSwitch === \"ask-before-pull\"\n\t\t\t? \"After switching, pi-sync will ask whether to review a pull for this setup.\"\n\t\t\t: onSwitch === \"pull-after-switch\"\n\t\t\t\t? \"After switching, pi-sync will check this setup and show exact changes before applying them.\"\n\t\t\t\t: \"After switching, pi-sync will not pull or modify synced files.\";\n\tconst confirmed = await ctx.ui.confirm(\n\t\t\"Switch sync setup?\",\n\t\t[\n\t\t\t`From: ${safeTerminalText(active ?? \"none\")}`,\n\t\t\t`To: ${safeTerminalText(name)}`,\n\t\t\t`Storage: ${backendStorageDescription(config)}`,\n\t\t\t`Included content: ${config.include.length} paths`,\n\t\t\t`Automatic sync: ${config.automatic ? \"On\" : \"Off\"} \u00B7 Sessions: ${config.include.includes(\"sessions\") ? \"On\" : \"Off\"}`,\n\t\t\t\"\",\n\t\t\tswitchEffect,\n\t\t].join(\"\\n\"),\n\t\t{ signal },\n\t);\n\tif (signal?.aborted || !confirmed) return false;\n\ttry {\n\t\tlet pullClosed = false;\n\t\tconst result = await useSyncSetup(\n\t\t\tctx,\n\t\t\tname,\n\t\t\tasync (selectedTarget) => {\n\t\t\t\tconst pullResult = await runCancellableOperation(\n\t\t\t\t\tctx,\n\t\t\t\t\t`Pulling sync setup \u201C${safeTerminalText(name)}\u201D\u2026`,\n\t\t\t\t\t\"pull\",\n\t\t\t\t\trunRoute,\n\t\t\t\t\t{\n\t\t\t\t\t\tcommitAware: true,\n\t\t\t\t\t\tcancelledMessage: null,\n\t\t\t\t\t\ttarget: selectedTarget,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst disposition = await dispatchManagerResult(ctx, pullResult, \"pull\", runRoute, signal);\n\t\t\t\tif (pullResult.kind === \"closed\" || pullResult.kind.endsWith(\"required\")) {\n\t\t\t\t\tpullClosed = disposition.kind === \"close\";\n\t\t\t\t}\n\t\t\t\tif (disposition.appliedRoute === \"pull\") return \"applied\";\n\t\t\t\tif (pullResult.kind === \"completed\") return pullResult.outcome;\n\t\t\t\treturn pullResult.kind === \"cancelled\" ? \"cancelled\" : undefined;\n\t\t\t},\n\t\t\tonSwitch,\n\t\t\tsignal,\n\t\t\tsyncConfigReviewIdentity(config),\n\t\t);\n\t\tif (pullClosed) return \"closed\";\n\t\treturn result.pullApplied ? \"pull-attempted\" : \"switched\";\n\t} catch (error) {\n\t\tif (signal?.aborted) return false;\n\t\tctx.ui.notify(\n\t\t\t`Sync setup \u201C${safeTerminalText(name)}\u201D was not switched: ${safeTerminalText(errorMessage(error))}`,\n\t\t\t\"error\",\n\t\t);\n\t\treturn false;\n\t}\n}\n\nasync function showSyncSetupManager(\n\tctx: ExtensionCommandContext,\n\trunRoute: RunRoute,\n\tsignal?: AbortSignal,\n) {\n\treturn showSyncSetups(\n\t\tctx,\n\t\t{\n\t\t\tadd: async (setupSignal) => {\n\t\t\t\tawait showAddTarget(ctx, setupSignal);\n\t\t\t},\n\t\t\tedit: async (name, setupSignal) => {\n\t\t\t\tawait showEditTarget(ctx, name, setupSignal);\n\t\t\t},\n\t\t\tmakeCurrent: async (name, setupSignal) => {\n\t\t\t\tconst result = await showSetupSwitcher(ctx, runRoute, name, setupSignal);\n\t\t\t\treturn result === \"pull-attempted\" || result === \"closed\" ? \"exit\" : undefined;\n\t\t\t},\n\t\t\tremove: async (name, setupSignal) => {\n\t\t\t\tawait showRemoveTarget(ctx, name, setupSignal);\n\t\t\t},\n\t\t},\n\t\tsignal,\n\t);\n}\n\nasync function showAddTarget(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n\tlet raw = await readLocalConfigObject();\n\tif (signal?.aborted) return;\n\tif (!raw) return void ctx.ui.notify(\"Set up the first sync setup before adding another.\", \"info\");\n\tif (raw.version !== 3) {\n\t\tctx.ui.notify(\n\t\t\t\"Version 1 and version 2 settings are unsupported and are never migrated.\",\n\t\t\t\"error\",\n\t\t);\n\t\treturn;\n\t}\n\tlet profiles = ownRecord(raw.storageConnections) ?? {};\n\tconst name = await requiredInput(ctx, \"Name the new sync setup\", \"work\", signal);\n\tif (!name) return;\n\tconst createConnection = \"Add a new storage connection\u2026\";\n\tlet profile = await ctx.ui.select(\n\t\t\"Choose a storage connection\",\n\t\t[...Object.keys(profiles).sort(), createConnection, \"Cancel\"],\n\t\t{ signal },\n\t);\n\tif (!profile || profile === \"Cancel\") return;\n\tif (profile === createConnection) {\n\t\tconst previousNames = new Set(Object.keys(profiles));\n\t\tif (!(await showAddStorageConnection(ctx, signal))) return;\n\t\tif (signal?.aborted) return;\n\t\traw = (await readLocalConfigObject()) ?? raw;\n\t\tif (signal?.aborted) return;\n\t\tprofiles = ownRecord(raw.storageConnections) ?? {};\n\t\tprofile = Object.keys(profiles).find((candidate) => !previousNames.has(candidate));\n\t\tif (!profile) return;\n\t}\n\tconst storageKind = ownRecord(profiles[profile])?.type;\n\tif (storageKind === \"webdav\") {\n\t\tconst saved = await showAddWebDavTarget(ctx, name, profile, signal);\n\t\tif (signal?.aborted) return;\n\t\tif (saved) await refreshTargetCompletions();\n\t\treturn;\n\t}\n\tif (storageKind === \"git\") {\n\t\tconst saved = await showAddGitTarget(ctx, name, profile, signal);\n\t\tif (signal?.aborted) return;\n\t\tif (saved) await refreshTargetCompletions();\n\t\treturn;\n\t}\n\tconst location = await chooseAdditionalRemoteLocation(ctx, raw, profile, name, signal);\n\tif (!location) return;\n\tconst { bucket, path: storagePath } = location;\n\tconst preset = await ctx.ui.select(\n\t\t\"Choose included content\",\n\t\t[\"Recommended Pi settings\", \"Minimal settings\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tif (!preset || preset === \"Cancel\") return;\n\tconst syncFiles =\n\t\tpreset === \"Minimal settings\" ? [\"settings.json\", \"AGENTS.md\"] : [...DEFAULT_SYNC_INCLUDE];\n\tconst overlapsExistingTarget = Object.values(ownRecord(raw.syncSetups) ?? {}).some((value) => {\n\t\tconst existing = ownRecord(value);\n\t\tconst sync = ownRecord(existing?.sync);\n\t\tconst selected = syncIncludeSelection(\n\t\t\tArray.isArray(sync?.include) ? sync.include : [],\n\t\t).builtIns;\n\t\treturn selected.some((item) => syncFiles.includes(item));\n\t});\n\tconst choice = await ctx.ui.select(\n\t\t[\n\t\t\t\"Review new sync setup\",\n\t\t\t\"\",\n\t\t\t`Sync setup: ${safeTerminalText(name)}`,\n\t\t\t`Storage connection: ${safeTerminalText(profile)}`,\n\t\t\t`Bucket: ${safeTerminalText(bucket)}`,\n\t\t\t`Storage location: ${safeTerminalText(storagePath)}`,\n\t\t\t\"Bucket must already exist. pi-sync will not create it.\",\n\t\t\t`Included content: ${syncFiles.length} built-in groups \u00B7 Sessions: Off`,\n\t\t\t...(overlapsExistingTarget\n\t\t\t\t? [\n\t\t\t\t\t\t\"Warning: this setup shares local content with another setup; only the current setup syncs automatically.\",\n\t\t\t\t\t]\n\t\t\t\t: []),\n\t\t\t\"Adding this setup does not sync or modify remote data.\",\n\t\t].join(\"\\n\"),\n\t\t[\"Add sync setup\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tif (signal?.aborted || choice !== \"Add sync setup\") return;\n\tawait addSyncSetup(\n\t\tname,\n\t\t{\n\t\t\tstorage: { connection: profile, bucket, path: storagePath },\n\t\t\tsync: { include: syncFiles, automatic: true },\n\t\t},\n\t\tsignal,\n\t);\n\tif (signal?.aborted) return;\n\tawait refreshTargetCompletions();\n\tctx.ui.notify(`Added sync setup \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n}\n\nasync function showEditTarget(ctx: ExtensionCommandContext, name: string, signal?: AbortSignal) {\n\tconst partial = await loadPartialConfig(name);\n\tif (signal?.aborted) return;\n\tif (!partial.setupName) {\n\t\tctx.ui.notify(\"Create version 3 settings before editing a named sync setup.\", \"info\");\n\t\treturn;\n\t}\n\tif (partial.storageKind === \"webdav\") {\n\t\tawait showEditWebDavTarget(ctx, partial, signal);\n\t\treturn;\n\t}\n\tif (partial.storageKind === \"git\") {\n\t\tawait showEditGitTarget(ctx, partial, signal);\n\t\treturn;\n\t}\n\tconst bucket = await requiredInput(ctx, \"Bucket\", partial.bucket ?? \"pi-sync\", signal);\n\tif (!bucket) return;\n\tconst storagePath = await requiredInput(ctx, \"Storage path\", partial.storagePath, signal);\n\tif (!storagePath) return;\n\tconst normalizedPath = storagePath.replace(/^\\/+|\\/+$/gu, \"\");\n\tconst choice = await ctx.ui.select(\n\t\t[\n\t\t\t`Review sync setup \u201C${safeTerminalText(partial.setupName)}\u201D`,\n\t\t\t\"\",\n\t\t\t`Bucket: ${safeTerminalText(partial.bucket ?? \"missing\")} \u2192 ${safeTerminalText(bucket)}`,\n\t\t\t`Storage path: ${safeTerminalText(partial.storagePath ?? \"missing\")} \u2192 ${safeTerminalText(normalizedPath)}`,\n\t\t\t\"Saving changes the future storage location only; it does not move or delete remote data.\",\n\t\t].join(\"\\n\"),\n\t\t[\"Save sync setup\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tif (signal?.aborted || choice !== \"Save sync setup\") return;\n\tawait updateSyncSetup(\n\t\tpartial.setupName,\n\t\t(setup) => {\n\t\t\tif (typeof setup.storage.bucket !== \"string\") {\n\t\t\t\tthrow new Error(\"Sync setup storage type changed; reopen it.\");\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...setup,\n\t\t\t\tstorage: { ...setup.storage, bucket, path: normalizedPath },\n\t\t\t};\n\t\t},\n\t\t{ expectedStorage: partial, signal },\n\t);\n\tif (signal?.aborted) return;\n\tctx.ui.notify(`Saved sync setup \u201C${safeTerminalText(partial.setupName)}\u201D.`, \"info\");\n}\n\nasync function showRemoveTarget(ctx: ExtensionCommandContext, name: string, signal?: AbortSignal) {\n\tconst confirmed = await ctx.ui.confirm(\n\t\t\"Remove sync setup?\",\n\t\t`Remove local sync setup \u201C${safeTerminalText(name)}\u201D? Remote data and history are not deleted.`,\n\t\t{ signal },\n\t);\n\tif (signal?.aborted || !confirmed) return;\n\tawait removeSyncSetup(name, signal);\n\tif (signal?.aborted) return;\n\tawait refreshTargetCompletions();\n\tctx.ui.notify(\n\t\t`Removed sync setup \u201C${safeTerminalText(name)}\u201D; remote data was not deleted.`,\n\t\t\"info\",\n\t);\n}\n\nasync function refreshTargetCompletions() {\n\tsetSyncSetupCompletions(await configuredSyncSetupNames());\n}\n\ninterface ChosenRemoteLocation {\n\tconnectionName: string;\n\tbucket: string;\n\tpath: string;\n}\n\nasync function chooseInitialTargetName(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n\tconst purpose = await ctx.ui.select(\n\t\t\"What will this sync setup be used for?\",\n\t\t[\"Personal / Home\", \"Work\", \"Custom\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tif (!purpose || purpose === \"Cancel\") return undefined;\n\tif (purpose === \"Personal / Home\") return \"home\";\n\tif (purpose === \"Work\") return \"work\";\n\treturn requiredInput(ctx, \"Name this sync setup\", \"default\", signal);\n}\n\nasync function chooseInitialRemoteLocation(\n\tctx: ExtensionCommandContext,\n\tpreset: string,\n\tsetupName: string,\n\tsignal?: AbortSignal,\n): Promise<ChosenRemoteLocation | undefined> {\n\tconst connectionName = preset === \"Cloudflare R2\" ? \"r2\" : \"s3\";\n\tconst suggested = {\n\t\tconnectionName,\n\t\tbucket: \"pi-sync\",\n\t\tpath: `pi-sync/${setupName}`,\n\t};\n\tif (preset === \"Cloudflare R2\") {\n\t\tconst choice = await ctx.ui.select(\n\t\t\t[\n\t\t\t\t\"Choose storage location\",\n\t\t\t\t\"\",\n\t\t\t\t`Suggested storage connection: ${connectionName}`,\n\t\t\t\t`Suggested bucket: ${suggested.bucket}`,\n\t\t\t\t`Remote path: ${safeTerminalText(suggested.path)}`,\n\t\t\t\t\"Bucket must already exist. pi-sync will not create it.\",\n\t\t\t].join(\"\\n\"),\n\t\t\t[\"Use suggested location (recommended)\", \"Customize remote location\", \"Cancel\"],\n\t\t\t{ signal },\n\t\t);\n\t\tif (!choice || choice === \"Cancel\") return undefined;\n\t\tif (choice === \"Use suggested location (recommended)\") return suggested;\n\t\treturn chooseCustomRemoteLocation(ctx, setupName, connectionName, true, signal);\n\t}\n\n\tconst choice = await ctx.ui.select(\n\t\t[\n\t\t\t\"Choose storage location\",\n\t\t\t\"\",\n\t\t\t`Suggested storage connection: ${connectionName}`,\n\t\t\t`Suggested path: ${safeTerminalText(suggested.path)}`,\n\t\t\t\"S3 bucket names may need to be globally unique and the bucket must already exist.\",\n\t\t].join(\"\\n\"),\n\t\t[\n\t\t\t\"Use existing bucket with suggested path (recommended)\",\n\t\t\t\"Customize remote location\",\n\t\t\t\"Cancel\",\n\t\t],\n\t\t{ signal },\n\t);\n\tif (!choice || choice === \"Cancel\") return undefined;\n\tif (choice === \"Customize remote location\") {\n\t\treturn chooseCustomRemoteLocation(ctx, setupName, connectionName, true, signal);\n\t}\n\tconst bucket = await requiredExistingBucket(ctx, \"pi-sync-your-name\", signal);\n\treturn bucket ? { ...suggested, bucket } : undefined;\n}\n\nasync function chooseAdditionalRemoteLocation(\n\tctx: ExtensionCommandContext,\n\tsettings: Record<string, unknown>,\n\tconnectionName: string,\n\tsetupName: string,\n\tsignal?: AbortSignal,\n): Promise<Omit<ChosenRemoteLocation, \"connectionName\"> | undefined> {\n\tconst setups = ownRecord(settings.syncSetups) ?? {};\n\tconst currentSetup =\n\t\ttypeof settings.activeSyncSetup === \"string\" ? settings.activeSyncSetup : undefined;\n\tconst candidates = Object.entries(setups)\n\t\t.map(([name, value]) => ({ name, storage: ownRecord(ownRecord(value)?.storage) }))\n\t\t.filter(\n\t\t\t(item): item is { name: string; storage: Record<string, unknown> } =>\n\t\t\t\titem.storage?.connection === connectionName && typeof item.storage.bucket === \"string\",\n\t\t);\n\tconst source =\n\t\tcandidates.find((item) => item.name === currentSetup) ??\n\t\tcandidates.sort((left, right) => left.name.localeCompare(right.name))[0];\n\tif (source) {\n\t\tconst sourcePath =\n\t\t\ttypeof source.storage.path === \"string\" ? source.storage.path : \"pi-sync/home\";\n\t\tconst sourceParent = sourcePath.includes(\"/\")\n\t\t\t? sourcePath.slice(0, sourcePath.lastIndexOf(\"/\"))\n\t\t\t: \"pi-sync\";\n\t\tconst suggestedPath = `${sourceParent}/${setupName}`;\n\t\tconst sameBucketLabel = `Same bucket as \u201C${safeTerminalText(source.name)}\u201D (recommended)`;\n\t\tconst choice = await ctx.ui.select(\n\t\t\t[\n\t\t\t\t`Storage location for \u201C${safeTerminalText(setupName)}\u201D`,\n\t\t\t\t\"\",\n\t\t\t\t`Recommended bucket: ${safeTerminalText(String(source.storage.bucket))}`,\n\t\t\t\t`Remote path: ${safeTerminalText(suggestedPath)}`,\n\t\t\t\t\"The complete path and local sync state remain separate.\",\n\t\t\t].join(\"\\n\"),\n\t\t\t[sameBucketLabel, \"Use a different bucket\", \"Customize remote location\", \"Cancel\"],\n\t\t\t{ signal },\n\t\t);\n\t\tif (!choice || choice === \"Cancel\") return undefined;\n\t\tif (choice === sameBucketLabel) {\n\t\t\treturn { bucket: String(source.storage.bucket), path: suggestedPath };\n\t\t}\n\t\tif (choice === \"Use a different bucket\") {\n\t\t\tconst bucket = await requiredExistingBucket(ctx, \"pi-sync\", signal);\n\t\t\treturn bucket ? { bucket, path: `pi-sync/${setupName}` } : undefined;\n\t\t}\n\t\tconst custom = await chooseCustomRemoteLocation(ctx, setupName, connectionName, false, signal);\n\t\treturn custom ? { bucket: custom.bucket, path: custom.path } : undefined;\n\t}\n\n\tconst connectionSettings = ownRecord(ownRecord(settings.storageConnections)?.[connectionName]);\n\tconst isR2 = isCloudflareR2Endpoint(String(connectionSettings?.endpoint ?? \"\"));\n\tconst suggestedPath = `pi-sync/${setupName}`;\n\tconst suggestedLabel = isR2\n\t\t? \"Use suggested location (recommended)\"\n\t\t: \"Use existing bucket with suggested path (recommended)\";\n\tconst choice = await ctx.ui.select(\n\t\t`Storage location for \u201C${safeTerminalText(setupName)}\u201D\\n\\nSuggested path: ${safeTerminalText(suggestedPath)}`,\n\t\t[suggestedLabel, \"Customize remote location\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tif (!choice || choice === \"Cancel\") return undefined;\n\tif (choice === \"Customize remote location\") {\n\t\tconst custom = await chooseCustomRemoteLocation(ctx, setupName, connectionName, false, signal);\n\t\treturn custom ? { bucket: custom.bucket, path: custom.path } : undefined;\n\t}\n\tif (isR2) return { bucket: \"pi-sync\", path: suggestedPath };\n\tconst bucket = await requiredExistingBucket(ctx, \"pi-sync-your-name\", signal);\n\treturn bucket ? { bucket, path: suggestedPath } : undefined;\n}\n\nasync function chooseCustomRemoteLocation(\n\tctx: ExtensionCommandContext,\n\tsetupName: string,\n\tinitialConnectionName: string,\n\tcustomizeConnectionName: boolean,\n\tsignal?: AbortSignal,\n): Promise<ChosenRemoteLocation | undefined> {\n\tconst connectionName = customizeConnectionName\n\t\t? await requiredInput(ctx, \"Storage connection name\", initialConnectionName, signal)\n\t\t: initialConnectionName;\n\tif (!connectionName) return undefined;\n\tconst bucket = await requiredExistingBucket(ctx, \"pi-sync\", signal);\n\tif (!bucket) return undefined;\n\tconst storagePath = await requiredInput(ctx, \"Storage path\", `pi-sync/${setupName}`, signal);\n\tif (!storagePath) return undefined;\n\treturn { connectionName, bucket, path: storagePath.replace(/^\\/+|\\/+$/gu, \"\") };\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { normalizeGitBranch, normalizeGitDirectory, normalizeGitRemote } from \"./git-config.js\";\nimport { requiredInput, safeTerminalText } from \"./manager-helpers.js\";\nimport {\n\taddStorageConnection,\n\taddSyncSetup,\n\tsaveNewV3Settings,\n\tupdateStorageConnection,\n\tupdateSyncSetup,\n} from \"./settings-management.js\";\nimport { DEFAULT_SYNC_INCLUDE } from \"./sync-policy.js\";\nimport type { PartialConfig } from \"./types.js\";\n\nexport async function showGitSetup(\n\tctx: ExtensionCommandContext,\n\ttargetName: string,\n\tsignal?: AbortSignal,\n) {\n\tconst profileName = await requiredInput(ctx, \"Name this Git storage connection\", \"git\", signal);\n\tif (!profileName) return false;\n\tconst remoteInput = await requiredInput(\n\t\tctx,\n\t\t\"Git SSH or HTTPS remote\",\n\t\t\"git@github.com:owner/private-pi-sync.git\",\n\t\tsignal,\n\t);\n\tif (!remoteInput) return false;\n\tconst destination = await promptGitDestination(ctx, targetName, signal);\n\tif (!destination) return false;\n\tconst automatic = await ctx.ui.select(\n\t\t\"Automatic sync for this setup\",\n\t\t[\"Enable automatic sync\", \"Keep automatic sync off\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tthrowIfAborted(signal);\n\tif (!automatic || automatic === \"Cancel\") return false;\n\tlet remote: string | undefined;\n\ttry {\n\t\tremote = normalizeGitRemote(remoteInput);\n\t} catch (error) {\n\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\treturn false;\n\t}\n\tif (!remote) return false;\n\tconst choice = await ctx.ui.select(\n\t\t[\n\t\t\t\"Review Git sync setup\",\n\t\t\t\"\",\n\t\t\t`Sync setup: ${safeTerminalText(targetName)}`,\n\t\t\t`Storage connection: ${safeTerminalText(profileName)} (Git)`,\n\t\t\t`Remote: ${safeGitRemote(remote)}`,\n\t\t\t`Owned branch: ${safeTerminalText(destination.branch)}`,\n\t\t\t`Storage location: ${safeTerminalText(destination.directory)}`,\n\t\t\t`Included content: ${DEFAULT_SYNC_INCLUDE.length} built-in groups \u00B7 Sessions: Off`,\n\t\t\t`Automatic sync: ${automatic === \"Enable automatic sync\" ? \"On\" : \"Off\"}`,\n\t\t\t\"Authentication: existing non-interactive Git/SSH credentials; no credentials are stored by pi-sync.\",\n\t\t\t\"The remote repository must already exist. The owned branch may be created on first push.\",\n\t\t].join(\"\\n\"),\n\t\t[\"Save setup\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tthrowIfAborted(signal);\n\tif (choice !== \"Save setup\") return false;\n\tawait saveNewV3Settings(\n\t\t{\n\t\t\tsetupName: targetName,\n\t\t\tconnectionName: profileName,\n\t\t\tconnection: { type: \"git\", remote },\n\t\t\tsetup: {\n\t\t\t\tstorage: {\n\t\t\t\t\tconnection: profileName,\n\t\t\t\t\tbranch: destination.branch,\n\t\t\t\t\tpath: destination.directory,\n\t\t\t\t},\n\t\t\t\tsync: {\n\t\t\t\t\tinclude: [...DEFAULT_SYNC_INCLUDE],\n\t\t\t\t\tautomatic: automatic === \"Enable automatic sync\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tsignal,\n\t);\n\tif (signal?.aborted) return true;\n\tctx.ui.notify(\n\t\t`Saved Git sync setup \u201C${safeTerminalText(targetName)}\u201D. Run /sync doctor.`,\n\t\t\"info\",\n\t);\n\treturn true;\n}\n\nexport async function showAddGitStorageProfile(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n\tconst name = await requiredInput(ctx, \"Name this Git storage connection\", \"git\", signal);\n\tif (!name) return false;\n\tconst remoteInput = await requiredInput(\n\t\tctx,\n\t\t\"Git SSH or HTTPS remote\",\n\t\t\"git@github.com:owner/private-pi-sync.git\",\n\t\tsignal,\n\t);\n\tif (!remoteInput) return false;\n\tlet remote: string | undefined;\n\ttry {\n\t\tremote = normalizeGitRemote(remoteInput);\n\t} catch (error) {\n\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\treturn false;\n\t}\n\tif (!remote) return false;\n\tconst choice = await ctx.ui.select(\n\t\t`Review storage connection\\n\\nName: ${safeTerminalText(name)}\\nType: Git\\nRemote: ${safeGitRemote(remote)}\\nCredentials: existing Git/SSH authentication (not stored)\\nAdding a connection does not contact the remote or start syncing.`,\n\t\t[\"Add storage connection\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tthrowIfAborted(signal);\n\tif (choice !== \"Add storage connection\") return false;\n\tawait addStorageConnection(name, { type: \"git\", remote }, signal);\n\tif (signal?.aborted) return true;\n\tctx.ui.notify(`Added storage connection \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n\treturn true;\n}\n\nexport async function showEditGitStorageProfile(\n\tctx: ExtensionCommandContext,\n\tname: string,\n\tprofile: Record<string, unknown>,\n\tsignal?: AbortSignal,\n\taffectedSetups?: string[],\n) {\n\tconst remoteInput = await requiredInput(\n\t\tctx,\n\t\t\"Git SSH or HTTPS remote\",\n\t\ttypeof profile.remote === \"string\"\n\t\t\t? profile.remote\n\t\t\t: \"git@github.com:owner/private-pi-sync.git\",\n\t\tsignal,\n\t);\n\tif (!remoteInput) return false;\n\tlet remote: string | undefined;\n\ttry {\n\t\tremote = normalizeGitRemote(remoteInput);\n\t} catch (error) {\n\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\treturn false;\n\t}\n\tif (!remote) return false;\n\tconst choice = await ctx.ui.select(\n\t\t`Review storage connection\\n\\nStorage connection: ${safeTerminalText(name)}\\nRemote: ${safeGitRemote(String(profile.remote ?? \"missing\"))} \u2192 ${safeGitRemote(remote)}\\nAffected sync setups: ${affectedSetups && affectedSetups.length > 0 ? affectedSetups.map(safeTerminalText).join(\", \") : \"None\"}\\nSaving changes future storage access for every affected setup; it does not move or delete remote history.`,\n\t\t[\"Save storage connection\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tthrowIfAborted(signal);\n\tif (choice !== \"Save storage connection\") return false;\n\tawait updateStorageConnection(\n\t\tname,\n\t\t(current) => {\n\t\t\tif (current.type !== \"git\") throw new Error(\"Storage connection type changed; reopen it.\");\n\t\t\treturn { ...current, remote };\n\t\t},\n\t\taffectedSetups,\n\t\tsignal,\n\t);\n\tif (signal?.aborted) return true;\n\tctx.ui.notify(`Saved storage connection \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n\treturn true;\n}\n\nexport async function showAddGitTarget(\n\tctx: ExtensionCommandContext,\n\tname: string,\n\tprofile: string,\n\tsignal?: AbortSignal,\n) {\n\tconst destination = await promptGitDestination(ctx, name, signal);\n\tif (!destination) return false;\n\tconst preset = await ctx.ui.select(\n\t\t\"Choose included content\",\n\t\t[\"Recommended Pi settings\", \"Minimal settings\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tthrowIfAborted(signal);\n\tif (!preset || preset === \"Cancel\") return false;\n\tconst syncFiles =\n\t\tpreset === \"Minimal settings\" ? [\"settings.json\", \"AGENTS.md\"] : [...DEFAULT_SYNC_INCLUDE];\n\tconst automatic = await ctx.ui.select(\n\t\t\"Automatic sync for this setup\",\n\t\t[\"Enable automatic sync\", \"Keep automatic sync off\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tthrowIfAborted(signal);\n\tif (!automatic || automatic === \"Cancel\") return false;\n\tconst choice = await ctx.ui.select(\n\t\t`Review Git sync setup\\n\\nSync setup: ${safeTerminalText(name)}\\nStorage connection: ${safeTerminalText(profile)}\\nOwned branch: ${safeTerminalText(destination.branch)}\\nStorage location: ${safeTerminalText(destination.directory)}\\nIncluded content: ${syncFiles.length} built-in groups \u00B7 Sessions: Off\\nAutomatic sync: ${automatic === \"Enable automatic sync\" ? \"On\" : \"Off\"}`,\n\t\t[\"Add sync setup\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tthrowIfAborted(signal);\n\tif (choice !== \"Add sync setup\") return false;\n\tawait addSyncSetup(\n\t\tname,\n\t\t{\n\t\t\tstorage: {\n\t\t\t\tconnection: profile,\n\t\t\t\tbranch: destination.branch,\n\t\t\t\tpath: destination.directory,\n\t\t\t},\n\t\t\tsync: {\n\t\t\t\tinclude: syncFiles,\n\t\t\t\tautomatic: automatic === \"Enable automatic sync\",\n\t\t\t},\n\t\t},\n\t\tsignal,\n\t);\n\tif (signal?.aborted) return true;\n\tctx.ui.notify(`Added sync setup \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n\treturn true;\n}\n\nexport async function showEditGitTarget(\n\tctx: ExtensionCommandContext,\n\tpartial: PartialConfig,\n\tsignal?: AbortSignal,\n) {\n\tconst targetName = partial.setupName;\n\tconst destination = await promptGitDestination(ctx, targetName, signal, partial);\n\tif (!destination) return false;\n\tif (destination.directory !== partial.storagePath && destination.branch === partial.branch) {\n\t\tctx.ui.notify(\n\t\t\t\"Changing a Git storage path requires a new Git branch so the existing branch remains readable.\",\n\t\t\t\"warning\",\n\t\t);\n\t\treturn false;\n\t}\n\tconst choice = await ctx.ui.select(\n\t\t`Review sync setup \u201C${safeTerminalText(targetName)}\u201D\\n\\nBranch: ${safeTerminalText(partial.branch ?? \"pi-sync\")} \u2192 ${safeTerminalText(destination.branch)}\\nStorage path: ${safeTerminalText(partial.storagePath)} \u2192 ${safeTerminalText(destination.directory)}\\nSaving changes the future storage location only; it does not move or delete remote history.`,\n\t\t[\"Save sync setup\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tthrowIfAborted(signal);\n\tif (choice !== \"Save sync setup\") return false;\n\tawait updateSyncSetup(\n\t\ttargetName,\n\t\t(setup) => {\n\t\t\tif (typeof setup.storage.branch !== \"string\") {\n\t\t\t\tthrow new Error(\"Sync setup storage type changed; reopen it.\");\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...setup,\n\t\t\t\tstorage: {\n\t\t\t\t\t...setup.storage,\n\t\t\t\t\tbranch: destination.branch,\n\t\t\t\t\tpath: destination.directory,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\t{ expectedStorage: partial, signal },\n\t);\n\tif (signal?.aborted) return true;\n\tctx.ui.notify(`Saved sync setup \u201C${safeTerminalText(targetName)}\u201D.`, \"info\");\n\treturn true;\n}\n\nasync function promptGitDestination(\n\tctx: ExtensionCommandContext,\n\ttargetName: string,\n\tsignal?: AbortSignal,\n\tcurrent: Partial<PartialConfig> = {},\n) {\n\tconst branchInput = await requiredInput(\n\t\tctx,\n\t\t\"Owned Git branch\",\n\t\tcurrent.branch ?? `pi-sync/${targetName}`,\n\t\tsignal,\n\t);\n\tif (!branchInput) return undefined;\n\tconst pathInput = await requiredInput(\n\t\tctx,\n\t\t\"Git storage path\",\n\t\tcurrent.storagePath ?? `pi-sync/${targetName}`,\n\t\tsignal,\n\t);\n\tif (!pathInput) return undefined;\n\ttry {\n\t\tconst branch = normalizeGitBranch(branchInput);\n\t\tconst directory = normalizeGitDirectory(pathInput);\n\t\tconst namespace = directory.slice(directory.lastIndexOf(\"/\") + 1);\n\t\treturn { branch, directory, namespace };\n\t} catch (error) {\n\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\treturn undefined;\n\t}\n}\n\nfunction throwIfAborted(signal?: AbortSignal) {\n\tif (!signal?.aborted) return;\n\tthrow signal.reason instanceof Error\n\t\t? signal.reason\n\t\t: new DOMException(\"The operation was aborted\", \"AbortError\");\n}\n\nfunction safeGitRemote(remote: string) {\n\ttry {\n\t\tconst url = new URL(remote);\n\t\treturn safeTerminalText(`${url.protocol}//${url.host}${url.pathname}`);\n\t} catch {\n\t\treturn safeTerminalText(remote);\n\t}\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport type { ActionMenuItem } from \"@narumitw/pi-tui-kit\";\nimport type { RunRoute } from \"./cancellable-operation.js\";\nimport { dispatchManagerResult } from \"./manager-result-dispatcher.js\";\nimport type { ManagerDescription } from \"./manager-state.js\";\nimport type { SyncAttentionState } from \"./sync-attention.js\";\n\nexport interface SyncManagerAttentionOptions {\n\tgetAttention?: () => SyncAttentionState | undefined;\n\tonSelectionResolved?: (expected: SyncAttentionState) => void;\n}\n\nexport function attentionMainMenuItems(\n\tmanager: ManagerDescription,\n): ActionMenuItem<\"main\" | \"more\" | \"recovery\", \"review-attention\">[] {\n\tif (!manager.attention) return [];\n\tconst disabled = manager.attentionReviewDisabled === true;\n\treturn [\n\t\t{\n\t\t\tid: \"review-attention\",\n\t\t\tlabel: \"Review synced content (recommended)\",\n\t\t\taction: \"review-attention\",\n\t\t\t...(disabled\n\t\t\t\t? {\n\t\t\t\t\t\tdisabled: true,\n\t\t\t\t\t\tdisabledReason: \"Finish or recover the active operation first.\",\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t},\n\t];\n}\n\nexport function blockedSyncMenuItem(\n\tlabel: string,\n\tmanager: ManagerDescription,\n): ActionMenuItem<\"main\" | \"more\" | \"recovery\", \"sync\"> | undefined {\n\tif (label !== \"Sync now (recommended)\" || !manager.attentionBlocksSync) return undefined;\n\treturn {\n\t\tid: \"sync\",\n\t\tlabel,\n\t\tdescription: \"Review first.\",\n\t\taction: \"sync\",\n\t\tdisabled: true,\n\t\tdisabledReason: \"Review synced content first.\",\n\t};\n}\n\nexport async function showManagerAttention(\n\tctx: ExtensionCommandContext,\n\tattention: SyncAttentionState,\n\trunRoute: RunRoute,\n\tsignal: AbortSignal | undefined,\n\tonSelectionResolved: (() => void) | undefined,\n): Promise<\"close\" | \"stay\"> {\n\tconst { showRemoteSelectionReview } = await import(\"./remote-selection-ui.js\");\n\tif (signal?.aborted) return \"close\";\n\tconst review = await showRemoteSelectionReview(\n\t\tctx,\n\t\tattention.decision.setupName,\n\t\tsignal,\n\t\tundefined,\n\t\t{\n\t\t\tdecision: attention.decision,\n\t\t\torigin: attention.origin,\n\t\t\trunRoute,\n\t\t\tonSelectionResolved,\n\t\t},\n\t);\n\tif (review.kind === \"route-result\") {\n\t\tconst disposition = await dispatchManagerResult(\n\t\t\tctx,\n\t\t\treview.result,\n\t\t\treview.route,\n\t\t\trunRoute,\n\t\t\tsignal,\n\t\t\t{ onSelectionResolved },\n\t\t);\n\t\treturn disposition.kind;\n\t}\n\treturn review.kind === \"closed\" || review.kind === \"stale\" ? \"close\" : \"stay\";\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { runConfirmation } from \"@narumitw/pi-tui-kit\";\nimport type { RunRoute } from \"./cancellable-operation.js\";\nimport { errorMessage, safeTerminalText } from \"./manager-helpers.js\";\nimport type { ManagerDescription } from \"./manager-state.js\";\nimport { inspectOperationAvailability, operationCanRecover } from \"./operation-availability.js\";\n\nexport type RecoveryDisposition = \"restored\" | \"stay\" | \"close\";\n\nexport async function recoverSyncAccess(\n\tctx: ExtensionCommandContext,\n\tmanager: ManagerDescription,\n\trunRoute: RunRoute,\n\tsessionSignal: AbortSignal | undefined,\n\tactionSignal: AbortSignal,\n): Promise<RecoveryDisposition> {\n\tconst operation = manager.operation;\n\tif (!operation || !operationCanRecover(operation)) {\n\t\tctx.ui.notify(\n\t\t\t\"Operation status changed. Refresh the manager before retrying recovery.\",\n\t\t\t\"warning\",\n\t\t);\n\t\treturn \"stay\";\n\t}\n\tconst signal = sessionSignal ? AbortSignal.any([sessionSignal, actionSignal]) : actionSignal;\n\tif (signal.aborted) return \"close\";\n\tconst unreadable = operation.kind === \"recoverable-unreadable\";\n\tconst details = unreadable\n\t\t? \"Pi-sync cannot verify who owns the unreadable lock. Close other Pi sessions that may be syncing before continuing.\"\n\t\t: `The recorded ${safeTerminalText(operation.lock.command)} operation (pid ${operation.lock.pid}) appears to have stopped. Close other Pi sessions that may still be syncing before continuing.`;\n\tconst confirmation = await runConfirmation(ctx, {\n\t\ttitle: \"Restore sync access?\",\n\t\tmessage: [\n\t\t\tdetails,\n\t\t\t\"\",\n\t\t\t\"This removes only the local operation lock.\",\n\t\t\t\"It does not change settings, local files, sync state, or remote data.\",\n\t\t].join(\"\\n\"),\n\t\tconfirmLabel: \"Remove local lock and continue\",\n\t\tcancelLabel: \"Cancel\",\n\t\tsignal,\n\t\tisCurrent: () => !signal.aborted,\n\t\tonError: (_currentCtx, error) => {\n\t\t\tctx.ui.notify(\n\t\t\t\t`Recovery confirmation failed: ${safeTerminalText(errorMessage(error))}`,\n\t\t\t\t\"error\",\n\t\t\t);\n\t\t},\n\t});\n\tif (confirmation.kind === \"stale\") return \"close\";\n\tif (confirmation.kind === \"closed\") {\n\t\tif (confirmation.reason === \"close\") return \"close\";\n\t\tif (!signal.aborted) {\n\t\t\tctx.ui.notify(\"Recovery cancelled; the local operation lock was not changed.\", \"info\");\n\t\t}\n\t\treturn \"stay\";\n\t}\n\tif (confirmation.kind !== \"confirmed\") return \"stay\";\n\tif (signal.aborted) return \"close\";\n\tawait runRoute(unreadable ? \"unlock --stale\" : \"unlock\", signal);\n\tif (signal.aborted) return \"close\";\n\tconst latest = await inspectOperationAvailability();\n\tif (signal.aborted) return \"close\";\n\treturn latest.kind === \"free\" ? \"restored\" : \"stay\";\n}\n", "import { inspectLock, isLockGuardHeld, isStaleLock, type LockInspection } from \"./lock.js\";\nimport { errorMessage } from \"./manager-helpers.js\";\nimport type { LockFile } from \"./types.js\";\n\nexport type OperationAvailability =\n\t| { kind: \"free\" }\n\t| { kind: \"live\"; lock: LockFile }\n\t| { kind: \"busy\"; lock?: LockFile; metadata: LockInspection[\"status\"] }\n\t| { kind: \"recoverable-stale\"; lock: LockFile }\n\t| { kind: \"recoverable-unreadable\" }\n\t| { kind: \"inspection-error\"; message: string };\n\ninterface OperationInspectionDependencies {\n\tinspectMetadata(): Promise<LockInspection>;\n\tinspectGuard(): Promise<boolean>;\n}\n\nconst DEFAULT_INSPECTION_DEPENDENCIES: OperationInspectionDependencies = {\n\tinspectMetadata: inspectLock,\n\tinspectGuard: isLockGuardHeld,\n};\n\nexport async function inspectOperationAvailability(\n\tdependencies: OperationInspectionDependencies = DEFAULT_INSPECTION_DEPENDENCIES,\n): Promise<OperationAvailability> {\n\ttry {\n\t\tconst metadata = await dependencies.inspectMetadata();\n\t\tconst guardHeld = await dependencies.inspectGuard();\n\t\treturn classifyOperationAvailability(metadata, guardHeld);\n\t} catch (error) {\n\t\treturn { kind: \"inspection-error\", message: errorMessage(error) };\n\t}\n}\n\nexport function classifyOperationAvailability(\n\tmetadata: LockInspection,\n\tguardHeld: boolean,\n): OperationAvailability {\n\tif (metadata.status === \"valid\" && !isStaleLock(metadata.lock)) {\n\t\treturn { kind: \"live\", lock: metadata.lock };\n\t}\n\tif (guardHeld) {\n\t\treturn {\n\t\t\tkind: \"busy\",\n\t\t\tmetadata: metadata.status,\n\t\t\t...(metadata.status === \"valid\" ? { lock: metadata.lock } : {}),\n\t\t};\n\t}\n\tif (metadata.status === \"valid\") {\n\t\treturn { kind: \"recoverable-stale\", lock: metadata.lock };\n\t}\n\tif (metadata.status === \"unreadable\") return { kind: \"recoverable-unreadable\" };\n\treturn { kind: \"free\" };\n}\n\nexport function operationBlocksChanges(availability: OperationAvailability) {\n\treturn availability.kind !== \"free\";\n}\n\nexport function operationCanRecover(availability: OperationAvailability) {\n\treturn (\n\t\tavailability.kind === \"recoverable-stale\" || availability.kind === \"recoverable-unreadable\"\n\t);\n}\n", "import { truncateToWidth } from \"@earendil-works/pi-tui\";\nimport {\n\tactiveLocalConfigPath,\n\tisCloudflareR2Endpoint,\n\tloadConfig,\n\treadLocalConfigObject,\n\treadStateForConfig,\n} from \"./config.js\";\nimport { errorMessage, ownRecord, safeTerminalText } from \"./manager-helpers.js\";\nimport {\n\tinspectOperationAvailability,\n\ttype OperationAvailability,\n\toperationBlocksChanges,\n\toperationCanRecover,\n} from \"./operation-availability.js\";\nimport { type SyncAttentionState, syncAttentionMatchesConfig } from \"./sync-attention.js\";\nimport { compareSyncInclude, syncIncludeSelection } from \"./sync-policy.js\";\nimport { countValidSyncSetups } from \"./sync-setups-ui.js\";\nimport type { AnySyncConfig } from \"./types.js\";\n\nexport const MAIN_MENU_ACTIONS = [\n\t\"Sync now (recommended)\",\n\t\"Switch sync setup\",\n\t\"Status & changes\",\n\t\"Settings\",\n\t\"More\u2026\",\n] as const;\n\nexport interface ManagerDescription {\n\ttitle: string;\n\tactions: string[];\n\toperation?: OperationAvailability;\n\tattention?: SyncAttentionState;\n\tattentionBlocksSync?: boolean;\n\tattentionReviewDisabled?: boolean;\n}\n\nexport async function describeManagerState(\n\tsignal?: AbortSignal,\n\tattention?: SyncAttentionState,\n\tinspectOperation: () => Promise<OperationAvailability> = inspectOperationAvailability,\n): Promise<ManagerDescription> {\n\tlet raw: Record<string, unknown> | undefined;\n\ttry {\n\t\traw = await readLocalConfigObject();\n\t} catch (error) {\n\t\treturn {\n\t\t\ttitle: [\n\t\t\t\t\"Manage sync\",\n\t\t\t\t\"\",\n\t\t\t\t\"Settings file needs repair. Automatic sync and settings writes are paused.\",\n\t\t\t\t`Error: ${safeTerminalText(errorMessage(error))}`,\n\t\t\t\t`File: ${safeTerminalText(await activeLocalConfigPath())}`,\n\t\t\t\t\"\",\n\t\t\t\t\"Repair the JSON file, then reopen /sync.\",\n\t\t\t].join(\"\\n\"),\n\t\t\tactions: [\"Help\"],\n\t\t};\n\t}\n\tif (!raw) {\n\t\treturn {\n\t\t\ttitle: [\"Manage sync\", \"\", \"Not set up.\", \"\", \"What do you want to do?\"].join(\"\\n\"),\n\t\t\tactions: [\"Set up sync\", \"Help\"],\n\t\t};\n\t}\n\tconst configuredTargets = ownRecord(raw.syncSetups);\n\tif (raw.version === 3 && configuredTargets && Object.keys(configuredTargets).length === 0) {\n\t\treturn {\n\t\t\ttitle: [\n\t\t\t\t\"Manage sync\",\n\t\t\t\t\"\",\n\t\t\t\t\"No sync setups are configured.\",\n\t\t\t\t\"Add a sync setup using an existing storage connection.\",\n\t\t\t\t\"\",\n\t\t\t\t\"What do you want to do?\",\n\t\t\t].join(\"\\n\"),\n\t\t\tactions: [\"Sync setups\u2026\", \"Storage connections\u2026\", \"Help\"],\n\t\t};\n\t}\n\ttry {\n\t\tconst config = await loadConfig();\n\t\tconst operation = await inspectOperation();\n\t\tconst changesBlocked = operationBlocksChanges(operation);\n\t\tconst selection = syncIncludeSelection(config.include);\n\t\tlet currentAttention: SyncAttentionState | undefined;\n\t\tif (attention) {\n\t\t\ttry {\n\t\t\t\tconst attentionConfig =\n\t\t\t\t\tattention.decision.setupName === config.setupName\n\t\t\t\t\t\t? config\n\t\t\t\t\t\t: await loadConfig(attention.decision.setupName);\n\t\t\t\tif (syncAttentionMatchesConfig(attention, attentionConfig)) currentAttention = attention;\n\t\t\t} catch {\n\t\t\t\tcurrentAttention = undefined;\n\t\t\t}\n\t\t\tif (signal?.aborted) throw signal.reason;\n\t\t}\n\t\tconst attentionComparison = currentAttention\n\t\t\t? compareSyncInclude(\n\t\t\t\t\tcurrentAttention.decision.localInclude,\n\t\t\t\t\tcurrentAttention.decision.remoteInclude,\n\t\t\t\t)\n\t\t\t: undefined;\n\t\tconst noSyncedContent = config.include.length === 0;\n\t\tconst syncState = changesBlocked\n\t\t\t? undefined\n\t\t\t: await readStateForConfig(config).catch(() => undefined);\n\t\tconst lastAppliedSnapshot = changesBlocked\n\t\t\t? \"Unavailable while operations are locked\"\n\t\t\t: syncState?.lastAppliedSnapshot\n\t\t\t\t? safeTerminalText(syncState.lastAppliedSnapshot)\n\t\t\t\t: syncState\n\t\t\t\t\t? \"Never synced\"\n\t\t\t\t\t: \"Unavailable\";\n\t\tconst canSwitch = (await countValidSyncSetups(configuredTargets, signal)) > 1;\n\t\tconst mainActions = MAIN_MENU_ACTIONS.filter(\n\t\t\t(action) => action !== \"Switch sync setup\" || canSwitch,\n\t\t);\n\t\tconst ordinaryTitle = [\n\t\t\t\"Manage sync\",\n\t\t\t\"\",\n\t\t\t`Current sync setup: ${safeTerminalText(config.setupName)}`,\n\t\t\t`Storage: ${backendStorageDescription(config)}`,\n\t\t\t`Included: ${selection.builtIns.length} built-in group${selection.builtIns.length === 1 ? \"\" : \"s\"} \u00B7 ${selection.custom.length} extra path${selection.custom.length === 1 ? \"\" : \"s\"} \u00B7 Sessions ${selection.sessions ? \"on\" : \"off\"}`,\n\t\t\t`Automatic sync: ${config.automatic ? \"On\" : \"Off\"}`,\n\t\t\t`Last applied: ${lastAppliedSnapshot}`,\n\t\t\t...(currentAttention\n\t\t\t\t? [\n\t\t\t\t\t\tcurrentAttention.decision.setupName === config.setupName\n\t\t\t\t\t\t\t? \"Sync status: Review needed\"\n\t\t\t\t\t\t\t: `Sync status: Review needed for setup ${safeTerminalText(currentAttention.decision.setupName)}`,\n\t\t\t\t\t\tattentionComparison?.remoteOnly.length === 0 &&\n\t\t\t\t\t\tattentionComparison.localOnly.length === 0\n\t\t\t\t\t\t\t? \"Only the synced-content order differs.\"\n\t\t\t\t\t\t\t: `Remote-only paths: ${attentionComparison?.remoteOnly.length ?? 0} \u00B7 Device-only paths: ${attentionComparison?.localOnly.length ?? 0}`,\n\t\t\t\t\t\t\"Nothing has been changed.\",\n\t\t\t\t\t]\n\t\t\t\t: [\"Remote status: Not checked\"]),\n\t\t\t...(noSyncedContent\n\t\t\t\t? [\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\"No included content is selected. Choose included content in Settings before syncing.\",\n\t\t\t\t\t]\n\t\t\t\t: []),\n\t\t\t\"\",\n\t\t\t\"What do you want to do?\",\n\t\t];\n\t\treturn {\n\t\t\ttitle: (changesBlocked\n\t\t\t\t? [\"Manage sync\", ...operationStatusLines(operation)]\n\t\t\t\t: ordinaryTitle\n\t\t\t).join(\"\\n\"),\n\t\t\tactions: operationActions(operation, noSyncedContent, canSwitch, mainActions),\n\t\t\toperation,\n\t\t\t...(currentAttention\n\t\t\t\t? {\n\t\t\t\t\t\tattention: currentAttention,\n\t\t\t\t\t\tattentionBlocksSync: currentAttention.decision.setupName === config.setupName,\n\t\t\t\t\t\tattentionReviewDisabled: changesBlocked,\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t};\n\t} catch (error) {\n\t\tif (signal?.aborted) throw error;\n\t\treturn {\n\t\t\ttitle: [\n\t\t\t\t\"Manage sync\",\n\t\t\t\t\"\",\n\t\t\t\t\"Settings need attention. Automatic sync is paused.\",\n\t\t\t\t`Current sync setup: ${safeTerminalText(typeof raw.activeSyncSetup === \"string\" ? raw.activeSyncSetup : \"none\")}`,\n\t\t\t\t`Error: ${safeTerminalText(errorMessage(error))}`,\n\t\t\t\t`File: ${safeTerminalText(await activeLocalConfigPath())}`,\n\t\t\t\t\"\",\n\t\t\t\t\"What do you want to do?\",\n\t\t\t].join(\"\\n\"),\n\t\t\tactions: [\"Sync setups\u2026\", \"Storage connections\u2026\", \"History & recovery\u2026\", \"Help\"],\n\t\t};\n\t}\n}\n\nfunction operationActions(\n\toperation: OperationAvailability,\n\tnoSyncedContent: boolean,\n\tcanSwitch: boolean,\n\tmainActions: string[],\n) {\n\tif (operationCanRecover(operation)) {\n\t\treturn [\n\t\t\t\"Restore sync access\u2026 (recommended)\",\n\t\t\t\"Status & changes\",\n\t\t\t\"History & recovery\u2026\",\n\t\t\t\"Help\",\n\t\t];\n\t}\n\tif (operation.kind !== \"free\") {\n\t\treturn [\"Refresh operation status\", \"Status & changes\", \"History & recovery\u2026\", \"Help\"];\n\t}\n\treturn noSyncedContent\n\t\t? [\"Settings\", ...(canSwitch ? [\"Switch sync setup\"] : []), \"Status & changes\", \"More\u2026\"]\n\t\t: mainActions;\n}\n\nfunction operationStatusLines(operation: OperationAvailability): string[] {\n\tswitch (operation.kind) {\n\t\tcase \"free\":\n\t\t\treturn [];\n\t\tcase \"live\": {\n\t\t\tconst command = truncateToWidth(safeTerminalText(operation.lock.command), 16, \"\u2026\");\n\t\t\treturn [\n\t\t\t\t`Running: ${command} (pid ${operation.lock.pid}). Wait, then refresh; Settings and More return.`,\n\t\t\t];\n\t\t}\n\t\tcase \"busy\":\n\t\t\treturn [\n\t\t\t\t\"Pi-sync may be starting or finishing. Wait, then refresh; Settings and More remain unavailable.\",\n\t\t\t];\n\t\tcase \"recoverable-stale\":\n\t\t\treturn [\n\t\t\t\t\"Sync paused: old lock remains. Close other Pi sessions then restore; Settings and More return.\",\n\t\t\t];\n\t\tcase \"recoverable-unreadable\":\n\t\t\treturn [\n\t\t\t\t\"Sync paused: owner unknown. Close other Pi sessions then restore; Settings and More return.\",\n\t\t\t];\n\t\tcase \"inspection-error\":\n\t\t\treturn [\n\t\t\t\t\"Lock check failed. Fix path access, then refresh; Settings and More remain unavailable.\",\n\t\t\t];\n\t}\n}\n\nexport function backendStorageDescription(config: AnySyncConfig) {\n\tconst connection = safeTerminalText(config.connectionName);\n\tswitch (config.backend.type) {\n\t\tcase \"s3\": {\n\t\t\tconst type =\n\t\t\t\tconfig.backend.profile.kind === \"r2\" ||\n\t\t\t\tisCloudflareR2Endpoint(config.backend.profile.endpoint)\n\t\t\t\t\t? \"Cloudflare R2\"\n\t\t\t\t\t: \"S3-compatible\";\n\t\t\treturn `${type} \u00B7 ${connection} \u00B7 ${safeTerminalText(config.backend.destination.bucket)}`;\n\t\t}\n\t\tcase \"webdav\":\n\t\t\treturn `WebDAV \u00B7 ${connection} \u00B7 ${safeTerminalText(config.backend.destination.path)}`;\n\t\tcase \"git\":\n\t\t\treturn `Git \u00B7 ${connection} \u00B7 ${safeTerminalText(config.backend.destination.branch)}`;\n\t}\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport { loadConfig, readLocalConfigObject } from \"./config.js\";\nimport { errorMessage, ownRecord, safeTerminalText } from \"./manager-helpers.js\";\nimport { syncIncludeSelection } from \"./sync-policy.js\";\n\nexport async function countValidSyncSetups(\n\tsetups: Record<string, unknown> | undefined,\n\tsignal?: AbortSignal,\n) {\n\tlet count = 0;\n\tfor (const name of Object.keys(setups ?? {})) {\n\t\tthrowIfAborted(signal);\n\t\tlet valid = false;\n\t\ttry {\n\t\t\tawait loadConfig(name);\n\t\t\tvalid = true;\n\t\t} catch {\n\t\t\t// Invalid setups stay visible in management but are not switchable.\n\t\t}\n\t\tthrowIfAborted(signal);\n\t\tif (valid) count += 1;\n\t}\n\treturn count;\n}\n\nfunction throwIfAborted(signal?: AbortSignal) {\n\tif (!signal?.aborted) return;\n\tthrow signal.reason instanceof Error\n\t\t? signal.reason\n\t\t: new DOMException(\"The operation was aborted\", \"AbortError\");\n}\n\ntype SyncSetupActions = {\n\tadd(signal?: AbortSignal): Promise<void>;\n\tedit(name: string, signal?: AbortSignal): Promise<void>;\n\tmakeCurrent(name: string, signal?: AbortSignal): Promise<\"exit\" | undefined>;\n\tremove(name: string, signal?: AbortSignal): Promise<void>;\n};\n\ninterface SetupMenuState {\n\tsetups: Record<string, unknown>;\n\tactive?: string;\n\tselected?: {\n\t\tname: string;\n\t\tdetail: string[];\n\t\tvalid: boolean;\n\t\tremoveUnavailable: boolean;\n\t};\n}\n\nexport async function showSyncSetups(\n\tctx: ExtensionCommandContext,\n\tactions: SyncSetupActions,\n\tsignal?: AbortSignal,\n): Promise<\"exit\" | undefined> {\n\tlet selectedName: string | undefined;\n\tlet exit = false;\n\tconst nameById = new Map<string, string>();\n\ttype Screen = \"list\" | \"detail\";\n\ttype Action = \"add\" | \"select\" | \"make-current\" | \"edit\" | \"remove\" | \"back\";\n\tconst menu = defineMenu<SetupMenuState, Screen, Action, ExtensionCommandContext>({\n\t\tstart: \"list\",\n\t\tscreens: {\n\t\t\tlist: ({ state }) => {\n\t\t\t\tnameById.clear();\n\t\t\t\tconst names = Object.keys(state.setups).sort((left, right) => left.localeCompare(right));\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\ttitle: \"Sync setups\",\n\t\t\t\t\titems: [\n\t\t\t\t\t\t{ id: \"add\", label: \"Add sync setup\", action: \"add\" },\n\t\t\t\t\t\t...names.map((name, index) => {\n\t\t\t\t\t\t\tconst id = `setup:${index}`;\n\t\t\t\t\t\t\tnameById.set(id, name);\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\tlabel: `${safeTerminalText(name)}${name === state.active ? \" (current)\" : \"\"}`,\n\t\t\t\t\t\t\t\taction: \"select\" as const,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}),\n\t\t\t\t\t],\n\t\t\t\t\thint: \"back\",\n\t\t\t\t};\n\t\t\t},\n\t\t\tdetail: ({ state }) => ({\n\t\t\t\tkind: \"actions\",\n\t\t\t\ttitle: state.selected\n\t\t\t\t\t? `Sync setup \u201C${safeTerminalText(state.selected.name)}\u201D`\n\t\t\t\t\t: \"Sync setup\",\n\t\t\t\tlines: state.selected?.detail ?? [\"This sync setup no longer exists.\"],\n\t\t\t\titems: state.selected\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t...(!state.selected.name ||\n\t\t\t\t\t\t\tstate.selected.name === state.active ||\n\t\t\t\t\t\t\t!state.selected.valid\n\t\t\t\t\t\t\t\t? []\n\t\t\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"make-current\",\n\t\t\t\t\t\t\t\t\t\t\tlabel: \"Make current\u2026\",\n\t\t\t\t\t\t\t\t\t\t\taction: \"make-current\" as const,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t{ id: \"edit\", label: \"Edit sync setup\u2026\", action: \"edit\" },\n\t\t\t\t\t\t\t...(state.selected.removeUnavailable\n\t\t\t\t\t\t\t\t? []\n\t\t\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"remove\",\n\t\t\t\t\t\t\t\t\t\t\tlabel: \"Remove sync setup\u2026\",\n\t\t\t\t\t\t\t\t\t\t\taction: \"remove\" as const,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t{ id: \"back\", label: \"Back\", action: \"back\" },\n\t\t\t\t\t\t]\n\t\t\t\t\t: [{ id: \"back\", label: \"Back\", action: \"back\" }],\n\t\t\t\thint: \"back\",\n\t\t\t}),\n\t\t},\n\t\tactions: {\n\t\t\tadd: async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait actions.add(signal);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!signal?.aborted) {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t`Sync setup was not added: ${menuErrorMessage(error)} Retry from Add sync setup.`,\n\t\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\tselect: async ({ itemId }) => {\n\t\t\t\tselectedName = nameById.get(itemId);\n\t\t\t\treturn selectedName ? { kind: \"to\", screen: \"detail\" } : { kind: \"rejected\" };\n\t\t\t},\n\t\t\t\"make-current\": async () => {\n\t\t\t\tif (!selectedName) return { kind: \"rejected\" };\n\t\t\t\ttry {\n\t\t\t\t\texit = (await actions.makeCurrent(selectedName, signal)) === \"exit\";\n\t\t\t\t\treturn exit ? { kind: \"close\" } : { kind: \"stay\" };\n\t\t\t\t} catch (error) {\n\t\t\t\t\tnotifySetupChangeError(ctx, selectedName, error, signal);\n\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t}\n\t\t\t},\n\t\t\tedit: async () => {\n\t\t\t\tif (!selectedName) return { kind: \"rejected\" };\n\t\t\t\ttry {\n\t\t\t\t\tawait actions.edit(selectedName, signal);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tnotifySetupChangeError(ctx, selectedName, error, signal);\n\t\t\t\t}\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\tremove: async () => {\n\t\t\t\tif (!selectedName) return { kind: \"rejected\" };\n\t\t\t\tconst name = selectedName;\n\t\t\t\ttry {\n\t\t\t\t\tawait actions.remove(name, signal);\n\t\t\t\t\tselectedName = undefined;\n\t\t\t\t\treturn { kind: \"back\" };\n\t\t\t\t} catch (error) {\n\t\t\t\t\tnotifySetupChangeError(ctx, name, error, signal);\n\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t}\n\t\t\t},\n\t\t\tback: async () => {\n\t\t\t\tselectedName = undefined;\n\t\t\t\treturn { kind: \"back\" };\n\t\t\t},\n\t\t},\n\t});\n\tawait runMenu(ctx, menu, {\n\t\tgetState: async () => loadSetupMenuState(selectedName, signal),\n\t\tsignal,\n\t\tisCurrent: () => !signal?.aborted,\n\t});\n\treturn exit ? \"exit\" : undefined;\n}\n\nasync function loadSetupMenuState(\n\tselectedName: string | undefined,\n\tsignal?: AbortSignal,\n): Promise<SetupMenuState> {\n\tconst raw = await readLocalConfigObject();\n\tthrowIfAborted(signal);\n\tconst setups = ownRecord(raw?.syncSetups) ?? {};\n\tconst active = typeof raw?.activeSyncSetup === \"string\" ? raw.activeSyncSetup : undefined;\n\tif (!selectedName || !ownRecord(setups[selectedName])) return { setups, active };\n\tconst setupCount = Object.keys(setups).length;\n\tconst isCurrent = selectedName === active;\n\tlet detail: string[];\n\tlet valid = true;\n\ttry {\n\t\tconst config = await loadConfig(selectedName);\n\t\tthrowIfAborted(signal);\n\t\tconst selection = syncIncludeSelection(config.include);\n\t\tdetail = [\n\t\t\t`Status: ${isCurrent ? \"Current\" : \"Not current\"}`,\n\t\t\t`Storage connection: ${safeTerminalText(config.connectionName)}`,\n\t\t\t`Endpoint: ${storageEndpoint(config)}`,\n\t\t\t`Storage location: ${storageLocation(config)}`,\n\t\t\t`Included content: ${selection.builtIns.length} built-in groups \u00B7 ${selection.custom.length} extra paths`,\n\t\t\t`Sessions: ${selection.sessions ? \"On \u2014 privacy-sensitive\" : \"Off\"}`,\n\t\t\t`Automatic sync: ${config.automatic ? \"On\" : \"Off\"}`,\n\t\t];\n\t} catch (error) {\n\t\tvalid = false;\n\t\tdetail = [\n\t\t\t`Status: Invalid${isCurrent ? \" current setup\" : \"\"}`,\n\t\t\t`Reason: ${menuErrorMessage(error)}`,\n\t\t\t\"Make current and sync are unavailable until this setup is repaired.\",\n\t\t];\n\t}\n\tconst removeUnavailable = isCurrent && setupCount > 1;\n\tif (removeUnavailable) detail.push(\"Remove unavailable: switch to another setup first.\");\n\treturn {\n\t\tsetups,\n\t\tactive,\n\t\tselected: { name: selectedName, detail, valid, removeUnavailable },\n\t};\n}\n\nfunction notifySetupChangeError(\n\tctx: ExtensionCommandContext,\n\tname: string,\n\terror: unknown,\n\tsignal?: AbortSignal,\n) {\n\tif (signal?.aborted) return;\n\tctx.ui.notify(\n\t\t`Sync setup \u201C${safeTerminalText(name)}\u201D was not changed: ${menuErrorMessage(error)} Reopen it and retry.`,\n\t\t\"error\",\n\t);\n}\n\nfunction menuErrorMessage(error: unknown) {\n\treturn safeTerminalText(errorMessage(error));\n}\n\nfunction storageEndpoint(config: Awaited<ReturnType<typeof loadConfig>>) {\n\tswitch (config.backend.type) {\n\t\tcase \"s3\":\n\t\t\treturn safeTerminalText(config.backend.profile.endpoint);\n\t\tcase \"git\":\n\t\t\treturn safeTerminalText(config.backend.profile.remote);\n\t\tcase \"webdav\":\n\t\t\treturn safeTerminalText(config.backend.profile.url);\n\t}\n}\n\nfunction storageLocation(config: Awaited<ReturnType<typeof loadConfig>>) {\n\tswitch (config.backend.type) {\n\t\tcase \"s3\":\n\t\t\treturn safeTerminalText(`${config.backend.destination.bucket}/${config.storagePath}`);\n\t\tcase \"git\":\n\t\t\treturn safeTerminalText(`Git \u00B7 ${config.backend.destination.branch}:${config.storagePath}`);\n\t\tcase \"webdav\":\n\t\t\treturn safeTerminalText(`WebDAV \u00B7 ${config.storagePath}`);\n\t}\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport {\n\tCURSOR_MARKER,\n\tdecodeKittyPrintable,\n\ttype Focusable,\n\ttype KeybindingsManager,\n\tText,\n\ttruncateToWidth,\n} from \"@earendil-works/pi-tui\";\nimport { runCustomInteraction } from \"@narumitw/pi-tui-kit\";\n\nconst MASK = \"\u2022\";\n\nexport async function promptSecret(\n\tctx: ExtensionCommandContext,\n\ttitle: string,\n\toptions: { required?: boolean; signal?: AbortSignal } = { required: true },\n) {\n\tif (ctx.mode !== \"tui\" || options.signal?.aborted) return undefined;\n\tconst result = await runCustomInteraction<string | undefined>(ctx, {\n\t\tsignal: options.signal,\n\t\tisCurrent: () => !options.signal?.aborted,\n\t\tcreate: ({ tui, theme, keybindings, complete }) => {\n\t\t\tconst heading = new Text(\"\", 0, 0);\n\t\t\tconst hint = new Text(\"\", 0, 0);\n\t\t\tconst submitKey = keybindingText(keybindings, \"tui.input.submit\", \"enter\");\n\t\t\tconst cancelKey = keybindingText(keybindings, \"tui.select.cancel\", \"esc\");\n\t\t\tconst applyTheme = () => {\n\t\t\t\theading.setText(theme.fg(\"accent\", theme.bold(title)));\n\t\t\t\thint.setText(theme.fg(\"dim\", `${submitKey} save \u2022 ${cancelKey} cancel \u2022 Input is hidden`));\n\t\t\t};\n\t\t\tapplyTheme();\n\t\t\tconst input = new MaskedInput(keybindings);\n\t\t\tconst component: Focusable & {\n\t\t\t\trender(width: number): string[];\n\t\t\t\tinvalidate(): void;\n\t\t\t\thandleInput(data: string): void;\n\t\t\t\tdispose(): void;\n\t\t\t} = {\n\t\t\t\tget focused() {\n\t\t\t\t\treturn input.focused;\n\t\t\t\t},\n\t\t\t\tset focused(focused: boolean) {\n\t\t\t\t\tinput.focused = focused;\n\t\t\t\t},\n\t\t\t\trender(width: number) {\n\t\t\t\t\tconst safeWidth = Math.max(1, width);\n\t\t\t\t\treturn [\n\t\t\t\t\t\t...heading.render(safeWidth),\n\t\t\t\t\t\t...input.render(safeWidth),\n\t\t\t\t\t\t...hint.render(safeWidth),\n\t\t\t\t\t].map((line) => truncateToWidth(line, safeWidth));\n\t\t\t\t},\n\t\t\t\tinvalidate() {\n\t\t\t\t\tapplyTheme();\n\t\t\t\t\theading.invalidate();\n\t\t\t\t\tinput.invalidate();\n\t\t\t\t\thint.invalidate();\n\t\t\t\t},\n\t\t\t\thandleInput(data: string) {\n\t\t\t\t\tif (keybindings.matches(data, \"tui.select.cancel\")) complete(undefined);\n\t\t\t\t\telse if (keybindings.matches(data, \"tui.input.submit\")) complete(input.getValue());\n\t\t\t\t\telse input.handleInput(data);\n\t\t\t\t\ttui.requestRender();\n\t\t\t\t},\n\t\t\t\tdispose() {\n\t\t\t\t\tinput.clear();\n\t\t\t\t},\n\t\t\t};\n\t\t\treturn component;\n\t\t},\n\t});\n\tif (result.kind === \"error\") throw result.error;\n\tif (result.kind !== \"completed\" || result.value === undefined) return undefined;\n\tconst value = result.value;\n\tif (options.required !== false && value.length === 0) {\n\t\tctx.ui.notify(`${title} is required.`, \"warning\");\n\t\treturn undefined;\n\t}\n\treturn value;\n}\n\nclass MaskedInput implements Focusable {\n\tfocused = false;\n\tprivate value: string[] = [];\n\tprivate cursor = 0;\n\tprivate paste = \"\";\n\tprivate pasting = false;\n\n\tconstructor(private readonly keybindings: KeybindingsManager) {}\n\n\tgetValue() {\n\t\treturn this.value.join(\"\");\n\t}\n\n\thandleInput(data: string) {\n\t\tif (data.includes(\"\\u001b[200~\")) {\n\t\t\tthis.pasting = true;\n\t\t\tthis.paste = \"\";\n\t\t\tdata = data.replace(\"\\u001b[200~\", \"\");\n\t\t}\n\t\tif (this.pasting) {\n\t\t\tthis.paste += data;\n\t\t\tconst end = this.paste.indexOf(\"\\u001b[201~\");\n\t\t\tif (end < 0) return;\n\t\t\tconst pasted = this.paste\n\t\t\t\t.slice(0, end)\n\t\t\t\t.replace(/[\\r\\n]/gu, \"\")\n\t\t\t\t.replace(/\\t/gu, \"    \");\n\t\t\tthis.insert(pasted);\n\t\t\tconst remaining = this.paste.slice(end + 6);\n\t\t\tthis.paste = \"\";\n\t\t\tthis.pasting = false;\n\t\t\tif (remaining) this.handleInput(remaining);\n\t\t\treturn;\n\t\t}\n\t\tif (this.keybindings.matches(data, \"tui.editor.deleteCharBackward\")) {\n\t\t\tif (this.cursor > 0) this.value.splice(--this.cursor, 1);\n\t\t\treturn;\n\t\t}\n\t\tif (this.keybindings.matches(data, \"tui.editor.deleteCharForward\")) {\n\t\t\tif (this.cursor < this.value.length) this.value.splice(this.cursor, 1);\n\t\t\treturn;\n\t\t}\n\t\tif (this.keybindings.matches(data, \"tui.editor.cursorLeft\")) {\n\t\t\tthis.cursor = Math.max(0, this.cursor - 1);\n\t\t\treturn;\n\t\t}\n\t\tif (this.keybindings.matches(data, \"tui.editor.cursorRight\")) {\n\t\t\tthis.cursor = Math.min(this.value.length, this.cursor + 1);\n\t\t\treturn;\n\t\t}\n\t\tif (this.keybindings.matches(data, \"tui.editor.cursorLineStart\")) {\n\t\t\tthis.cursor = 0;\n\t\t\treturn;\n\t\t}\n\t\tif (this.keybindings.matches(data, \"tui.editor.cursorLineEnd\")) {\n\t\t\tthis.cursor = this.value.length;\n\t\t\treturn;\n\t\t}\n\t\tif (this.keybindings.matches(data, \"tui.editor.deleteToLineStart\")) {\n\t\t\tthis.value.splice(0, this.cursor);\n\t\t\tthis.cursor = 0;\n\t\t\treturn;\n\t\t}\n\t\tif (this.keybindings.matches(data, \"tui.editor.deleteToLineEnd\")) {\n\t\t\tthis.value.splice(this.cursor);\n\t\t\treturn;\n\t\t}\n\t\tconst printable = decodeKittyPrintable(data) ?? data;\n\t\tif (!hasControlCharacter(printable)) this.insert(printable);\n\t}\n\n\trender(width: number) {\n\t\tconst prompt = \"> \";\n\t\tconst available = width - prompt.length;\n\t\tif (available <= 0) return [truncateToWidth(prompt, Math.max(1, width))];\n\t\tconst contentWidth = Math.max(0, available - 1);\n\t\tlet start = 0;\n\t\tif (this.value.length > contentWidth) {\n\t\t\tstart = Math.max(\n\t\t\t\t0,\n\t\t\t\tMath.min(this.cursor - Math.floor(contentWidth / 2), this.value.length - contentWidth),\n\t\t\t);\n\t\t}\n\t\tconst end = Math.min(this.value.length, start + contentWidth);\n\t\tconst visibleCursor = Math.max(0, Math.min(this.cursor - start, end - start));\n\t\tconst masks = Array.from({ length: end - start }, () => MASK);\n\t\tconst before = masks.slice(0, visibleCursor).join(\"\");\n\t\tconst atCursor = visibleCursor < masks.length ? MASK : \" \";\n\t\tconst after = masks.slice(visibleCursor + (visibleCursor < masks.length ? 1 : 0)).join(\"\");\n\t\tconst marker = this.focused ? CURSOR_MARKER : \"\";\n\t\tconst line = `${prompt}${before}${marker}\\u001b[7m${atCursor}\\u001b[27m${after}`;\n\t\treturn [truncateToWidth(line, width, \"\")];\n\t}\n\n\tinvalidate() {}\n\n\tclear() {\n\t\tthis.value.fill(\"\");\n\t\tthis.value = [];\n\t\tthis.paste = \"\";\n\t\tthis.cursor = 0;\n\t\tthis.pasting = false;\n\t}\n\n\tprivate insert(value: string) {\n\t\tconst characters = Array.from(value);\n\t\tthis.value.splice(this.cursor, 0, ...characters);\n\t\tthis.cursor += characters.length;\n\t}\n}\n\nfunction keybindingText(\n\tkeybindings: Pick<KeybindingsManager, \"getKeys\">,\n\tbinding: Parameters<KeybindingsManager[\"getKeys\"]>[0],\n\tfallback: string,\n) {\n\tconst keys = keybindings\n\t\t.getKeys(binding)\n\t\t.map(String)\n\t\t.map((key) => {\n\t\t\tif (key === \"return\") return \"enter\";\n\t\t\tif (key === \"escape\") return \"esc\";\n\t\t\treturn hasControlCharacter(key) ? \"\" : key;\n\t\t})\n\t\t.filter(Boolean);\n\treturn keys.join(\"/\") || fallback;\n}\n\nfunction hasControlCharacter(value: string) {\n\treturn [...value].some((character) => {\n\t\tconst code = character.codePointAt(0) ?? 0;\n\t\treturn code < 0x20 || (code >= 0x7f && code <= 0x9f);\n\t});\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { promptSecret } from \"./secret-input.js\";\n\nexport interface ChosenS3Credentials {\n\tprofileFields: { accessKeyId?: string; secretAccessKey?: string };\n\tsummary: string;\n\tready: boolean;\n\treplace?: boolean;\n}\n\nexport async function chooseS3CredentialUpdate(\n\tctx: ExtensionCommandContext,\n\tprofile: Record<string, unknown>,\n\tsignal?: AbortSignal,\n) {\n\tconst hasStored =\n\t\ttypeof profile.accessKeyId === \"string\" && typeof profile.secretAccessKey === \"string\";\n\tif (hasStored) {\n\t\tconst action = await ctx.ui.select(\n\t\t\t\"Credentials\",\n\t\t\t[\"Keep current credentials\", \"Change credential source\", \"Cancel\"],\n\t\t\t{ signal },\n\t\t);\n\t\tthrowIfAborted(signal);\n\t\tif (!action || action === \"Cancel\") return undefined;\n\t\tif (action === \"Keep current credentials\") {\n\t\t\treturn { profileFields: {}, summary: \"Unchanged (values hidden)\", ready: true };\n\t\t}\n\t}\n\tconst selected = await chooseS3Credentials(ctx, signal);\n\treturn selected ? { ...selected, replace: true } : undefined;\n}\n\nexport function applyS3CredentialUpdate(\n\tprofile: Record<string, unknown>,\n\tcredentials: ChosenS3Credentials,\n) {\n\tconst next = { ...profile };\n\tif (credentials.replace) {\n\t\tdelete next.accessKeyId;\n\t\tdelete next.secretAccessKey;\n\t\tdelete next.sessionToken;\n\t}\n\treturn { ...next, ...credentials.profileFields };\n}\n\nexport async function chooseS3Credentials(\n\tctx: ExtensionCommandContext,\n\tsignal?: AbortSignal,\n): Promise<ChosenS3Credentials | undefined> {\n\tconst choice = await ctx.ui.select(\n\t\t\"Credentials\\n\\nCredentials are stored in the private pi-sync settings file. Secret values are masked during input and never shown afterward.\",\n\t\t[\"Store credentials privately\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tthrowIfAborted(signal);\n\tif (choice !== \"Store credentials privately\") return undefined;\n\tconst accessKeyId = await requiredCredentialInput(ctx, \"Access key ID\", \"access-key-id\", signal);\n\tif (!accessKeyId) return undefined;\n\tconst secretAccessKey = await promptSecret(ctx, \"Secret access key\", { signal });\n\tthrowIfAborted(signal);\n\tif (secretAccessKey === undefined) return undefined;\n\treturn {\n\t\tprofileFields: { accessKeyId, secretAccessKey },\n\t\tsummary: \"Stored privately (values hidden)\",\n\t\tready: true,\n\t};\n}\n\nasync function requiredCredentialInput(\n\tctx: ExtensionCommandContext,\n\ttitle: string,\n\tplaceholder: string,\n\tsignal?: AbortSignal,\n) {\n\tconst value = await ctx.ui.input(title, placeholder, { signal });\n\tthrowIfAborted(signal);\n\tif (value === undefined) return undefined;\n\tconst normalized = value.trim();\n\tif (!normalized) {\n\t\tctx.ui.notify(`${title} is required.`, \"warning\");\n\t\treturn undefined;\n\t}\n\treturn normalized.includes(\"<\") || normalized.includes(\">\") ? undefined : normalized;\n}\n\nfunction throwIfAborted(signal?: AbortSignal) {\n\tif (!signal?.aborted) return;\n\tthrow signal.reason instanceof Error\n\t\t? signal.reason\n\t\t: new DOMException(\"The operation was aborted\", \"AbortError\");\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport type { RunRoute } from \"./cancellable-operation.js\";\nimport { loadConfig, localConfigPath } from \"./config.js\";\nimport { dispatchManagerResult } from \"./manager-result-dispatcher.js\";\nimport { updateSyncSetup } from \"./settings-management.js\";\nimport {\n\tSETUP_SWITCH_ACTION_OPTIONS,\n\tsaveOnSwitch,\n\tsetupSwitchActionFromLabel,\n\tsetupSwitchActionLabel,\n} from \"./setup-switch.js\";\nimport { safeTerminalText } from \"./sync-format.js\";\n\nexport type SyncSettingsRoute = RunRoute;\n\nexport async function showSyncSettings(\n\tctx: ExtensionCommandContext,\n\trunRoute: SyncSettingsRoute,\n\tsignal?: AbortSignal,\n) {\n\tif (ctx.mode !== \"tui\") {\n\t\tctx.ui.notify(`Edit pi-sync settings manually: ${safeTerminalText(localConfigPath())}`, \"info\");\n\t\treturn;\n\t}\n\tconst initial = await loadConfig();\n\tif (signal?.aborted) return;\n\tconst setupName = initial.setupName;\n\ttype Action = \"automatic\" | \"on-switch\" | \"include\" | \"remote-include\";\n\tconst menu = defineMenu<\n\t\tAwaited<ReturnType<typeof loadConfig>>,\n\t\t\"settings\",\n\t\tAction,\n\t\tExtensionCommandContext\n\t>({\n\t\tstart: \"settings\",\n\t\tscreens: {\n\t\t\tsettings: ({ state }) => ({\n\t\t\t\tkind: \"settings\",\n\t\t\t\ttitle: \"Pi Sync Settings\",\n\t\t\t\tlines: [\n\t\t\t\t\t`Sync setup: ${safeTerminalText(state.setupName)} \u00B7 Storage connection: ${safeTerminalText(state.connectionName)}`,\n\t\t\t\t],\n\t\t\t\titems: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"automatic\",\n\t\t\t\t\t\tlabel: \"Automatic sync\",\n\t\t\t\t\t\tdescription: \"Run conservative synchronization at session startup and shutdown.\",\n\t\t\t\t\t\tcurrentValue: state.automatic ? \"On\" : \"Off\",\n\t\t\t\t\t\tvalues: [\"On\", \"Off\"],\n\t\t\t\t\t\taction: \"automatic\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"onSwitch\",\n\t\t\t\t\t\tlabel: \"After switching setup\",\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\"Ask before a reviewed pull, start a reviewed pull, or switch without checking remote files.\",\n\t\t\t\t\t\tcurrentValue: setupSwitchActionLabel(state.onSwitch),\n\t\t\t\t\t\tvalues: SETUP_SWITCH_ACTION_OPTIONS.map(({ label }) => label),\n\t\t\t\t\t\taction: \"on-switch\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"include\",\n\t\t\t\t\t\tlabel: \"Included content\",\n\t\t\t\t\t\tdescription: `${state.include.length} selected path${state.include.length === 1 ? \"\" : \"s\"}. Opens the reviewed content-selection draft.`,\n\t\t\t\t\t\tcurrentValue: \"Open editor\",\n\t\t\t\t\t\taction: \"include\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"remoteInclude\",\n\t\t\t\t\t\tlabel: \"Compare synced content\",\n\t\t\t\t\t\tdescription: \"Review this device and remote content lists before choosing either one.\",\n\t\t\t\t\t\tcurrentValue: \"Review\",\n\t\t\t\t\t\taction: \"remote-include\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t}),\n\t\t},\n\t\tactions: {\n\t\t\tautomatic: async ({ value, signal: actionSignal }) => {\n\t\t\t\tconst automatic = value === \"On\";\n\t\t\t\tconst mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n\t\t\t\ttry {\n\t\t\t\t\tconst latest = await loadConfig(setupName);\n\t\t\t\t\tif (mutationSignal.aborted) return { kind: \"rejected\" };\n\t\t\t\t\tif (latest.automatic === automatic) return { kind: \"stay\" };\n\t\t\t\t\tawait updateSyncSetup(\n\t\t\t\t\t\tsetupName,\n\t\t\t\t\t\t(setup) => ({ ...setup, sync: { ...setup.sync, automatic } }),\n\t\t\t\t\t\t{ signal: mutationSignal },\n\t\t\t\t\t);\n\t\t\t\t\tif (mutationSignal.aborted) return { kind: \"rejected\" };\n\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t`Automatic sync ${automatic ? \"enabled\" : \"disabled\"} for \u201C${safeTerminalText(setupName)}\u201D.`,\n\t\t\t\t\t\t\"info\",\n\t\t\t\t\t);\n\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n\t\t\t\t\treturn { kind: \"rejected\" };\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"on-switch\": async ({ value, signal: actionSignal }) => {\n\t\t\t\tconst action = value ? setupSwitchActionFromLabel(value) : undefined;\n\t\t\t\tif (!action) return { kind: \"rejected\" };\n\t\t\t\tconst mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n\t\t\t\ttry {\n\t\t\t\t\tconst latest = await loadConfig(setupName);\n\t\t\t\t\tif (mutationSignal.aborted) return { kind: \"rejected\" };\n\t\t\t\t\tif (latest.onSwitch === action) return { kind: \"stay\" };\n\t\t\t\t\tawait saveOnSwitch(action, mutationSignal);\n\t\t\t\t\tif (mutationSignal.aborted) return { kind: \"rejected\" };\n\t\t\t\t\tctx.ui.notify(`After switching setup: ${value}.`, \"info\");\n\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n\t\t\t\t\treturn { kind: \"rejected\" };\n\t\t\t\t}\n\t\t\t},\n\t\t\tinclude: async ({ signal: actionSignal }) => {\n\t\t\t\tconst editorSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n\t\t\t\tawait runRoute(\"files\", editorSignal, undefined, setupName);\n\t\t\t\treturn editorSignal.aborted ? { kind: \"rejected\" } : { kind: \"stay\" };\n\t\t\t},\n\t\t\t\"remote-include\": async ({ signal: actionSignal }) => {\n\t\t\t\tconst reviewSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n\t\t\t\tconst { showRemoteSelectionReview } = await import(\"./remote-selection-ui.js\");\n\t\t\t\tif (reviewSignal.aborted) return { kind: \"rejected\" };\n\t\t\t\tconst review = await showRemoteSelectionReview(ctx, setupName, reviewSignal, undefined, {\n\t\t\t\t\torigin: \"settings\",\n\t\t\t\t\trunRoute,\n\t\t\t\t});\n\t\t\t\tif (reviewSignal.aborted) return { kind: \"rejected\" };\n\t\t\t\tif (review.kind === \"route-result\") {\n\t\t\t\t\tconst disposition = await dispatchManagerResult(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\treview.result,\n\t\t\t\t\t\treview.route,\n\t\t\t\t\t\trunRoute,\n\t\t\t\t\t\treviewSignal,\n\t\t\t\t\t);\n\t\t\t\t\treturn disposition.kind === \"close\" ? { kind: \"close\" } : { kind: \"stay\" };\n\t\t\t\t}\n\t\t\t\treturn review.kind === \"closed\" || review.kind === \"stale\"\n\t\t\t\t\t? { kind: \"close\" }\n\t\t\t\t\t: { kind: \"stay\" };\n\t\t\t},\n\t\t},\n\t});\n\tawait runMenu(ctx, menu, {\n\t\tgetState: () => loadConfig(setupName),\n\t\tsignal,\n\t\tisCurrent: () => !signal?.aborted,\n\t});\n}\n\nfunction notifySaveFailure(ctx: ExtensionCommandContext, error: unknown) {\n\tctx.ui.notify(\n\t\t`Pi Sync settings save failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\"error\",\n\t);\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport { isCloudflareR2Endpoint, readLocalConfigObject } from \"./config.js\";\nimport { showAddGitStorageProfile, showEditGitStorageProfile } from \"./git-ui.js\";\nimport { errorMessage, ownRecord, requiredInput, safeTerminalText } from \"./manager-helpers.js\";\nimport {\n\tapplyS3CredentialUpdate,\n\tchooseS3Credentials,\n\tchooseS3CredentialUpdate,\n} from \"./s3-credentials-ui.js\";\nimport {\n\taddStorageConnection,\n\tremoveStorageConnection,\n\tupdateStorageConnection,\n} from \"./settings-management.js\";\nimport { showAddWebDavStorageProfile, showEditWebDavStorageProfile } from \"./webdav-ui.js\";\n\nexport async function showStorageConnections(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n\tlet selectedName: string | undefined;\n\tconst nameById = new Map<string, string>();\n\ttype Screen = \"list\" | \"detail\";\n\ttype Action = \"add\" | \"select\" | \"edit\" | \"remove\" | \"back\";\n\tconst menu = defineMenu<\n\t\tAwaited<ReturnType<typeof loadStorageMenuState>>,\n\t\tScreen,\n\t\tAction,\n\t\tExtensionCommandContext\n\t>({\n\t\tstart: \"list\",\n\t\tscreens: {\n\t\t\tlist: ({ state }) => {\n\t\t\t\tnameById.clear();\n\t\t\t\tconst names = Object.keys(state.profiles).sort((left, right) => left.localeCompare(right));\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\ttitle: \"Storage connections\",\n\t\t\t\t\tlines: state.version3\n\t\t\t\t\t\t? []\n\t\t\t\t\t\t: [\"Create version 3 settings before managing storage connections.\"],\n\t\t\t\t\titems: state.version3\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t{ id: \"add\", label: \"Add storage connection\", action: \"add\" as const },\n\t\t\t\t\t\t\t\t...names.map((name, index) => {\n\t\t\t\t\t\t\t\t\tconst id = `connection:${index}`;\n\t\t\t\t\t\t\t\t\tnameById.set(id, name);\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\t\tlabel: safeTerminalText(name),\n\t\t\t\t\t\t\t\t\t\taction: \"select\" as const,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: [],\n\t\t\t\t\thint: \"back\",\n\t\t\t\t};\n\t\t\t},\n\t\t\tdetail: ({ state }) => ({\n\t\t\t\tkind: \"actions\",\n\t\t\t\ttitle: state.selected\n\t\t\t\t\t? `Storage connection \u201C${safeTerminalText(state.selected.name)}\u201D`\n\t\t\t\t\t: \"Storage connection\",\n\t\t\t\tlines: state.selected?.lines ?? [\"This storage connection no longer exists.\"],\n\t\t\t\titems: state.selected\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t{ id: \"edit\", label: \"Edit storage connection\u2026\", action: \"edit\" },\n\t\t\t\t\t\t\t...(state.selected.usedBy.length === 0\n\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"remove\",\n\t\t\t\t\t\t\t\t\t\t\tlabel: \"Remove storage connection\u2026\",\n\t\t\t\t\t\t\t\t\t\t\taction: \"remove\" as const,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t: []),\n\t\t\t\t\t\t\t{ id: \"back\", label: \"Back\", action: \"back\" },\n\t\t\t\t\t\t]\n\t\t\t\t\t: [{ id: \"back\", label: \"Back\", action: \"back\" }],\n\t\t\t\thint: \"back\",\n\t\t\t}),\n\t\t},\n\t\tactions: {\n\t\t\tadd: async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait showAddStorageConnection(ctx, signal);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!signal?.aborted) {\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t`Storage connection was not added: ${safeTerminalText(errorMessage(error))} Retry from Add storage connection.`,\n\t\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\tselect: async ({ itemId }) => {\n\t\t\t\tselectedName = nameById.get(itemId);\n\t\t\t\treturn selectedName ? { kind: \"to\", screen: \"detail\" } : { kind: \"rejected\" };\n\t\t\t},\n\t\t\tedit: async ({ state }) => {\n\t\t\t\tif (!state.selected || state.selected.name !== selectedName) return { kind: \"rejected\" };\n\t\t\t\ttry {\n\t\t\t\t\tawait editStorageConnection(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tstate.selected.name,\n\t\t\t\t\t\tstate.selected.profile,\n\t\t\t\t\t\tstate.selected.usedBy,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tnotifyConnectionError(ctx, state.selected.name, error, signal);\n\t\t\t\t}\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\tremove: async ({ state }) => {\n\t\t\t\tif (!state.selected || state.selected.name !== selectedName) return { kind: \"rejected\" };\n\t\t\t\tconst name = state.selected.name;\n\t\t\t\tconst confirmed = await ctx.ui.confirm(\n\t\t\t\t\t\"Remove storage connection?\",\n\t\t\t\t\t`Remove local storage connection \u201C${safeTerminalText(name)}\u201D? Remote data and history are not deleted.`,\n\t\t\t\t\t{ signal },\n\t\t\t\t);\n\t\t\t\tif (!confirmed || signal?.aborted) return { kind: \"rejected\" };\n\t\t\t\ttry {\n\t\t\t\t\tawait removeStorageConnection(name, signal);\n\t\t\t\t\tctx.ui.notify(`Removed storage connection \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n\t\t\t\t\tselectedName = undefined;\n\t\t\t\t\treturn { kind: \"back\" };\n\t\t\t\t} catch (error) {\n\t\t\t\t\tnotifyConnectionError(ctx, name, error, signal);\n\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t}\n\t\t\t},\n\t\t\tback: async () => {\n\t\t\t\tselectedName = undefined;\n\t\t\t\treturn { kind: \"back\" };\n\t\t\t},\n\t\t},\n\t});\n\tawait runMenu(ctx, menu, {\n\t\tgetState: () => loadStorageMenuState(selectedName, signal),\n\t\tsignal,\n\t\tisCurrent: () => !signal?.aborted,\n\t});\n}\n\nasync function loadStorageMenuState(selectedName: string | undefined, signal?: AbortSignal) {\n\tconst raw = await readLocalConfigObject();\n\tif (signal?.aborted) throw signal.reason;\n\tconst profiles = ownRecord(raw?.storageConnections) ?? {};\n\tconst profile = selectedName ? ownRecord(profiles[selectedName]) : undefined;\n\tif (!selectedName || !profile) {\n\t\treturn { version3: raw?.version === 3, profiles, selected: undefined };\n\t}\n\tconst usedBy = referencingSetups(raw, selectedName);\n\treturn {\n\t\tversion3: raw?.version === 3,\n\t\tprofiles,\n\t\tselected: {\n\t\t\tname: selectedName,\n\t\t\tprofile,\n\t\t\tusedBy,\n\t\t\tlines: [\n\t\t\t\t`Type: ${connectionType(profile)}`,\n\t\t\t\t`Endpoint: ${connectionEndpoint(profile)}`,\n\t\t\t\t`Credentials: ${credentialSource(profile)}`,\n\t\t\t\t`Used by: ${usedBy.length > 0 ? usedBy.map(safeTerminalText).join(\", \") : \"No sync setups\"}`,\n\t\t\t\t...(usedBy.length > 0\n\t\t\t\t\t? [\"Remove unavailable: edit or remove the listed sync setups first.\"]\n\t\t\t\t\t: []),\n\t\t\t],\n\t\t},\n\t};\n}\n\nfunction notifyConnectionError(\n\tctx: ExtensionCommandContext,\n\tname: string,\n\terror: unknown,\n\tsignal?: AbortSignal,\n) {\n\tif (signal?.aborted) return;\n\tctx.ui.notify(\n\t\t`Storage connection \u201C${safeTerminalText(name)}\u201D was not changed: ${safeTerminalText(errorMessage(error))} Reopen it and retry.`,\n\t\t\"error\",\n\t);\n}\n\nasync function editStorageConnection(\n\tctx: ExtensionCommandContext,\n\tname: string,\n\tprofile: Record<string, unknown>,\n\tusedBy: string[],\n\tsignal?: AbortSignal,\n) {\n\tif (ctx.mode !== \"tui\") {\n\t\tctx.ui.notify(\n\t\t\t\"Editing storage connections requires TUI mode for safe credential handling. Edit the private version 3 settings file instead.\",\n\t\t\t\"warning\",\n\t\t);\n\t\treturn;\n\t}\n\tif (profile.type === \"webdav\") {\n\t\tawait showEditWebDavStorageProfile(\n\t\t\tctx,\n\t\t\tname,\n\t\t\t{ ...profile, kind: \"webdav\", ...(ownRecord(profile.credentials) ?? {}) },\n\t\t\tsignal,\n\t\t\tusedBy,\n\t\t);\n\t\treturn;\n\t}\n\tif (profile.type === \"git\") {\n\t\tawait showEditGitStorageProfile(ctx, name, { ...profile, kind: \"git\" }, signal, usedBy);\n\t\treturn;\n\t}\n\tconst endpoint = await requiredInput(\n\t\tctx,\n\t\t\"Endpoint\",\n\t\tString(profile.endpoint ?? \"https://s3.example.com\"),\n\t\tsignal,\n\t);\n\tif (!endpoint || signal?.aborted) return;\n\tconst region = await requiredInput(ctx, \"Region\", String(profile.region ?? \"auto\"), signal);\n\tif (!region || signal?.aborted) return;\n\tconst storedCredentials = ownRecord(profile.credentials) ?? {};\n\tconst credentials = await chooseS3CredentialUpdate(\n\t\tctx,\n\t\t{ ...profile, ...storedCredentials },\n\t\tsignal,\n\t);\n\tif (!credentials || signal?.aborted) return;\n\tconst save = await ctx.ui.select(\n\t\t[\n\t\t\t\"Review storage connection\",\n\t\t\t\"\",\n\t\t\t`Storage connection: ${safeTerminalText(name)}`,\n\t\t\t`Endpoint: ${safeTerminalText(String(profile.endpoint ?? \"missing\"))} \u2192 ${safeTerminalText(endpoint)}`,\n\t\t\t`Region: ${safeTerminalText(String(profile.region ?? \"auto\"))} \u2192 ${safeTerminalText(region)}`,\n\t\t\t`Credentials: ${safeTerminalText(credentials.summary)}`,\n\t\t\t`Affected sync setups: ${usedBy.length > 0 ? usedBy.map(safeTerminalText).join(\", \") : \"None\"}`,\n\t\t\t\"Saving changes future storage access for every affected setup; it does not move remote data.\",\n\t\t].join(\"\\n\"),\n\t\t[\"Save storage connection\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tif (save !== \"Save storage connection\" || signal?.aborted) return;\n\tawait updateStorageConnection(\n\t\tname,\n\t\t(current) => {\n\t\t\tif (current.type !== \"s3\") {\n\t\t\t\tthrow new Error(\"Storage connection type changed; reopen it.\");\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...current,\n\t\t\t\tendpoint,\n\t\t\t\tregion,\n\t\t\t\tcredentials: applyS3CredentialUpdate(\n\t\t\t\t\tcurrent.credentials,\n\t\t\t\t\tcredentials,\n\t\t\t\t) as typeof current.credentials,\n\t\t\t};\n\t\t},\n\t\tusedBy,\n\t\tsignal,\n\t);\n\tif (signal?.aborted) return;\n\tctx.ui.notify(`Saved storage connection \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n}\n\nexport async function showAddStorageConnection(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n\tif (ctx.mode !== \"tui\") {\n\t\tctx.ui.notify(\n\t\t\t\"Adding storage connections requires TUI mode for safe credential handling. Edit the private version 3 settings file instead.\",\n\t\t\t\"warning\",\n\t\t);\n\t\treturn false;\n\t}\n\tconst preset = await ctx.ui.select(\n\t\t\"Storage type\",\n\t\t[\"Cloudflare R2\", \"Other S3-compatible storage\", \"WebDAV\", \"Git\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tif (signal?.aborted || !preset || preset === \"Cancel\") return false;\n\tif (preset === \"WebDAV\") return showAddWebDavStorageProfile(ctx, signal);\n\tif (preset === \"Git\") return showAddGitStorageProfile(ctx, signal);\n\tconst name = await requiredInput(\n\t\tctx,\n\t\t\"Name this storage connection\",\n\t\tpreset === \"Cloudflare R2\" ? \"r2\" : \"s3\",\n\t\tsignal,\n\t);\n\tif (!name || signal?.aborted) return false;\n\tconst endpoint = await requiredInput(\n\t\tctx,\n\t\t\"Endpoint\",\n\t\tpreset === \"Cloudflare R2\"\n\t\t\t? \"https://<account-id>.r2.cloudflarestorage.com\"\n\t\t\t: \"https://s3.example.com\",\n\t\tsignal,\n\t);\n\tif (!endpoint || signal?.aborted) return false;\n\tconst region =\n\t\tpreset === \"Cloudflare R2\" ? \"auto\" : await requiredInput(ctx, \"Region\", \"us-east-1\", signal);\n\tif (!region || signal?.aborted) return false;\n\tconst credentials = await chooseS3Credentials(ctx, signal);\n\tif (!credentials || signal?.aborted) return false;\n\tconst save = await ctx.ui.select(\n\t\t[\n\t\t\t\"Review storage connection\",\n\t\t\t\"\",\n\t\t\t`Name: ${safeTerminalText(name)}`,\n\t\t\t`Type: ${preset}`,\n\t\t\t`Endpoint: ${safeTerminalText(endpoint)}`,\n\t\t\t`Region: ${safeTerminalText(region)}`,\n\t\t\t`Credentials: ${safeTerminalText(credentials.summary)}`,\n\t\t\t\"Adding a connection does not contact remote storage or start syncing.\",\n\t\t].join(\"\\n\"),\n\t\t[\"Add storage connection\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tif (save !== \"Add storage connection\" || signal?.aborted) return false;\n\tawait addStorageConnection(\n\t\tname,\n\t\t{\n\t\t\ttype: \"s3\",\n\t\t\tendpoint,\n\t\t\tregion,\n\t\t\tcredentials: {\n\t\t\t\taccessKeyId: credentials.profileFields.accessKeyId ?? \"\",\n\t\t\t\tsecretAccessKey: credentials.profileFields.secretAccessKey ?? \"\",\n\t\t\t},\n\t\t},\n\t\tsignal,\n\t);\n\tif (signal?.aborted) return true;\n\tctx.ui.notify(`Added storage connection \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n\treturn true;\n}\n\nfunction referencingSetups(raw: Record<string, unknown> | undefined, connection: string) {\n\treturn Object.entries(ownRecord(raw?.syncSetups) ?? {})\n\t\t.filter(([, value]) => ownRecord(ownRecord(value)?.storage)?.connection === connection)\n\t\t.map(([name]) => name)\n\t\t.sort((left, right) => left.localeCompare(right));\n}\n\nfunction connectionType(profile: Record<string, unknown>) {\n\tif (profile.type === \"git\") return \"Git\";\n\tif (profile.type === \"webdav\") return \"WebDAV\";\n\tif (\n\t\tprofile.type === \"s3\" &&\n\t\ttypeof profile.endpoint === \"string\" &&\n\t\tisCloudflareR2Endpoint(profile.endpoint)\n\t) {\n\t\treturn \"Cloudflare R2\";\n\t}\n\treturn \"S3-compatible\";\n}\n\nfunction connectionEndpoint(profile: Record<string, unknown>) {\n\tconst value =\n\t\tprofile.type === \"git\"\n\t\t\t? profile.remote\n\t\t\t: profile.type === \"webdav\"\n\t\t\t\t? profile.url\n\t\t\t\t: profile.endpoint;\n\tif (typeof value !== \"string\" || value.length === 0) return \"Missing\";\n\tif (profile.type === \"git\") return safeTerminalText(value);\n\ttry {\n\t\treturn safeTerminalText(new URL(value).host);\n\t} catch {\n\t\treturn \"Invalid\";\n\t}\n}\n\nfunction credentialSource(profile: Record<string, unknown>) {\n\tif (profile.type === \"git\") return \"Git credential helper or SSH configuration\";\n\tconst credentials = ownRecord(profile.credentials);\n\tif (profile.type === \"webdav\") return credentials?.password ? \"Settings file\" : \"Missing\";\n\tif (credentials?.accessKeyId && credentials.secretAccessKey) return \"Settings file\";\n\treturn \"Missing\";\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { promptSecret } from \"./secret-input.js\";\nimport {\n\taddStorageConnection,\n\taddSyncSetup,\n\tsaveNewV3Settings,\n\tupdateStorageConnection,\n\tupdateSyncSetup,\n} from \"./settings-management.js\";\nimport { DEFAULT_SYNC_INCLUDE } from \"./sync-policy.js\";\nimport type { PartialConfig } from \"./types.js\";\nimport {\n\tnormalizeWebDavPath,\n\tnormalizeWebDavUrl,\n\tvalidateWebDavCredentials,\n\tvalidateWebDavNamespace,\n} from \"./webdav-config.js\";\n\nexport async function showWebDavSetup(\n\tctx: ExtensionCommandContext,\n\ttargetName: string,\n\tsignal?: AbortSignal,\n) {\n\tconst url = await requiredInput(\n\t\tctx,\n\t\t\"WebDAV collection URL\",\n\t\t\"https://cloud.example.com/remote.php/dav/files/user\",\n\t\tsignal,\n\t);\n\tif (!url) return false;\n\tconst username = await requiredInput(ctx, \"WebDAV username\", \"user\", signal);\n\tif (!username) return false;\n\tconst password = await awaitActive(signal, promptSecret(ctx, \"WebDAV password\", { signal }));\n\tif (password === undefined) return false;\n\tconst location = await chooseDestination(ctx, targetName, signal);\n\tif (!location) return false;\n\tconst connection = validateConnection(ctx, url, username, password);\n\tconst destination = validateDestination(ctx, location.path);\n\tif (!connection || !destination) return false;\n\tconst content = await chooseContent(ctx, signal);\n\tif (!content) return false;\n\tconst automatic = await select(\n\t\tctx,\n\t\t\"Automatic sync for this setup\",\n\t\t[\"Enable automatic sync\", \"Keep automatic sync off\", \"Cancel\"],\n\t\tsignal,\n\t);\n\tif (!automatic || automatic === \"Cancel\") return false;\n\tconst sessions = await chooseSessions(ctx, signal);\n\tif (sessions === undefined) return false;\n\tconst profileName = \"webdav\";\n\tconst review = await select(\n\t\tctx,\n\t\t[\n\t\t\t\"Review WebDAV setup\",\n\t\t\t\"\",\n\t\t\t`Sync setup: ${safe(targetName)}`,\n\t\t\t`Storage connection: ${profileName} (WebDAV)`,\n\t\t\t`URL: ${displayUrl(connection.url)}`,\n\t\t\t`Storage location: ${safe(destination.path)}`,\n\t\t\t\"Username: stored in the private settings file (value hidden)\",\n\t\t\t\"Password: configured (value hidden)\",\n\t\t\t`Conditional writes: /sync doctor verifies atomic If-Match and If-None-Match support before publication.`,\n\t\t\t`Included content: ${content.length} built-in groups \u00B7 Sessions: ${sessions ? \"On \u2014 privacy warning acknowledged\" : \"Off\"}`,\n\t\t\t`Automatic sync: ${automatic === \"Enable automatic sync\" ? \"On\" : \"Off\"}`,\n\t\t].join(\"\\n\"),\n\t\t[\"Save setup\", \"Cancel\"],\n\t\tsignal,\n\t);\n\tif (review !== \"Save setup\") return false;\n\tthrowIfAborted(signal);\n\tawait awaitActive(\n\t\tsignal,\n\t\tsaveNewV3Settings(\n\t\t\t{\n\t\t\t\tsetupName: targetName,\n\t\t\t\tconnectionName: profileName,\n\t\t\t\tconnection: {\n\t\t\t\t\ttype: \"webdav\",\n\t\t\t\t\turl: connection.url,\n\t\t\t\t\tcredentials: { username: connection.username, password: connection.password ?? \"\" },\n\t\t\t\t},\n\t\t\t\tsetup: {\n\t\t\t\t\tstorage: { connection: profileName, path: destination.path },\n\t\t\t\t\tsync: {\n\t\t\t\t\t\tinclude: [...content, ...(sessions ? [\"sessions\"] : [])],\n\t\t\t\t\t\tautomatic: automatic === \"Enable automatic sync\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tsignal,\n\t\t),\n\t);\n\tctx.ui.notify(`Sync setup \u201C${safe(targetName)}\u201D is ready. Use Sync now when ready.`, \"info\");\n\treturn true;\n}\n\nexport async function showAddWebDavTarget(\n\tctx: ExtensionCommandContext,\n\tname: string,\n\tprofile: string,\n\tsignal?: AbortSignal,\n) {\n\tconst location = await chooseDestination(ctx, name, signal);\n\tif (!location) return false;\n\tconst destination = validateDestination(ctx, location.path);\n\tif (!destination) return false;\n\tconst content = await chooseContent(ctx, signal);\n\tif (!content) return false;\n\tconst review = await select(\n\t\tctx,\n\t\t`Review WebDAV sync setup\\n\\nSync setup: ${safe(name)}\\nStorage connection: ${safe(profile)}\\nStorage location: ${safe(destination.path)}\\nIncluded content: ${content.length} built-in groups \u00B7 Sessions: Off\\nAdding this setup does not sync or modify remote data.`,\n\t\t[\"Add sync setup\", \"Cancel\"],\n\t\tsignal,\n\t);\n\tif (review !== \"Add sync setup\") return false;\n\tthrowIfAborted(signal);\n\tawait awaitActive(\n\t\tsignal,\n\t\taddSyncSetup(\n\t\t\tname,\n\t\t\t{\n\t\t\t\tstorage: { connection: profile, path: destination.path },\n\t\t\t\tsync: { include: content, automatic: true },\n\t\t\t},\n\t\t\tsignal,\n\t\t),\n\t);\n\tctx.ui.notify(`Added sync setup \u201C${safe(name)}\u201D.`, \"info\");\n\treturn true;\n}\n\nexport async function showEditWebDavTarget(\n\tctx: ExtensionCommandContext,\n\tpartial: PartialConfig,\n\tsignal?: AbortSignal,\n) {\n\tconst remotePath = await requiredInput(ctx, \"WebDAV storage path\", partial.storagePath, signal);\n\tif (!remotePath) return false;\n\tconst destination = validateDestination(ctx, remotePath);\n\tif (!destination) return false;\n\tconst review = await select(\n\t\tctx,\n\t\t`Review sync setup \u201C${safe(partial.setupName)}\u201D\\n\\nStorage path: ${safe(partial.storagePath)} \u2192 ${safe(destination.path)}\\nSaving changes the future storage location only; it does not move or delete remote data.`,\n\t\t[\"Save sync setup\", \"Cancel\"],\n\t\tsignal,\n\t);\n\tif (review !== \"Save sync setup\") return false;\n\tthrowIfAborted(signal);\n\tawait awaitActive(\n\t\tsignal,\n\t\tupdateSyncSetup(\n\t\t\tpartial.setupName,\n\t\t\t(setup) => ({\n\t\t\t\t...setup,\n\t\t\t\tstorage: { ...setup.storage, path: destination.path },\n\t\t\t}),\n\t\t\t{ expectedStorage: partial, signal },\n\t\t),\n\t);\n\tctx.ui.notify(`Saved sync setup \u201C${safe(partial.setupName)}\u201D.`, \"info\");\n\treturn true;\n}\n\nexport async function showAddWebDavStorageProfile(\n\tctx: ExtensionCommandContext,\n\tsignal?: AbortSignal,\n) {\n\tconst name = await requiredInput(ctx, \"Name this storage connection\", \"webdav\", signal);\n\tif (!name) return false;\n\tconst url = await requiredInput(\n\t\tctx,\n\t\t\"WebDAV collection URL\",\n\t\t\"https://cloud.example.com/dav\",\n\t\tsignal,\n\t);\n\tif (!url) return false;\n\tconst username = await requiredInput(ctx, \"WebDAV username\", \"user\", signal);\n\tif (!username) return false;\n\tconst password = await awaitActive(signal, promptSecret(ctx, \"WebDAV password\", { signal }));\n\tif (password === undefined) return false;\n\tconst connection = validateConnection(ctx, url, username, password);\n\tif (!connection) return false;\n\tconst review = await select(\n\t\tctx,\n\t\t`Review storage connection\\n\\nName: ${safe(name)}\\nType: WebDAV\\nURL: ${displayUrl(connection.url)}\\nUsername: stored privately (value hidden)\\nPassword: configured (value hidden)\\nAdding a connection does not contact the server or start syncing.`,\n\t\t[\"Add storage connection\", \"Cancel\"],\n\t\tsignal,\n\t);\n\tif (review !== \"Add storage connection\") return false;\n\tthrowIfAborted(signal);\n\tawait awaitActive(\n\t\tsignal,\n\t\taddStorageConnection(\n\t\t\tname,\n\t\t\t{\n\t\t\t\ttype: \"webdav\",\n\t\t\t\turl: connection.url,\n\t\t\t\tcredentials: { username: connection.username, password: connection.password ?? \"\" },\n\t\t\t},\n\t\t\tsignal,\n\t\t),\n\t);\n\tctx.ui.notify(`Added storage connection \u201C${safe(name)}\u201D.`, \"info\");\n\treturn true;\n}\n\nexport async function showEditWebDavStorageProfile(\n\tctx: ExtensionCommandContext,\n\tname: string,\n\tprofile: Record<string, unknown>,\n\tsignal?: AbortSignal,\n\taffectedSetups?: string[],\n) {\n\tconst url = await requiredInput(\n\t\tctx,\n\t\t\"WebDAV collection URL\",\n\t\tString(profile.url ?? \"https://cloud.example.com/dav\"),\n\t\tsignal,\n\t);\n\tif (!url) return false;\n\tconst username = await requiredInput(\n\t\tctx,\n\t\t\"WebDAV username\",\n\t\tString(profile.username ?? \"user\"),\n\t\tsignal,\n\t);\n\tif (!username) return false;\n\tlet password: string | undefined;\n\tlet replacePassword = false;\n\tif (typeof profile.password === \"string\" && profile.password.length > 0) {\n\t\tconst passwordAction = await select(\n\t\t\tctx,\n\t\t\t\"WebDAV password\",\n\t\t\t[\"Keep current password\", \"Replace password\", \"Cancel\"],\n\t\t\tsignal,\n\t\t);\n\t\tif (!passwordAction || passwordAction === \"Cancel\") return false;\n\t\treplacePassword = passwordAction === \"Replace password\";\n\t} else {\n\t\treplacePassword = true;\n\t}\n\tif (replacePassword) {\n\t\tpassword = await awaitActive(signal, promptSecret(ctx, \"New WebDAV password\", { signal }));\n\t\tif (password === undefined) return false;\n\t}\n\tconst connection = validateConnection(ctx, url, username, password);\n\tif (!connection) return false;\n\tconst review = await select(\n\t\tctx,\n\t\t`Review storage connection\\n\\nStorage connection: ${safe(name)}\\nURL: ${displayUrl(String(profile.url ?? \"https://invalid.invalid\"))} \u2192 ${displayUrl(connection.url)}\\nUsername: stored privately (value hidden)\\nPassword: ${replacePassword ? \"will be replaced\" : \"unchanged\"} (value hidden)\\nAffected sync setups: ${affectedSetups && affectedSetups.length > 0 ? affectedSetups.map(safe).join(\", \") : \"None\"}\\nSaving changes future storage access for every affected setup; it does not move remote data.`,\n\t\t[\"Save storage connection\", \"Cancel\"],\n\t\tsignal,\n\t);\n\tif (review !== \"Save storage connection\") return false;\n\tthrowIfAborted(signal);\n\tawait awaitActive(\n\t\tsignal,\n\t\tupdateStorageConnection(\n\t\t\tname,\n\t\t\t(current) => {\n\t\t\t\tif (current.type !== \"webdav\") {\n\t\t\t\t\tthrow new Error(\"Storage connection type changed; reopen it.\");\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...current,\n\t\t\t\t\turl: connection.url,\n\t\t\t\t\tcredentials: {\n\t\t\t\t\t\t...current.credentials,\n\t\t\t\t\t\tusername: connection.username,\n\t\t\t\t\t\tpassword: replacePassword\n\t\t\t\t\t\t\t? (connection.password ?? current.credentials.password)\n\t\t\t\t\t\t\t: current.credentials.password,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t\taffectedSetups,\n\t\t\tsignal,\n\t\t),\n\t);\n\tctx.ui.notify(`Saved storage connection \u201C${safe(name)}\u201D.`, \"info\");\n\treturn true;\n}\n\nasync function chooseDestination(\n\tctx: ExtensionCommandContext,\n\ttargetName: string,\n\tsignal?: AbortSignal,\n) {\n\tconst remotePath = await requiredInput(\n\t\tctx,\n\t\t\"WebDAV storage path\",\n\t\t`pi-sync/${targetName}`,\n\t\tsignal,\n\t);\n\treturn remotePath ? validateDestination(ctx, remotePath) : undefined;\n}\n\nasync function chooseContent(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n\tconst choice = await select(\n\t\tctx,\n\t\t\"Choose an initial sync preset\",\n\t\t[\"Recommended Pi settings\", \"Minimal settings\", \"Cancel\"],\n\t\tsignal,\n\t);\n\tif (!choice || choice === \"Cancel\") return undefined;\n\treturn choice === \"Minimal settings\" ? [\"settings.json\", \"AGENTS.md\"] : [...DEFAULT_SYNC_INCLUDE];\n}\n\nasync function chooseSessions(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n\tconst choice = await select(\n\t\tctx,\n\t\t\"Session conversations\\n\\nSessions can contain prompts, tool output, paths, screenshots, and secrets.\",\n\t\t[\"Keep sessions off (recommended)\", \"Include session conversations\", \"Cancel\"],\n\t\tsignal,\n\t);\n\tif (!choice || choice === \"Cancel\") return undefined;\n\tif (choice !== \"Include session conversations\") return false;\n\treturn confirm(\n\t\tctx,\n\t\t\"Include session conversations?\",\n\t\t\"I understand that session JSONL can contain prompts, tool output, paths, screenshots, and secrets.\",\n\t\tsignal,\n\t);\n}\n\nasync function requiredInput(\n\tctx: ExtensionCommandContext,\n\ttitle: string,\n\tplaceholder: string,\n\tsignal?: AbortSignal,\n) {\n\tconst value = await awaitActive(signal, ctx.ui.input(title, placeholder, { signal }));\n\tif (value === undefined) return undefined;\n\tconst trimmed = value.trim();\n\tif (!trimmed) {\n\t\tctx.ui.notify(`${title} is required.`, \"warning\");\n\t\treturn undefined;\n\t}\n\treturn trimmed;\n}\n\nasync function select(\n\tctx: ExtensionCommandContext,\n\ttitle: string,\n\toptions: string[],\n\tsignal?: AbortSignal,\n) {\n\treturn awaitActive(signal, ctx.ui.select(title, options, { signal }));\n}\n\nasync function confirm(\n\tctx: ExtensionCommandContext,\n\ttitle: string,\n\tmessage: string,\n\tsignal?: AbortSignal,\n) {\n\treturn awaitActive(signal, ctx.ui.confirm(title, message, { signal }));\n}\n\nasync function awaitActive<T>(signal: AbortSignal | undefined, operation: Promise<T>) {\n\tconst result = await operation;\n\tthrowIfAborted(signal);\n\treturn result;\n}\n\nfunction throwIfAborted(signal?: AbortSignal) {\n\tif (!signal?.aborted) return;\n\tthrow signal.reason instanceof Error\n\t\t? signal.reason\n\t\t: new DOMException(\"The operation was aborted\", \"AbortError\");\n}\n\nfunction validateConnection(\n\tctx: ExtensionCommandContext,\n\turl: string,\n\tusername: string,\n\tpassword?: string,\n) {\n\ttry {\n\t\tconst normalizedUrl = normalizeWebDavUrl(url);\n\t\tif (!normalizedUrl) throw new Error(\"WebDAV URL is required.\");\n\t\tvalidateWebDavCredentials(username, password);\n\t\treturn {\n\t\t\turl: normalizedUrl,\n\t\t\tusername: username.trim(),\n\t\t\t...(password === undefined ? {} : { password }),\n\t\t};\n\t} catch (error) {\n\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\treturn undefined;\n\t}\n}\n\nfunction validateDestination(ctx: ExtensionCommandContext, path: string, namespace?: string) {\n\ttry {\n\t\tconst basePath = normalizeWebDavPath(path);\n\t\tconst normalizedPath = namespace\n\t\t\t? normalizeWebDavPath(`${basePath}/${namespace.trim()}`)\n\t\t\t: basePath;\n\t\tconst resolvedNamespace = normalizedPath.slice(normalizedPath.lastIndexOf(\"/\") + 1);\n\t\tvalidateWebDavNamespace(resolvedNamespace);\n\t\treturn { path: normalizedPath, namespace: resolvedNamespace };\n\t} catch (error) {\n\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\treturn undefined;\n\t}\n}\n\nfunction displayUrl(value: string) {\n\ttry {\n\t\treturn `${new URL(value).origin}/\u2026`;\n\t} catch {\n\t\treturn \"invalid URL (value hidden)\";\n\t}\n}\n\nfunction safe(value: string) {\n\t// biome-ignore lint/suspicious/noControlCharactersInRegex: Settings values are untrusted terminal input.\n\treturn value.replace(/[\\u0000-\\u001f\\u007f-\\u009f]/gu, \"\uFFFD\");\n}\n"],
  "mappings": "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",
  "names": ["defineMenu", "runMenu", "safeTerminalText", "safeTerminalText", "throwIfAborted", "safeTerminalText", "safeTerminalText", "truncateToWidth", "throwIfAborted", "defineMenu", "runMenu", "defineMenu", "runMenu", "defineMenu", "runMenu", "requiredInput", "throwIfAborted", "defineMenu", "safeTerminalText", "runMenu", "defineMenu", "runMenu", "safeTerminalText", "choice", "suggestedPath", "bucket"]
}
