@narumitw/pi-sync 0.49.15 → 0.50.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -16
- package/dist/chunks/attention-widget-Z7G3SYYJ.ts +9 -0
- package/dist/chunks/attention-widget-Z7G3SYYJ.ts.map +7 -0
- package/dist/chunks/chunk-2B2ELUF5.ts +29 -0
- package/dist/chunks/chunk-2B2ELUF5.ts.map +7 -0
- package/dist/chunks/{chunk-ARN2672F.ts → chunk-4CHTZMEO.ts} +23 -55
- package/dist/chunks/chunk-4CHTZMEO.ts.map +7 -0
- package/dist/chunks/chunk-6LP3MCR2.ts +115 -0
- package/dist/chunks/chunk-6LP3MCR2.ts.map +7 -0
- package/dist/chunks/{chunk-JF6MZCT4.ts → chunk-AUSDLD6F.ts} +4 -4
- package/dist/chunks/chunk-AUSDLD6F.ts.map +7 -0
- package/dist/chunks/{chunk-5T442OP3.ts → chunk-C7XY5NF5.ts} +210 -373
- package/dist/chunks/chunk-C7XY5NF5.ts.map +7 -0
- package/dist/chunks/chunk-CCSN3F47.ts +51 -0
- package/dist/chunks/chunk-CCSN3F47.ts.map +7 -0
- package/dist/chunks/{chunk-4U6AFLJB.ts → chunk-CHH26D4F.ts} +3 -2
- package/dist/chunks/chunk-CHH26D4F.ts.map +7 -0
- package/dist/chunks/chunk-CPEHGXJV.ts +50 -0
- package/dist/chunks/chunk-CPEHGXJV.ts.map +7 -0
- package/dist/chunks/{chunk-5MQ76BK5.ts → chunk-D5X27LCA.ts} +2 -2
- package/dist/chunks/chunk-D5X27LCA.ts.map +7 -0
- package/dist/chunks/{chunk-WSOBYHIZ.ts → chunk-ETTRJDNP.ts} +4 -4
- package/dist/chunks/chunk-ETTRJDNP.ts.map +7 -0
- package/dist/chunks/{chunk-44LPGQTI.ts → chunk-G4RNQQZS.ts} +9 -7
- package/dist/chunks/chunk-G4RNQQZS.ts.map +7 -0
- package/dist/chunks/{chunk-5LZALPCD.ts → chunk-HUDQATCL.ts} +25 -25
- package/dist/chunks/chunk-HUDQATCL.ts.map +7 -0
- package/dist/chunks/{chunk-X7SQ2EQM.ts → chunk-IJ6FJFA5.ts} +9 -9
- package/dist/chunks/chunk-IJ6FJFA5.ts.map +7 -0
- package/dist/chunks/{chunk-YQ6UW7IF.ts → chunk-JAAKLL6M.ts} +2 -2
- package/dist/chunks/chunk-JAAKLL6M.ts.map +7 -0
- package/dist/chunks/chunk-KW7YQEZN.ts +1255 -0
- package/dist/chunks/chunk-KW7YQEZN.ts.map +7 -0
- package/dist/chunks/{chunk-DFXBKHGN.ts → chunk-LCRI3ABW.ts} +21 -8
- package/dist/chunks/chunk-LCRI3ABW.ts.map +7 -0
- package/dist/chunks/chunk-LTBWGSBV.ts +12 -0
- package/dist/chunks/chunk-LTBWGSBV.ts.map +7 -0
- package/dist/chunks/chunk-NJFUIVYL.ts +17 -0
- package/dist/chunks/chunk-NJFUIVYL.ts.map +7 -0
- package/dist/chunks/{chunk-HVUSHMVL.ts → chunk-OEX4ABY6.ts} +39 -37
- package/dist/chunks/chunk-OEX4ABY6.ts.map +7 -0
- package/dist/chunks/{chunk-HGV24P4T.ts → chunk-Q2TUM5X6.ts} +3 -3
- package/dist/chunks/chunk-Q2TUM5X6.ts.map +7 -0
- package/dist/chunks/chunk-S7YBZR42.ts +146 -0
- package/dist/chunks/chunk-S7YBZR42.ts.map +7 -0
- package/dist/chunks/{chunk-GLQLN5GV.ts → chunk-SL64RLXR.ts} +8 -6
- package/dist/chunks/chunk-SL64RLXR.ts.map +7 -0
- package/dist/chunks/chunk-SZWBGPID.ts +57 -0
- package/dist/chunks/chunk-SZWBGPID.ts.map +7 -0
- package/dist/chunks/chunk-T2B5IU74.ts +25 -0
- package/dist/chunks/chunk-T2B5IU74.ts.map +7 -0
- package/dist/chunks/chunk-T3HH3UEJ.ts +96 -0
- package/dist/chunks/chunk-T3HH3UEJ.ts.map +7 -0
- package/dist/chunks/chunk-TEN2ZBJV.ts +101 -0
- package/dist/chunks/chunk-TEN2ZBJV.ts.map +7 -0
- package/dist/chunks/chunk-THMF4BVL.ts +18 -0
- package/dist/chunks/chunk-THMF4BVL.ts.map +7 -0
- package/dist/chunks/chunk-Z4DQF6L3.ts +12 -0
- package/dist/chunks/chunk-Z4DQF6L3.ts.map +7 -0
- package/dist/chunks/{chunk-F5QL2GPY.ts → chunk-ZI5MXMEX.ts} +5 -99
- package/dist/chunks/chunk-ZI5MXMEX.ts.map +7 -0
- package/dist/chunks/{file-selection-RKEHALNQ.ts → file-selection-FTTKAOYX.ts} +10 -7
- package/dist/chunks/file-selection-FTTKAOYX.ts.map +7 -0
- package/dist/chunks/{git-backend-E3UOUUOM.ts → git-backend-GMVS4PD4.ts} +39 -14
- package/dist/chunks/git-backend-GMVS4PD4.ts.map +7 -0
- package/dist/chunks/manager-result-dispatcher-FKIBM3GO.ts +22 -0
- package/dist/chunks/manager-ui-R3XPUFFS.ts +1680 -0
- package/dist/chunks/manager-ui-R3XPUFFS.ts.map +7 -0
- package/dist/chunks/remote-selection-ui-D7RBRJNL.ts +21 -0
- package/dist/chunks/{s3-backend-552LXHE4.ts → s3-backend-66O4FGBH.ts} +94 -16
- package/dist/chunks/s3-backend-66O4FGBH.ts.map +7 -0
- package/dist/chunks/{setup-switch-5YDG5YGJ.ts → setup-switch-IS2PEZ3J.ts} +9 -9
- package/dist/chunks/setup-wizard-IUB6ESEU.ts +89 -0
- package/dist/chunks/setup-wizard-IUB6ESEU.ts.map +7 -0
- package/dist/chunks/{snapshot-2RYBUDRA.ts → snapshot-HKEWCVK6.ts} +7 -6
- package/dist/chunks/sync-inspection-CST2KL65.ts +20 -0
- package/dist/chunks/{sync-operations-3LLIHWZO.ts → sync-operations-LBX3GKCM.ts} +369 -289
- package/dist/chunks/sync-operations-LBX3GKCM.ts.map +7 -0
- package/dist/chunks/{sync-state-SRN6YRBK.ts → sync-state-Q2FTXTW6.ts} +6 -6
- package/dist/chunks/sync-state-Q2FTXTW6.ts.map +7 -0
- package/dist/chunks/{webdav-backend-ZD5RHRIU.ts → webdav-backend-ECIKD7SO.ts} +26 -13
- package/dist/chunks/webdav-backend-ECIKD7SO.ts.map +7 -0
- package/dist/index.ts +476 -341
- package/dist/index.ts.map +4 -4
- package/docs/settings.md +30 -6
- package/package.json +1 -1
- package/src/{backend-factory.ts → backends/backend-factory.ts} +4 -4
- package/src/backends/backend-identity.ts +40 -0
- package/src/backends/backend-types.ts +81 -0
- package/src/{git-backend.ts → backends/git/git-backend.ts} +43 -19
- package/src/{git-config.ts → backends/git/git-config.ts} +1 -0
- package/src/{git-storage.ts → backends/git/git-storage.ts} +2 -2
- package/src/{s3-backend.ts → backends/s3/s3-backend.ts} +45 -9
- package/src/{s3-client.ts → backends/s3/s3-client.ts} +56 -8
- package/src/{sync-backend.ts → backends/sync-backend.ts} +1 -1
- package/src/{webdav-backend.ts → backends/webdav/webdav-backend.ts} +22 -10
- package/src/{webdav-client.ts → backends/webdav/webdav-client.ts} +1 -1
- package/src/{webdav-config.ts → backends/webdav/webdav-config.ts} +1 -0
- package/src/commands/command-execution.ts +330 -0
- package/src/commands/command-handler.ts +201 -0
- package/src/commands/command-types.ts +18 -0
- package/src/{command.ts → commands/command.ts} +2 -1
- package/src/commands/setup-completions.ts +6 -0
- package/src/settings/config.ts +238 -0
- package/src/{settings-management.ts → settings/settings-management.ts} +39 -14
- package/src/settings/settings-store.ts +109 -0
- package/src/settings/settings-types.ts +128 -0
- package/src/settings/settings-validation.ts +443 -0
- package/src/snapshot/session-paths.ts +84 -0
- package/src/{snapshot-apply.ts → snapshot/snapshot-apply.ts} +3 -3
- package/src/{snapshot-codec.ts → snapshot/snapshot-codec.ts} +2 -2
- package/src/{snapshot-transaction.ts → snapshot/snapshot-transaction.ts} +5 -4
- package/src/snapshot/snapshot-types.ts +38 -0
- package/src/{snapshot.ts → snapshot/snapshot.ts} +39 -20
- package/src/state/json-file.ts +20 -0
- package/src/{lock.ts → state/lock.ts} +3 -2
- package/src/{operation-availability.ts → state/operation-availability.ts} +2 -2
- package/src/state/state-types.ts +20 -0
- package/src/state/sync-state-store.ts +62 -0
- package/src/sync/automatic-sync.ts +103 -0
- package/src/{remote-snapshot.ts → sync/remote-snapshot.ts} +27 -4
- package/src/{setup-switch.ts → sync/setup-switch.ts} +6 -7
- package/src/sync/signals.ts +10 -0
- package/src/sync/startup-check.ts +128 -0
- package/src/{sync-decision.ts → sync/sync-decision.ts} +6 -3
- package/src/sync/sync-error-guidance.ts +53 -0
- package/src/sync/sync-inspection.ts +51 -0
- package/src/sync/sync-loaders.ts +54 -0
- package/src/{sync-operations.ts → sync/sync-mutations.ts} +34 -325
- package/src/sync/sync-operations.ts +12 -0
- package/src/{sync-policy.ts → sync/sync-policy.ts} +2 -2
- package/src/sync/sync-queries.ts +235 -0
- package/src/{sync-state.ts → sync/sync-state.ts} +5 -4
- package/src/sync-extension.ts +64 -708
- package/src/sync.ts +8 -8
- package/src/types.ts +47 -286
- package/src/ui/attention-widget.ts +1 -0
- package/src/ui/automatic-sync-summary.ts +6 -0
- package/src/{cancellable-operation.ts → ui/cancellable-operation.ts} +4 -4
- package/src/{file-selection.ts → ui/file-selection.ts} +5 -3
- package/src/{manager-attention.ts → ui/manager-attention.ts} +5 -1
- package/src/{manager-recovery.ts → ui/manager-recovery.ts} +6 -2
- package/src/{manager-state.ts → ui/manager-state.ts} +35 -14
- package/src/ui/manager-ui.ts +386 -0
- package/src/{remote-selection-ui.ts → ui/remote-selection-ui.ts} +21 -13
- package/src/{secret-input.ts → ui/secret-input.ts} +22 -4
- package/src/{settings-ui.ts → ui/settings-ui.ts} +17 -13
- package/src/ui/setup/git-ui.ts +293 -0
- package/src/{s3-credentials-ui.ts → ui/setup/s3-credentials-ui.ts} +13 -21
- package/src/ui/setup/s3-ui.ts +217 -0
- package/src/ui/setup/setup-actions.ts +127 -0
- package/src/ui/setup/setup-location-ui.ts +167 -0
- package/src/ui/setup/setup-name-ui.ts +34 -0
- package/src/ui/setup/setup-prompts.ts +92 -0
- package/src/ui/setup/setup-review.ts +70 -0
- package/src/ui/setup/setup-switcher.ts +181 -0
- package/src/ui/setup/setup-wizard.ts +39 -0
- package/src/ui/setup/text-input.ts +78 -0
- package/src/ui/setup/webdav-ui.ts +330 -0
- package/src/{storage-connections-ui.ts → ui/storage-connections-ui.ts} +99 -69
- package/src/ui/sync-attention.ts +187 -0
- package/src/{sync-format.ts → ui/sync-format.ts} +7 -13
- package/src/{sync-resolution-ui.ts → ui/sync-resolution-ui.ts} +4 -3
- package/src/{sync-setups-ui.ts → ui/sync-setups-ui.ts} +23 -10
- package/src/ui/terminal-text.ts +4 -0
- package/dist/chunks/chunk-44LPGQTI.ts.map +0 -7
- package/dist/chunks/chunk-4U6AFLJB.ts.map +0 -7
- package/dist/chunks/chunk-5LZALPCD.ts.map +0 -7
- package/dist/chunks/chunk-5MQ76BK5.ts.map +0 -7
- package/dist/chunks/chunk-5T442OP3.ts.map +0 -7
- package/dist/chunks/chunk-ARN2672F.ts.map +0 -7
- package/dist/chunks/chunk-C7LXZ3UH.ts +0 -167
- package/dist/chunks/chunk-C7LXZ3UH.ts.map +0 -7
- package/dist/chunks/chunk-DFXBKHGN.ts.map +0 -7
- package/dist/chunks/chunk-E4COSV32.ts +0 -82
- package/dist/chunks/chunk-E4COSV32.ts.map +0 -7
- package/dist/chunks/chunk-F5QL2GPY.ts.map +0 -7
- package/dist/chunks/chunk-GLQLN5GV.ts.map +0 -7
- package/dist/chunks/chunk-HGV24P4T.ts.map +0 -7
- package/dist/chunks/chunk-HVUSHMVL.ts.map +0 -7
- package/dist/chunks/chunk-JF6MZCT4.ts.map +0 -7
- package/dist/chunks/chunk-WSOBYHIZ.ts.map +0 -7
- package/dist/chunks/chunk-X7SQ2EQM.ts.map +0 -7
- package/dist/chunks/chunk-YQ6UW7IF.ts.map +0 -7
- package/dist/chunks/file-selection-RKEHALNQ.ts.map +0 -7
- package/dist/chunks/git-backend-E3UOUUOM.ts.map +0 -7
- package/dist/chunks/manager-result-dispatcher-LWPYJAD5.ts +0 -18
- package/dist/chunks/manager-ui-NF4RUHBY.ts +0 -2785
- package/dist/chunks/manager-ui-NF4RUHBY.ts.map +0 -7
- package/dist/chunks/remote-selection-ui-NUF5P4ZJ.ts +0 -17
- package/dist/chunks/s3-backend-552LXHE4.ts.map +0 -7
- package/dist/chunks/sync-operations-3LLIHWZO.ts.map +0 -7
- package/dist/chunks/webdav-backend-ZD5RHRIU.ts.map +0 -7
- package/src/config.ts +0 -923
- package/src/git-ui.ts +0 -307
- package/src/manager-helpers.ts +0 -64
- package/src/manager-ui.ts +0 -997
- package/src/sync-attention.ts +0 -100
- package/src/webdav-ui.ts +0 -421
- /package/dist/chunks/{manager-result-dispatcher-LWPYJAD5.ts.map → manager-result-dispatcher-FKIBM3GO.ts.map} +0 -0
- /package/dist/chunks/{remote-selection-ui-NUF5P4ZJ.ts.map → remote-selection-ui-D7RBRJNL.ts.map} +0 -0
- /package/dist/chunks/{setup-switch-5YDG5YGJ.ts.map → setup-switch-IS2PEZ3J.ts.map} +0 -0
- /package/dist/chunks/{snapshot-2RYBUDRA.ts.map → snapshot-HKEWCVK6.ts.map} +0 -0
- /package/dist/chunks/{sync-state-SRN6YRBK.ts.map → sync-inspection-CST2KL65.ts.map} +0 -0
- /package/src/{git-runner.ts → backends/git/git-runner.ts} +0 -0
- /package/src/{config-errors.ts → settings/config-errors.ts} +0 -0
- /package/src/{config-file.ts → settings/config-file.ts} +0 -0
- /package/src/{snapshot-paths.ts → snapshot/snapshot-paths.ts} +0 -0
- /package/src/{lock-policy.ts → state/lock-policy.ts} +0 -0
- /package/src/{lockfile-fs.ts → state/lockfile-fs.ts} +0 -0
- /package/src/{state-directory.ts → state/state-directory.ts} +0 -0
- /package/src/{sync-errors.ts → sync/sync-errors.ts} +0 -0
- /package/src/{manager-result-dispatcher.ts → ui/manager-result-dispatcher.ts} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
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"],
|
|
4
|
-
"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\tKey,\n\ttype KeybindingsManager,\n\tmatchesKey,\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\", [\"ctrl+c\"]);\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 (matchesKey(data, Key.ctrl(\"c\")) || keybindings.matches(data, \"tui.select.cancel\")) {\n\t\t\t\t\t\tcomplete(undefined);\n\t\t\t\t\t} else 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\tadditionalKeys: readonly string[] = [],\n) {\n\tconst keys = [...new Set([...keybindings.getKeys(binding), ...additionalKeys])]\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, updateLocalConfig } 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\" | \"skip-secret-scan\" | \"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: \"skipSecretScan\",\n\t\t\t\t\t\tlabel: \"Skip secret scan\",\n\t\t\t\t\t\tdescription: \"Allow pushes without checking managed local files for possible secrets.\",\n\t\t\t\t\t\tcurrentValue: state.skipSecretScan ? \"On\" : \"Off\",\n\t\t\t\t\t\tvalues: [\"On\", \"Off\"],\n\t\t\t\t\t\taction: \"skip-secret-scan\",\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\"skip-secret-scan\": async ({ value, signal: actionSignal }) => {\n\t\t\t\tconst skipSecretScan = 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.skipSecretScan === skipSecretScan) return { kind: \"stay\" };\n\t\t\t\t\tawait updateLocalConfig((settings) => ({ ...settings, skipSecretScan }), mutationSignal);\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`Secret scan ${skipSecretScan ? \"disabled\" : \"enabled\"} for pushes.`,\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"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"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"]
|
|
7
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
// @generated by scripts/build-runtime.mjs; do not edit.
|
|
2
|
-
// @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
|
|
3
|
-
import {
|
|
4
|
-
showRemoteSelectionReview
|
|
5
|
-
} from "./chunk-ARN2672F.ts";
|
|
6
|
-
import "./chunk-DFXBKHGN.ts";
|
|
7
|
-
import "./chunk-5LZALPCD.ts";
|
|
8
|
-
import "./chunk-C7LXZ3UH.ts";
|
|
9
|
-
import "./chunk-JF6MZCT4.ts";
|
|
10
|
-
import "./chunk-HVUSHMVL.ts";
|
|
11
|
-
import "./chunk-5T442OP3.ts";
|
|
12
|
-
import "./chunk-F5QL2GPY.ts";
|
|
13
|
-
import "./chunk-YQ6UW7IF.ts";
|
|
14
|
-
export {
|
|
15
|
-
showRemoteSelectionReview
|
|
16
|
-
};
|
|
17
|
-
//# sourceMappingURL=remote-selection-ui-NUF5P4ZJ.ts.map
|