@narumitw/pi-sync 0.57.9 → 0.57.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +7 -1
- package/dist/chunks/{agent-candidate-GNEYR225.ts → agent-candidate-OCDPRI5G.ts} +12 -9
- package/dist/chunks/{agent-plan-3L7CRFDM.ts → agent-plan-P5B5RGZ7.ts} +22 -18
- package/dist/chunks/{agent-plan-3L7CRFDM.ts.map → agent-plan-P5B5RGZ7.ts.map} +1 -1
- package/dist/chunks/{agent-refusal-retry-RPTMUQXK.ts → agent-refusal-retry-476YGNU5.ts} +11 -8
- package/dist/chunks/{agent-refusal-retry-RPTMUQXK.ts.map → agent-refusal-retry-476YGNU5.ts.map} +1 -1
- package/dist/chunks/{agent-store-55CZOCPX.ts → agent-store-RJSMNOYP.ts} +12 -11
- package/dist/chunks/{agent-store-55CZOCPX.ts.map → agent-store-RJSMNOYP.ts.map} +1 -1
- package/dist/chunks/agent-sync-EUK2CPSS.ts +22 -0
- package/dist/chunks/{chunk-U3XRI2HF.ts → chunk-3IYAPMST.ts} +11 -11
- package/dist/chunks/{chunk-B4QZBDBT.ts → chunk-45COPAK7.ts} +10 -3
- package/dist/chunks/chunk-45COPAK7.ts.map +7 -0
- package/dist/chunks/chunk-5SFMBY5P.ts +26 -0
- package/dist/chunks/chunk-5SFMBY5P.ts.map +7 -0
- package/dist/chunks/{chunk-ED3TYIVW.ts → chunk-5TSCBBPP.ts} +5 -5
- package/dist/chunks/{chunk-5QAE3G3K.ts → chunk-67INJPKR.ts} +6 -6
- package/dist/chunks/{chunk-IWZH5KYS.ts → chunk-6LD5KX55.ts} +10 -10
- package/dist/chunks/{chunk-AAEEHR7H.ts → chunk-6O3EDBRL.ts} +2 -2
- package/dist/chunks/{chunk-CRKTAPSL.ts → chunk-7A35ZAVO.ts} +333 -237
- package/dist/chunks/chunk-7A35ZAVO.ts.map +7 -0
- package/dist/chunks/{chunk-6FVVRTL5.ts → chunk-7OLLPPLU.ts} +77 -63
- package/dist/chunks/chunk-7OLLPPLU.ts.map +7 -0
- package/dist/chunks/{chunk-PQW6GS4J.ts → chunk-7ZIYU5QS.ts} +12 -10
- package/dist/chunks/{chunk-PQW6GS4J.ts.map → chunk-7ZIYU5QS.ts.map} +1 -1
- package/dist/chunks/{chunk-S7QS4AWK.ts → chunk-AKMV47YC.ts} +5 -5
- package/dist/chunks/chunk-AR2DGDUI.ts +55 -0
- package/dist/chunks/chunk-AR2DGDUI.ts.map +7 -0
- package/dist/chunks/{chunk-GNH73BJ5.ts → chunk-BEST45H2.ts} +7 -7
- package/dist/chunks/chunk-CBLTWXAU.ts +114 -0
- package/dist/chunks/chunk-CBLTWXAU.ts.map +7 -0
- package/dist/chunks/{chunk-GP5DU62N.ts → chunk-CPT2BN6N.ts} +2 -2
- package/dist/chunks/{chunk-UPNVIUBN.ts → chunk-DN4IA7MR.ts} +6 -6
- package/dist/chunks/{chunk-PG7NMFP2.ts → chunk-DRTC4PKM.ts} +8 -8
- package/dist/chunks/chunk-ESKOPQVB.ts +348 -0
- package/dist/chunks/chunk-ESKOPQVB.ts.map +7 -0
- package/dist/chunks/{chunk-MKKF4IMY.ts → chunk-F7E3VFXU.ts} +5 -5
- package/dist/chunks/{chunk-HUZ5CR4W.ts → chunk-FHE2DCA2.ts} +3 -52
- package/dist/chunks/chunk-FHE2DCA2.ts.map +7 -0
- package/dist/chunks/{chunk-UBV24CG4.ts → chunk-FLHCOJCD.ts} +3 -3
- package/dist/chunks/chunk-GNYGNHFF.ts +27 -0
- package/dist/chunks/chunk-GNYGNHFF.ts.map +7 -0
- package/dist/chunks/chunk-KYTT7KV4.ts +319 -0
- package/dist/chunks/chunk-KYTT7KV4.ts.map +7 -0
- package/dist/chunks/{chunk-A6HU4ERM.ts → chunk-MKSMJPVA.ts} +6 -23
- package/dist/chunks/chunk-MKSMJPVA.ts.map +7 -0
- package/dist/chunks/{chunk-ORGBI36T.ts → chunk-OJARL2TG.ts} +4 -4
- package/dist/chunks/{chunk-JCH3VXIO.ts → chunk-OKPPZA4D.ts} +150 -91
- package/dist/chunks/chunk-OKPPZA4D.ts.map +7 -0
- package/dist/chunks/{chunk-QO333NM4.ts → chunk-OVBAW7KV.ts} +180 -133
- package/dist/chunks/chunk-OVBAW7KV.ts.map +7 -0
- package/dist/chunks/{chunk-GSNPASKB.ts → chunk-Q23JJW7E.ts} +6 -6
- package/dist/chunks/{chunk-YK52VDXG.ts → chunk-TIMWN2RH.ts} +10 -8
- package/dist/chunks/{chunk-YK52VDXG.ts.map → chunk-TIMWN2RH.ts.map} +1 -1
- package/dist/chunks/{chunk-UOHR7LRO.ts → chunk-TZC7GDJE.ts} +10 -22
- package/dist/chunks/chunk-TZC7GDJE.ts.map +7 -0
- package/dist/chunks/chunk-X7R6DCVF.ts +28 -0
- package/dist/chunks/chunk-X7R6DCVF.ts.map +7 -0
- package/dist/chunks/{chunk-76NB4R7U.ts → chunk-XJHQPB3E.ts} +2 -2
- package/dist/chunks/{chunk-BDB4IDM3.ts → chunk-Y4UVXOLQ.ts} +8 -6
- package/dist/chunks/{chunk-BDB4IDM3.ts.map → chunk-Y4UVXOLQ.ts.map} +1 -1
- package/dist/chunks/{chunk-P7DD5PWZ.ts → chunk-ZDDBZH72.ts} +3 -3
- package/dist/chunks/command-handler-F2E7A5T5.ts +548 -0
- package/dist/chunks/command-handler-F2E7A5T5.ts.map +7 -0
- package/dist/chunks/{config-KGIYTTXQ.ts → config-HYG7G5EM.ts} +7 -6
- package/dist/chunks/{conflict-artifacts-FXFIIBCB.ts → conflict-artifacts-J6WSDCWP.ts} +13 -9
- package/dist/chunks/{conflict-review-3X37QEIT.ts → conflict-review-2QMO2K6Q.ts} +31 -25
- package/dist/chunks/{conflict-review-3X37QEIT.ts.map → conflict-review-2QMO2K6Q.ts.map} +1 -1
- package/dist/chunks/{continuous-record-SQJ47CXN.ts → continuous-record-AH7JGYKM.ts} +8 -7
- package/dist/chunks/{continuous-sync-Q6QUD6TY.ts → continuous-sync-VRMXCA5X.ts} +33 -28
- package/dist/chunks/{continuous-sync-Q6QUD6TY.ts.map → continuous-sync-VRMXCA5X.ts.map} +1 -1
- package/dist/chunks/{file-selection-3JJYOVNR.ts → file-selection-IELTXSGZ.ts} +11 -10
- package/dist/chunks/{file-selection-3JJYOVNR.ts.map → file-selection-IELTXSGZ.ts.map} +1 -1
- package/dist/chunks/{git-backend-NYKSG5X6.ts → git-backend-KHD36W27.ts} +15 -12
- package/dist/chunks/{git-backend-NYKSG5X6.ts.map → git-backend-KHD36W27.ts.map} +1 -1
- package/dist/chunks/{local-fields-6DGYOOIK.ts → local-fields-JEKAPZKD.ts} +9 -5
- package/dist/chunks/manager-result-dispatcher-6W52NM7F.ts +32 -0
- package/dist/chunks/{manager-ui-ZH6DEC2G.ts → manager-ui-LM7DSJ2Y.ts} +124 -67
- package/dist/chunks/manager-ui-LM7DSJ2Y.ts.map +7 -0
- package/dist/chunks/{merge-baseline-store-RFCAH7KL.ts → merge-baseline-store-65GKUMXI.ts} +6 -5
- package/dist/chunks/remote-selection-ui-TD4C4W3J.ts +31 -0
- package/dist/chunks/{s3-backend-F7PR5FB3.ts → s3-backend-L24UZ6IK.ts} +24 -18
- package/dist/chunks/s3-backend-L24UZ6IK.ts.map +7 -0
- package/dist/chunks/{setup-switch-E7PHKI6J.ts → setup-switch-PIPXYPCW.ts} +6 -7
- package/dist/chunks/{setup-wizard-OVHZYXNW.ts → setup-wizard-RR5U3SUB.ts} +8 -9
- package/dist/chunks/{setup-wizard-OVHZYXNW.ts.map → setup-wizard-RR5U3SUB.ts.map} +1 -1
- package/dist/chunks/{snapshot-THS5EY2L.ts → snapshot-RGNDYT6A.ts} +10 -6
- package/dist/chunks/snapshot-transaction-26BQO36S.ts +24 -0
- package/dist/chunks/sync-inspection-MOMLGUTD.ts +25 -0
- package/dist/chunks/sync-inspection-MOMLGUTD.ts.map +7 -0
- package/dist/chunks/{sync-operations-Y72GNIQ2.ts → sync-operations-CV3TULLD.ts} +66 -57
- package/dist/chunks/{sync-operations-Y72GNIQ2.ts.map → sync-operations-CV3TULLD.ts.map} +1 -1
- package/dist/chunks/{sync-state-CFL4RRRB.ts → sync-state-7L4NT7W2.ts} +8 -5
- package/dist/chunks/sync-state-7L4NT7W2.ts.map +7 -0
- package/dist/chunks/{webdav-backend-TGFUH3SF.ts → webdav-backend-3ZCACILP.ts} +15 -12
- package/dist/chunks/{webdav-backend-TGFUH3SF.ts.map → webdav-backend-3ZCACILP.ts.map} +1 -1
- package/dist/index.ts +54 -537
- package/dist/index.ts.map +3 -3
- package/package.json +2 -2
- package/skills/configure-pi-sync/references/configuration.md +8 -1
- package/src/backends/s3/s3-client.ts +8 -1
- package/src/commands/command-execution.ts +8 -3
- package/src/paths.ts +6 -1
- package/src/settings/config-file.ts +205 -118
- package/src/settings/config.ts +2 -2
- package/src/settings/settings-management.ts +15 -1
- package/src/settings/settings-store.ts +0 -14
- package/src/settings/settings-validation.ts +1 -1
- package/src/snapshot/session-paths.ts +15 -2
- package/src/snapshot/snapshot-mutation-queues.ts +142 -0
- package/src/snapshot/snapshot-transaction-directory.ts +16 -0
- package/src/snapshot/snapshot-transaction.ts +123 -137
- package/src/sync/automatic-sync.ts +12 -6
- package/src/sync/local-field-policy.ts +29 -0
- package/src/sync/local-fields.ts +3 -29
- package/src/sync/merge-apply.ts +6 -0
- package/src/sync/mutation-owner.ts +22 -0
- package/src/sync/startup-check.ts +3 -2
- package/src/sync/sync-loaders.ts +4 -0
- package/src/sync/sync-local.ts +2 -19
- package/src/sync-extension.ts +7 -2
- package/src/ui/cancellable-operation.ts +36 -13
- package/src/ui/manager-state.ts +3 -1
- package/src/ui/manager-ui.ts +76 -24
- package/src/ui/remote-selection-ui.ts +131 -82
- package/src/ui/settings-ui.ts +2 -1
- package/dist/chunks/chunk-6FVVRTL5.ts.map +0 -7
- package/dist/chunks/chunk-A6HU4ERM.ts.map +0 -7
- package/dist/chunks/chunk-B4QZBDBT.ts.map +0 -7
- package/dist/chunks/chunk-CRKTAPSL.ts.map +0 -7
- package/dist/chunks/chunk-HUZ5CR4W.ts.map +0 -7
- package/dist/chunks/chunk-JCH3VXIO.ts.map +0 -7
- package/dist/chunks/chunk-QO333NM4.ts.map +0 -7
- package/dist/chunks/chunk-QOFMXPM5.ts +0 -735
- package/dist/chunks/chunk-QOFMXPM5.ts.map +0 -7
- package/dist/chunks/chunk-UOHR7LRO.ts.map +0 -7
- package/dist/chunks/manager-result-dispatcher-HOCM2GDA.ts +0 -24
- package/dist/chunks/manager-ui-ZH6DEC2G.ts.map +0 -7
- package/dist/chunks/remote-selection-ui-YFPGYGNE.ts +0 -23
- package/dist/chunks/s3-backend-F7PR5FB3.ts.map +0 -7
- package/dist/chunks/sync-inspection-J25EEKZK.ts +0 -21
- /package/dist/chunks/{agent-candidate-GNEYR225.ts.map → agent-candidate-OCDPRI5G.ts.map} +0 -0
- /package/dist/chunks/{config-KGIYTTXQ.ts.map → agent-sync-EUK2CPSS.ts.map} +0 -0
- /package/dist/chunks/{chunk-U3XRI2HF.ts.map → chunk-3IYAPMST.ts.map} +0 -0
- /package/dist/chunks/{chunk-ED3TYIVW.ts.map → chunk-5TSCBBPP.ts.map} +0 -0
- /package/dist/chunks/{chunk-5QAE3G3K.ts.map → chunk-67INJPKR.ts.map} +0 -0
- /package/dist/chunks/{chunk-IWZH5KYS.ts.map → chunk-6LD5KX55.ts.map} +0 -0
- /package/dist/chunks/{chunk-AAEEHR7H.ts.map → chunk-6O3EDBRL.ts.map} +0 -0
- /package/dist/chunks/{chunk-S7QS4AWK.ts.map → chunk-AKMV47YC.ts.map} +0 -0
- /package/dist/chunks/{chunk-GNH73BJ5.ts.map → chunk-BEST45H2.ts.map} +0 -0
- /package/dist/chunks/{chunk-GP5DU62N.ts.map → chunk-CPT2BN6N.ts.map} +0 -0
- /package/dist/chunks/{chunk-UPNVIUBN.ts.map → chunk-DN4IA7MR.ts.map} +0 -0
- /package/dist/chunks/{chunk-PG7NMFP2.ts.map → chunk-DRTC4PKM.ts.map} +0 -0
- /package/dist/chunks/{chunk-MKKF4IMY.ts.map → chunk-F7E3VFXU.ts.map} +0 -0
- /package/dist/chunks/{chunk-UBV24CG4.ts.map → chunk-FLHCOJCD.ts.map} +0 -0
- /package/dist/chunks/{chunk-ORGBI36T.ts.map → chunk-OJARL2TG.ts.map} +0 -0
- /package/dist/chunks/{chunk-GSNPASKB.ts.map → chunk-Q23JJW7E.ts.map} +0 -0
- /package/dist/chunks/{chunk-76NB4R7U.ts.map → chunk-XJHQPB3E.ts.map} +0 -0
- /package/dist/chunks/{chunk-P7DD5PWZ.ts.map → chunk-ZDDBZH72.ts.map} +0 -0
- /package/dist/chunks/{conflict-artifacts-FXFIIBCB.ts.map → config-HYG7G5EM.ts.map} +0 -0
- /package/dist/chunks/{continuous-record-SQJ47CXN.ts.map → conflict-artifacts-J6WSDCWP.ts.map} +0 -0
- /package/dist/chunks/{local-fields-6DGYOOIK.ts.map → continuous-record-AH7JGYKM.ts.map} +0 -0
- /package/dist/chunks/{manager-result-dispatcher-HOCM2GDA.ts.map → local-fields-JEKAPZKD.ts.map} +0 -0
- /package/dist/chunks/{merge-baseline-store-RFCAH7KL.ts.map → manager-result-dispatcher-6W52NM7F.ts.map} +0 -0
- /package/dist/chunks/{remote-selection-ui-YFPGYGNE.ts.map → merge-baseline-store-65GKUMXI.ts.map} +0 -0
- /package/dist/chunks/{setup-switch-E7PHKI6J.ts.map → remote-selection-ui-TD4C4W3J.ts.map} +0 -0
- /package/dist/chunks/{snapshot-THS5EY2L.ts.map → setup-switch-PIPXYPCW.ts.map} +0 -0
- /package/dist/chunks/{sync-inspection-J25EEKZK.ts.map → snapshot-RGNDYT6A.ts.map} +0 -0
- /package/dist/chunks/{sync-state-CFL4RRRB.ts.map → snapshot-transaction-26BQO36S.ts.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/snapshot/snapshot.ts", "../../src/snapshot/session-paths.ts", "../../src/snapshot/snapshot-paths.ts", "../../src/sync/sync-policy.ts"],
|
|
4
|
-
"sourcesContent": ["import { createHash, randomUUID } from \"node:crypto\";\nimport type { Dirent } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { isDeniedPath, posixJoin, safeJoin, toPosix } from \"../paths.js\";\nimport { agentDir, configuredSessionDir } from \"./session-paths.js\";\nimport { sessionStorageRoot } from \"./snapshot-paths.js\";\n\nexport { isDeniedPath } from \"../paths.js\";\nexport { sessionStorageRoot } from \"./snapshot-paths.js\";\n\nimport {\n canonicalSnapshotPathForConfig,\n customIncludePathsByLower,\n DEFAULT_SYNC_INCLUDE,\n includeFromSelectionConfig,\n isConfiguredSnapshotPath,\n isPreservableUnmanagedSnapshotPath,\n normalizeExtraFiles,\n normalizeSyncFiles,\n type SyncSelectionConfig,\n selectionForSnapshot,\n snapshotSelectionInclude,\n syncIncludeSelection,\n} from \"../sync/sync-policy.js\";\nimport type { Snapshot, SnapshotFile, SnapshotOptions } from \"./snapshot-types.js\";\n\nexport { canonicalSnapshotPathForConfig, isConfiguredSnapshotPath } from \"../sync/sync-policy.js\";\n\nconst VERSION = 1;\nconst TOP_LEVEL_FILES: readonly string[] = DEFAULT_SYNC_INCLUDE.filter((name) => name.includes(\".\"));\nconst TOP_LEVEL_DIRS = new Set<string>(DEFAULT_SYNC_INCLUDE.filter((name) => !name.includes(\".\")));\nconst SECRET_PATTERNS = [\n /AWS_SECRET_ACCESS_KEY\\s*[=:]\\s*['\"]?[A-Za-z0-9/+]{35,}/i,\n /(ANTHROPIC|OPENAI|GEMINI|GOOGLE|FIRECRAWL|GITHUB|CLOUDFLARE|R2|S3)_[A-Z0-9_]*(KEY|TOKEN|SECRET)\\s*[=:]\\s*['\"]?[^\\s'\"]{12,}/i,\n /sk-ant-[A-Za-z0-9_-]{20,}/,\n /sk-[A-Za-z0-9]{20,}/,\n /gh[pousr]_[A-Za-z0-9_]{20,}/,\n];\n\nfunction selectTopLevelFileEntry(entries: Dirent[], fileName: string) {\n const exact = entries.find((entry) => entry.isFile() && entry.name === fileName);\n if (exact) return exact;\n const lower = fileName.toLowerCase();\n return entries\n .filter((entry) => entry.isFile() && entry.name.toLowerCase() === lower)\n .sort((left, right) => left.name.localeCompare(right.name))[0];\n}\n\nfunction sha256(value: Buffer) {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction isSafeSnapshotPath(relativePath: string) {\n if (relativePath.includes(\"\\\\\")) return false;\n const normalized = toPosix(relativePath);\n return (\n Boolean(normalized) &&\n normalized !== \".\" &&\n normalized !== \"..\" &&\n !normalized.startsWith(\"../\") &&\n !path.posix.isAbsolute(normalized) &&\n path.posix.normalize(normalized) === normalized &&\n !isDeniedPath(normalized)\n );\n}\n\nfunction snapshotsMatch(left: Snapshot, right: Snapshot) {\n const leftHashes = new Map(left.files.map((file) => [file.path, file.sha256]));\n const rightHashes = new Map(right.files.map((file) => [file.path, file.sha256]));\n return (\n left.syncSessions === right.syncSessions &&\n sameOptionalInclude(snapshotSelectionInclude(left), snapshotSelectionInclude(right)) &&\n leftHashes.size === rightHashes.size &&\n [...leftHashes].every(([filePath, hash]) => rightHashes.get(filePath) === hash)\n );\n}\n\nfunction snapshotId() {\n return `${new Date().toISOString().replace(/[:.]/g, \"-\")}-${randomUUID().slice(0, 8)}`;\n}\n\nexport function regenerateSnapshotIdentity(snapshot: Snapshot): Snapshot {\n return {\n ...snapshot,\n id: snapshotId(),\n createdAt: new Date().toISOString(),\n machine: os.hostname(),\n };\n}\n\nexport async function createSnapshot(profile: string, options: SnapshotOptions = {}): Promise<Snapshot> {\n options.signal?.throwIfAborted();\n const include = effectiveInclude(options);\n const syncSessions = include.includes(\"sessions\");\n const sessionDir = options.sessionDir ?? (await configuredSessionDir());\n options.signal?.throwIfAborted();\n const files = await collectFiles(agentDir(), { include, sessionDir, signal: options.signal });\n options.signal?.throwIfAborted();\n return {\n version: VERSION,\n id: snapshotId(),\n createdAt: new Date().toISOString(),\n machine: os.hostname(),\n profile,\n syncSessions,\n selection: selectionForSnapshot(include),\n files,\n };\n}\n\nfunction effectiveInclude(options: SnapshotOptions) {\n if (options.include) return options.include;\n return [\n ...normalizeSyncFiles(options.syncFiles),\n ...normalizeExtraFiles(options.extraFiles),\n ...(options.syncSessions ? [\"sessions\"] : []),\n ];\n}\n\nexport async function collectFiles(root: string, options: SnapshotOptions = {}): Promise<SnapshotFile[]> {\n const signal = options.signal;\n signal?.throwIfAborted();\n const results: SnapshotFile[] = [];\n const entries = await fs.readdir(root, { withFileTypes: true });\n signal?.throwIfAborted();\n const selection = syncIncludeSelection(effectiveInclude(options));\n const selectedFiles = new Set<string>(selection.builtIns);\n for (const entry of entries) {\n if (entry.isDirectory() && TOP_LEVEL_DIRS.has(entry.name) && selectedFiles.has(entry.name)) {\n await collectDirectory(results, root, entry.name, { signal });\n }\n }\n for (const fileName of TOP_LEVEL_FILES) {\n if (!selectedFiles.has(fileName)) continue;\n const entry = selectTopLevelFileEntry(entries, fileName);\n if (entry) await addFile(results, root, entry.name, fileName, signal);\n }\n for (const relativePath of selection.custom) {\n await collectIncludedPath(results, root, relativePath, signal);\n }\n if (selection.sessions) {\n try {\n await collectDirectory(results, sessionStorageRoot(root, options.sessionDir), \"\", {\n sessionsOnly: true,\n virtualPrefix: \"sessions\",\n signal,\n });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n }\n signal?.throwIfAborted();\n return results.sort((left, right) => left.path.localeCompare(right.path));\n}\n\nasync function collectIncludedPath(results: SnapshotFile[], root: string, relativePath: string, signal?: AbortSignal) {\n signal?.throwIfAborted();\n const absolutePath = safeJoin(root, relativePath);\n try {\n const stat = await fs.lstat(absolutePath);\n signal?.throwIfAborted();\n if (stat.isFile()) await addFile(results, root, relativePath, relativePath, signal);\n else if (stat.isDirectory()) await collectDirectory(results, root, relativePath, { signal });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n if (!relativePath.includes(\"/\")) {\n const entries = await fs.readdir(root, { withFileTypes: true });\n signal?.throwIfAborted();\n const entry = selectTopLevelFileEntry(entries, relativePath);\n if (entry) await addFile(results, root, entry.name, relativePath, signal);\n }\n }\n}\n\nasync function collectDirectory(\n results: SnapshotFile[],\n root: string,\n relativeDirectory: string,\n options: { sessionsOnly?: boolean; virtualPrefix?: string; signal?: AbortSignal } = {},\n) {\n options.signal?.throwIfAborted();\n const absoluteDirectory = path.join(root, relativeDirectory);\n for (const entry of await fs.readdir(absoluteDirectory, { withFileTypes: true })) {\n options.signal?.throwIfAborted();\n const relativePath = relativeDirectory ? posixJoin(relativeDirectory, entry.name) : entry.name;\n const snapshotPath = options.virtualPrefix ? posixJoin(options.virtualPrefix, relativePath) : relativePath;\n if (isDeniedPath(snapshotPath)) continue;\n if (entry.isDirectory()) {\n await collectDirectory(results, root, relativePath, options);\n } else if (entry.isFile() && (!options.sessionsOnly || isSessionFilePath(snapshotPath))) {\n await addFile(results, root, relativePath, snapshotPath, options.signal);\n }\n }\n}\n\nasync function addFile(\n results: SnapshotFile[],\n root: string,\n relativePath: string,\n snapshotPath = relativePath,\n signal?: AbortSignal,\n) {\n signal?.throwIfAborted();\n if (!isSafeSnapshotPath(snapshotPath)) return;\n const absolutePath = safeJoin(root, relativePath);\n const content = await fs.readFile(absolutePath, { signal });\n signal?.throwIfAborted();\n results.push({\n path: snapshotPath,\n contentBase64: content.toString(\"base64\"),\n sha256: sha256(content),\n });\n}\n\nexport function isSessionPath(relativePath: string) {\n return toPosix(relativePath).startsWith(\"sessions/\");\n}\n\nexport function isSessionFilePath(relativePath: string) {\n const normalized = toPosix(relativePath);\n return isSessionPath(normalized) && normalized.endsWith(\".jsonl\");\n}\n\nexport function sessionSnapshotPathFromAbsolute(sessionFile: string, configuredSessionDir?: string) {\n const relativePath = toPosix(path.relative(sessionStorageRoot(agentDir(), configuredSessionDir), sessionFile));\n if (!relativePath || relativePath.startsWith(\"../\") || path.posix.isAbsolute(relativePath)) {\n return undefined;\n }\n const snapshotPath = posixJoin(\"sessions\", relativePath);\n return isSessionFilePath(snapshotPath) ? snapshotPath : undefined;\n}\n\nexport function snapshotTarget(root: string, relativePath: string, configuredSessionDir?: string) {\n if (isSessionPath(relativePath)) {\n return safeJoin(sessionStorageRoot(root, configuredSessionDir), relativePath.slice(\"sessions/\".length));\n }\n return safeJoin(root, relativePath);\n}\n\nexport function snapshotIncludesSessions(snapshot: Snapshot) {\n return (\n snapshot.syncSessions === true ||\n snapshotSelectionInclude(snapshot)?.includes(\"sessions\") === true ||\n snapshot.files.some((file) => isSessionPath(file.path))\n );\n}\n\nexport function filterSnapshotForConfigPolicy(\n snapshot: Snapshot,\n config: SyncSelectionConfig,\n options: { regenerateId?: boolean } = {},\n) {\n const include = includeFromSelectionConfig(config);\n const includePaths = customIncludePathsByLower(include);\n const filtered = {\n ...snapshot,\n syncSessions: include.includes(\"sessions\") ? snapshot.syncSessions : false,\n selection: selectionForSnapshot(include),\n files: canonicalizeSnapshotFilesForConfig(snapshot.files, config, includePaths),\n };\n if (!options.regenerateId || snapshotsMatch(snapshot, filtered)) return filtered;\n return {\n ...filtered,\n id: snapshotId(),\n createdAt: new Date().toISOString(),\n machine: os.hostname(),\n };\n}\n\nfunction canonicalizeSnapshotFilesForConfig(\n files: SnapshotFile[],\n config: SyncSelectionConfig,\n includePaths: Map<string, string>,\n) {\n const configuredFiles: SnapshotFile[] = [];\n const extraCandidates = new Map<string, { exact: boolean; file: SnapshotFile; originalPath: string }>();\n for (const file of files) {\n const normalized = toPosix(file.path);\n if (!isSafeSnapshotPath(file.path) || !isConfiguredSnapshotPath(normalized, config)) {\n continue;\n }\n if (normalized.includes(\"/\")) {\n configuredFiles.push(normalized === file.path ? file : { ...file, path: normalized });\n continue;\n }\n const topLevelPath = canonicalSnapshotPathForConfig(normalized, includePaths);\n const candidate = {\n exact: normalized === topLevelPath,\n file: { ...file, path: topLevelPath },\n originalPath: normalized,\n };\n const current = extraCandidates.get(topLevelPath.toLowerCase());\n if (!current || isPreferredExtraCandidate(candidate, current)) {\n extraCandidates.set(topLevelPath.toLowerCase(), candidate);\n }\n }\n return [...configuredFiles, ...[...extraCandidates.values()].map((candidate) => candidate.file)].sort((left, right) =>\n left.path.localeCompare(right.path),\n );\n}\n\nfunction isPreferredExtraCandidate(\n left: { exact: boolean; originalPath: string },\n right: { exact: boolean; originalPath: string },\n) {\n if (left.exact !== right.exact) return left.exact;\n return left.originalPath.localeCompare(right.originalPath) < 0;\n}\n\nexport function snapshotWithoutSessions(snapshot: Snapshot) {\n const files = snapshot.files.filter((file) => !isSessionPath(file.path));\n const include = snapshotSelectionInclude(snapshot)?.filter((item) => item !== \"sessions\");\n if (\n files.length === snapshot.files.length &&\n snapshot.syncSessions !== true &&\n include?.length === snapshot.selection?.include.length\n ) {\n return snapshot;\n }\n return {\n ...snapshot,\n id: snapshotId(),\n createdAt: new Date().toISOString(),\n machine: os.hostname(),\n syncSessions: false,\n ...(include ? { selection: selectionForSnapshot(include) } : {}),\n files,\n };\n}\n\nexport function scanSnapshot(snapshot: Snapshot) {\n const findings: string[] = [];\n for (const file of snapshot.files) {\n const content = Buffer.from(file.contentBase64, \"base64\");\n if (content.includes(0)) continue;\n const text = content.toString(\"utf8\");\n for (const pattern of SECRET_PATTERNS) {\n if (pattern.test(text)) {\n findings.push(file.path);\n break;\n }\n }\n }\n return findings;\n}\n\nexport function mergeRemotePreservedFiles(local: Snapshot, remote: Snapshot, config: SyncSelectionConfig) {\n const localPathNames = new Set(local.files.map((file) => file.path.toLowerCase()));\n const preservedPathNames = new Set<string>();\n const preserved = remote.files.filter((file) => {\n const normalized = toPosix(file.path);\n const lower = normalized.toLowerCase();\n if (\n localPathNames.has(lower) ||\n preservedPathNames.has(lower) ||\n !isSafeSnapshotPath(file.path) ||\n isConfiguredSnapshotPath(normalized, config) ||\n !isPreservableUnmanagedSnapshotPath(normalized)\n ) {\n return false;\n }\n preservedPathNames.add(lower);\n return true;\n });\n if (preserved.length === 0) return local;\n return {\n ...local,\n id: snapshotId(),\n createdAt: new Date().toISOString(),\n machine: os.hostname(),\n syncSessions: snapshotIncludesSessions(local) || snapshotIncludesSessions(remote),\n files: [...local.files, ...preserved].sort((left, right) => left.path.localeCompare(right.path)),\n };\n}\n\nexport function mergeRemoteSessionFiles(local: Snapshot, remote: Snapshot) {\n const remoteSessions = remote.files.filter((file) => {\n const normalized = toPosix(file.path);\n return isSessionFilePath(normalized) && isSafeSnapshotPath(file.path);\n });\n if (remoteSessions.length === 0 && !snapshotIncludesSessions(remote)) return local;\n const localInclude = snapshotSelectionInclude(local);\n return {\n ...local,\n id: snapshotId(),\n createdAt: new Date().toISOString(),\n machine: os.hostname(),\n syncSessions: true,\n ...(localInclude\n ? {\n selection: selectionForSnapshot(\n localInclude.includes(\"sessions\") ? localInclude : [...localInclude, \"sessions\"],\n ),\n }\n : {}),\n files: [...local.files.filter((file) => !isSessionPath(file.path)), ...remoteSessions].sort((left, right) =>\n left.path.localeCompare(right.path),\n ),\n };\n}\n\nfunction sameOptionalInclude(left: string[] | undefined, right: string[] | undefined) {\n if (!left || !right) return left === right;\n return left.length === right.length && left.every((item, index) => item === right[index]);\n}\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport { type ExtensionCommandContext, type ExtensionContext, getAgentDir } from \"@earendil-works/pi-coding-agent\";\nimport type { AnySyncConfig } from \"../settings/settings-types.js\";\nimport { readJsonIfExists } from \"../state/json-file.js\";\nimport { sessionStorageRoot } from \"./snapshot-paths.js\";\nimport type { Snapshot, SnapshotOptions } from \"./snapshot-types.js\";\n\nexport function sessionDirFromContext(ctx: ExtensionCommandContext | ExtensionContext) {\n const manager = ctx.sessionManager as typeof ctx.sessionManager & {\n usesDefaultSessionDir?: () => boolean;\n };\n const usesDefaultSessionDir = manager.usesDefaultSessionDir;\n if (typeof usesDefaultSessionDir === \"function\" && usesDefaultSessionDir.call(manager)) {\n return undefined;\n }\n const getSessionDir = manager.getSessionDir;\n return typeof getSessionDir === \"function\" ? (getSessionDir.call(manager) as string | undefined) : undefined;\n}\n\nexport async function configuredSessionDir() {\n const settings = await readJsonIfExists<{ sessionDir?: string }>(path.join(agentDir(), \"settings.json\"));\n return settings?.sessionDir ? expandSessionDir(settings.sessionDir) : undefined;\n}\n\nexport async function effectiveSessionRoot(ctx: ExtensionCommandContext | ExtensionContext) {\n return path.resolve(sessionStorageRoot(agentDir(), sessionDirFromContext(ctx) ?? (await configuredSessionDir())));\n}\n\nexport async function sessionDirForApply(ctx: ExtensionCommandContext | ExtensionContext, snapshot: Snapshot) {\n const contextSessionDir = sessionDirFromContext(ctx);\n const localSessionDir = await configuredSessionDir();\n if (contextSessionDir && path.resolve(contextSessionDir) !== path.resolve(localSessionDir ?? \"\")) {\n return contextSessionDir;\n }\n return sessionDirFromSnapshot(snapshot) ?? contextSessionDir;\n}\n\n/** Hash-only merge plans cannot describe installation into a different session root. */\nexport function requireStableMergeSessionRoot(before: Snapshot, after: Snapshot) {\n const root = agentDir();\n if (\n path.resolve(sessionStorageRoot(root, sessionDirFromSnapshot(before))) !==\n path.resolve(sessionStorageRoot(root, sessionDirFromSnapshot(after)))\n ) {\n throw new Error(\n \"Merged transfer changes the session root; no local apply or baseline acceptance is allowed. Review /sync diff and choose an explicit push or pull direction.\",\n );\n }\n}\n\nfunction sessionDirFromSnapshot(snapshot: Snapshot) {\n const settingsFile = snapshot.files.find((file) => file.path === \"settings.json\");\n if (!settingsFile) return undefined;\n let settings: unknown;\n try {\n settings = JSON.parse(\n new TextDecoder(\"utf-8\", { fatal: true }).decode(\n decodeBase64Strict(settingsFile.contentBase64, settingsFile.path),\n ),\n );\n } catch {\n // JSON parser errors can quote private settings values; never surface their payload.\n throw new Error(\"Merged settings cannot be parsed; review a directional recovery.\");\n }\n if (!settings || typeof settings !== \"object\" || Array.isArray(settings))\n throw new Error(\"Merged settings must be a JSON object; review a directional recovery.\");\n const sessionDir = (settings as { sessionDir?: unknown }).sessionDir;\n if (sessionDir !== undefined && typeof sessionDir !== \"string\")\n throw new Error(\"Merged sessionDir must be a string; review a directional recovery.\");\n return sessionDir ? expandSessionDir(sessionDir) : undefined;\n}\n\nfunction decodeBase64Strict(value: string, filePath: string) {\n if (!/^[A-Za-z0-9+/]*={0,2}$/.test(value) || value.length % 4 !== 0) {\n throw new Error(`Invalid base64 content in snapshot file: ${filePath}`);\n }\n return Buffer.from(value, \"base64\");\n}\n\nexport function agentDir() {\n return getAgentDir();\n}\n\nexport function expandSessionDir(value: string) {\n return value === \"~\" || value.startsWith(\"~/\") ? path.join(os.homedir(), value.slice(2)) : value;\n}\n\nexport function snapshotOptionsForContext(\n ctx: ExtensionCommandContext | ExtensionContext,\n config: AnySyncConfig,\n): SnapshotOptions {\n return {\n include: config.include,\n sessionDir: sessionDirFromContext(ctx),\n };\n}\n", "import path from \"node:path\";\n\nfunction expandHome(value: string) {\n if (value === \"~\") return process.env.HOME ?? value;\n if (value.startsWith(\"~/\")) return path.join(process.env.HOME ?? \"~\", value.slice(2));\n return value;\n}\n\nexport function sessionStorageRoot(root: string, configuredSessionDir?: string) {\n return configuredSessionDir ? path.resolve(expandHome(configuredSessionDir)) : path.resolve(root, \"sessions\");\n}\n", "import path from \"node:path\";\nimport { isDeniedPath, toPosix } from \"../paths.js\";\nimport type { Snapshot, SnapshotSelection } from \"../snapshot/snapshot-types.js\";\n\nexport const BUILT_IN_SYNC_ROOTS = [\n \"settings.json\",\n \"keybindings.json\",\n \"models.json\",\n \"AGENTS.md\",\n \"APPEND_SYSTEM.md\",\n \"skills\",\n \"prompts\",\n \"themes\",\n \"extensions\",\n] as const;\n\nexport const DEFAULT_SYNC_INCLUDE = [...BUILT_IN_SYNC_ROOTS] as const;\nexport type BuiltInSyncFile = (typeof BUILT_IN_SYNC_ROOTS)[number];\nconst SNAPSHOT_SELECTION_VERSION = 1;\nconst MAX_SYNC_INCLUDE_ITEMS = 1_024;\nconst MAX_SYNC_INCLUDE_PATH_BYTES = 4_096;\nconst MAX_SYNC_INCLUDE_TOTAL_BYTES = 256 * 1_024;\n\ninterface IncludePathNode {\n selected?: string;\n children: Map<string, IncludePathNode>;\n}\n\nconst BUILT_IN_BY_LOWER = new Map<string, BuiltInSyncFile>(\n BUILT_IN_SYNC_ROOTS.map((fileName) => [fileName.toLowerCase(), fileName]),\n);\nconst TOP_LEVEL_FILE_PATHS = new Map<string, string>(\n BUILT_IN_SYNC_ROOTS.filter((fileName) => fileName.includes(\".\")).map((fileName) => [\n fileName.toLowerCase(),\n fileName,\n ]),\n);\nconst TOP_LEVEL_DIRS = new Set<string>(BUILT_IN_SYNC_ROOTS.filter((fileName) => !fileName.includes(\".\")));\nconst RESERVED_TOP_LEVEL_NAMES = new Set<string>([...BUILT_IN_BY_LOWER.keys(), \"sessions\"]);\n\nexport function normalizeSyncInclude(value: unknown): string[] {\n if (!Array.isArray(value)) {\n throw new Error(\"Invalid pi-sync settings: sync.include must be an array.\");\n }\n if (value.length > MAX_SYNC_INCLUDE_ITEMS) {\n throw new Error(`Invalid pi-sync settings: sync.include has too many items; limit: ${MAX_SYNC_INCLUDE_ITEMS}.`);\n }\n const result: string[] = [];\n const seen = new Set<string>();\n const pathRoot: IncludePathNode = { children: new Map() };\n let totalBytes = 0;\n for (const item of value) {\n if (typeof item !== \"string\") {\n throw new Error(\"Invalid pi-sync settings: sync.include items must be strings.\");\n }\n const itemBytes = Buffer.byteLength(item, \"utf8\");\n if (itemBytes > MAX_SYNC_INCLUDE_PATH_BYTES) {\n throw new Error(\n `Invalid pi-sync settings: sync.include item is too long; limit: ${MAX_SYNC_INCLUDE_PATH_BYTES} bytes.`,\n );\n }\n totalBytes += itemBytes;\n if (totalBytes > MAX_SYNC_INCLUDE_TOTAL_BYTES) {\n throw new Error(\n `Invalid pi-sync settings: sync.include is too large; limit: ${MAX_SYNC_INCLUDE_TOTAL_BYTES} bytes.`,\n );\n }\n const trimmed = item.trim();\n const builtIn = BUILT_IN_BY_LOWER.get(trimmed.toLowerCase());\n const normalized = builtIn ?? (trimmed.toLowerCase() === \"sessions\" ? \"sessions\" : trimmed);\n if (!builtIn && normalized !== \"sessions\") validateAgentRelativeInclude(normalized);\n const identity = normalized.toLowerCase();\n if (seen.has(identity)) {\n throw new Error(`Invalid pi-sync settings: duplicate sync.include item: ${item}`);\n }\n addIncludePath(pathRoot, identity, item);\n seen.add(identity);\n result.push(normalized);\n }\n return result;\n}\n\nfunction addIncludePath(root: IncludePathNode, identity: string, source: string) {\n let node = root;\n for (const segment of identity.split(\"/\")) {\n if (node.selected !== undefined) throwOverlappingInclude(source);\n let child = node.children.get(segment);\n if (!child) {\n child = { children: new Map() };\n node.children.set(segment, child);\n }\n node = child;\n }\n if (node.children.size > 0) throwOverlappingInclude(source);\n node.selected = identity;\n}\n\nfunction throwOverlappingInclude(item: string): never {\n throw new Error(`Invalid pi-sync settings: overlapping sync.include items are ambiguous: ${item}`);\n}\n\nfunction validateAgentRelativeInclude(value: string) {\n const normalized = toPosix(value);\n const topLevel = normalized.split(\"/\")[0]?.toLowerCase();\n if (\n !normalized ||\n normalized === \".\" ||\n normalized === \"..\" ||\n normalized.startsWith(\"../\") ||\n path.posix.isAbsolute(normalized) ||\n normalized.includes(\"\\\\\") ||\n path.posix.normalize(normalized) !== normalized ||\n // biome-ignore lint/suspicious/noControlCharactersInRegex: Include paths cannot contain controls.\n /[\\u0000-\\u001f\\u007f-\\u009f]/u.test(normalized)\n ) {\n throw new Error(`Invalid pi-sync settings: sync.include item must be a safe agent-relative path: ${value}`);\n }\n if (isDeniedPath(normalized)) {\n throw new Error(`Invalid pi-sync settings: ${value} cannot be synced.`);\n }\n if (topLevel && RESERVED_TOP_LEVEL_NAMES.has(topLevel)) {\n throw new Error(\n `Invalid pi-sync settings: use the canonical ${topLevel} root instead of a nested sync.include path.`,\n );\n }\n}\n\nexport function portableSnapshotSelection(value: unknown): SnapshotSelection {\n const selection = value as Partial<SnapshotSelection> | null;\n if (\n !selection ||\n typeof selection !== \"object\" ||\n Array.isArray(selection) ||\n selection.version !== SNAPSHOT_SELECTION_VERSION ||\n !Object.hasOwn(selection, \"include\") ||\n Object.keys(selection).some((key) => key !== \"version\" && key !== \"include\")\n ) {\n throw new Error(\"Invalid snapshot selection policy.\");\n }\n return {\n version: SNAPSHOT_SELECTION_VERSION,\n include: normalizeSyncInclude(selection.include),\n };\n}\n\nexport function snapshotSelectionInclude(snapshot: Pick<Snapshot, \"selection\">) {\n return snapshot.selection === undefined ? undefined : portableSnapshotSelection(snapshot.selection).include;\n}\n\nexport function selectionForSnapshot(include: unknown): SnapshotSelection {\n return { version: SNAPSHOT_SELECTION_VERSION, include: normalizeSyncInclude(include) };\n}\n\nexport function sameSyncInclude(left: unknown, right: unknown) {\n const normalizedLeft = normalizeSyncInclude(left);\n const normalizedRight = normalizeSyncInclude(right);\n return (\n normalizedLeft.length === normalizedRight.length &&\n normalizedLeft.every((item, index) => item === normalizedRight[index])\n );\n}\n\nexport function compareSyncInclude(local: unknown, remote: unknown) {\n const localInclude = normalizeSyncInclude(local);\n const remoteInclude = normalizeSyncInclude(remote);\n const localSet = new Set(localInclude);\n const remoteSet = new Set(remoteInclude);\n return {\n same: sameSyncInclude(localInclude, remoteInclude),\n remoteOnly: remoteInclude.filter((item) => !localSet.has(item)),\n localOnly: localInclude.filter((item) => !remoteSet.has(item)),\n };\n}\n\nexport type RemoteSelectionState =\n | { kind: \"legacy\"; discovered: string[] }\n | { kind: \"same\"; include: string[] }\n | {\n kind: \"different\";\n include: string[];\n remoteOnly: string[];\n localOnly: string[];\n };\n\nexport function inspectRemoteSelection(\n localInclude: unknown,\n snapshot: Pick<Snapshot, \"selection\" | \"files\">,\n): RemoteSelectionState {\n const remoteInclude = snapshotSelectionInclude(snapshot);\n if (!remoteInclude) {\n return { kind: \"legacy\", discovered: discoverLegacySnapshotInclude(snapshot) };\n }\n const comparison = compareSyncInclude(localInclude, remoteInclude);\n return comparison.same\n ? { kind: \"same\", include: remoteInclude }\n : { kind: \"different\", include: remoteInclude, ...comparison };\n}\n\nexport interface RemoteSelectionDecision {\n setupName: string;\n configIdentity: string;\n localInclude: readonly string[];\n remoteInclude: readonly string[];\n}\n\nexport class RemoteSelectionMismatchError extends Error {\n readonly decision: RemoteSelectionDecision;\n readonly setupName: string;\n readonly localInclude: string[];\n readonly remoteInclude: string[];\n\n constructor(\n setupName: string,\n localInclude: unknown,\n remoteInclude: unknown,\n configIdentity = JSON.stringify([setupName, normalizeSyncInclude(localInclude)]),\n ) {\n const local = normalizeSyncInclude(localInclude);\n const remote = normalizeSyncInclude(remoteInclude);\n super(formatRemoteSelectionMismatch(setupName, local, remote));\n this.name = \"RemoteSelectionMismatchError\";\n this.setupName = setupName;\n this.localInclude = local;\n this.remoteInclude = remote;\n this.decision = {\n setupName,\n configIdentity,\n localInclude: [...local],\n remoteInclude: [...remote],\n };\n }\n}\n\nexport function remoteSelectionMismatch(\n config: { setupName: string; include: unknown },\n remoteInclude: unknown,\n configIdentity?: string,\n) {\n return new RemoteSelectionMismatchError(config.setupName, config.include, remoteInclude, configIdentity);\n}\n\nexport function formatRemoteSelectionMismatch(\n setupName: string,\n localInclude: readonly string[],\n remoteInclude: readonly string[],\n) {\n const comparison = compareSyncInclude(localInclude, remoteInclude);\n const lines = [\n `Synced content differs for sync setup \u201C${stripTerminalControls(setupName)}\u201D.`,\n `Remote-only: ${comparison.remoteOnly.join(\", \") || \"none\"}`,\n `This-device-only: ${comparison.localOnly.join(\", \") || \"none\"}`,\n ];\n if (comparison.remoteOnly.length === 0 && comparison.localOnly.length === 0) {\n lines.push(\n \"Only ordering differs.\",\n `Remote order: ${remoteInclude.join(\", \") || \"none\"}`,\n `This device order: ${localInclude.join(\", \") || \"none\"}`,\n );\n }\n lines.push(\"Run /sync in TUI to review both content lists and choose what happens next.\");\n return lines.join(\"\\n\");\n}\n\nfunction stripTerminalControls(value: string) {\n // biome-ignore lint/suspicious/noControlCharactersInRegex: Escape untrusted terminal controls.\n return value.replace(/[\\u0000-\\u001f\\u007f-\\u009f]/gu, \"?\");\n}\n\nexport function discoverLegacySnapshotInclude(snapshot: Pick<Snapshot, \"files\">) {\n const builtIns = new Set<BuiltInSyncFile>();\n const custom = new Set<string>();\n let sessions = false;\n for (const file of snapshot.files) {\n const normalized = toPosix(file.path);\n if (\n !normalized ||\n file.path.includes(\"\\\\\") ||\n normalized.length > 4096 ||\n normalized.startsWith(\"../\") ||\n path.posix.isAbsolute(normalized) ||\n path.posix.normalize(normalized) !== normalized ||\n // biome-ignore lint/suspicious/noControlCharactersInRegex: Ignore unsafe legacy paths.\n /[\\u0000-\\u001f\\u007f-\\u009f]/u.test(normalized) ||\n isDeniedPath(normalized)\n ) {\n continue;\n }\n const [topLevel, ...rest] = normalized.split(\"/\");\n if (!topLevel) continue;\n if (topLevel === \"sessions\" && rest.length > 0) {\n sessions = true;\n continue;\n }\n const builtIn = BUILT_IN_BY_LOWER.get(topLevel.toLowerCase());\n if (\n builtIn &&\n ((TOP_LEVEL_DIRS.has(builtIn) && rest.length > 0) || (!TOP_LEVEL_DIRS.has(builtIn) && rest.length === 0))\n ) {\n builtIns.add(builtIn);\n continue;\n }\n if (isSafeCustomIncludePath(topLevel)) custom.add(topLevel);\n }\n return [\n ...BUILT_IN_SYNC_ROOTS.filter((item) => builtIns.has(item)),\n ...[...custom].sort((left, right) => left.localeCompare(right)),\n ...(sessions ? [\"sessions\"] : []),\n ];\n}\n\nexport function syncIncludeSelection(value: unknown) {\n const include = normalizeSyncInclude(value);\n const builtIns = include.filter((item): item is BuiltInSyncFile => BUILT_IN_BY_LOWER.has(item.toLowerCase()));\n const custom = include.filter((item) => item !== \"sessions\" && !BUILT_IN_BY_LOWER.has(item.toLowerCase()));\n return { include, builtIns, custom, sessions: include.includes(\"sessions\") };\n}\n\nexport function customIncludePathsByLower(value: unknown) {\n return new Map(syncIncludeSelection(value).custom.map((relativePath) => [relativePath.toLowerCase(), relativePath]));\n}\n\nexport interface SyncSelectionConfig {\n include?: unknown;\n syncFiles?: unknown;\n syncSessions?: boolean;\n extraFiles?: unknown;\n}\n\nexport function includeFromSelectionConfig(config: SyncSelectionConfig) {\n if (config.include !== undefined) return normalizeSyncInclude(config.include);\n return [\n ...normalizeSyncFiles(config.syncFiles),\n ...normalizeExtraFiles(config.extraFiles),\n ...(config.syncSessions ? [\"sessions\"] : []),\n ];\n}\n\nexport function isConfiguredSnapshotPath(\n relativePath: string,\n config: SyncSelectionConfig,\n _legacyExtraFiles?: Set<string>,\n) {\n const normalized = toPosix(relativePath);\n const selection = syncIncludeSelection(includeFromSelectionConfig(config));\n if (normalized.startsWith(\"sessions/\")) return selection.sessions;\n const lower = normalized.toLowerCase();\n if (!normalized.includes(\"/\")) {\n const builtIn = BUILT_IN_BY_LOWER.get(lower);\n if (builtIn) return selection.builtIns.includes(builtIn) && !TOP_LEVEL_DIRS.has(builtIn);\n }\n const topLevel = normalized.slice(0, normalized.indexOf(\"/\"));\n if (selection.builtIns.includes(topLevel as BuiltInSyncFile) && TOP_LEVEL_DIRS.has(topLevel)) {\n return true;\n }\n return selection.custom.some((candidate) => {\n const candidateLower = candidate.toLowerCase();\n return lower === candidateLower || lower.startsWith(`${candidateLower}/`);\n });\n}\n\nexport function canonicalSnapshotPathForConfig(relativePath: string, includePaths: Map<string, string>) {\n const normalized = toPosix(relativePath);\n const lower = normalized.toLowerCase();\n return TOP_LEVEL_FILE_PATHS.get(lower) ?? includePaths.get(lower) ?? normalized;\n}\n\nexport function isPreservableUnmanagedSnapshotPath(relativePath: string) {\n const normalized = toPosix(relativePath);\n if (!normalized || isDeniedPath(normalized)) return false;\n if (normalized.startsWith(\"sessions/\")) return normalized.endsWith(\".jsonl\");\n if (!normalized.includes(\"/\")) {\n const lower = normalized.toLowerCase();\n return TOP_LEVEL_FILE_PATHS.has(lower) || !RESERVED_TOP_LEVEL_NAMES.has(lower);\n }\n return true;\n}\n\nexport function isSafeCustomIncludePath(relativePath: string) {\n try {\n validateAgentRelativeInclude(relativePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function isBuiltInTopLevelFile(fileName: string) {\n return TOP_LEVEL_FILE_PATHS.has(path.posix.basename(fileName).toLowerCase());\n}\n\n/** Compatibility projection for backend-neutral output while callers move to sync.include. */\nexport function normalizeSyncFiles(value: unknown): BuiltInSyncFile[] {\n if (value === undefined) return [...DEFAULT_SYNC_INCLUDE];\n if (Array.isArray(value)) {\n return normalizeSyncInclude(value).filter((item): item is BuiltInSyncFile =>\n BUILT_IN_BY_LOWER.has(item.toLowerCase()),\n );\n }\n throw new Error(\"Invalid pi-sync settings: expected an include array.\");\n}\n\n/** Compatibility projection for old rendering helpers; v3 persistence never writes this split field. */\nexport function normalizeExtraFiles(value: unknown) {\n if (!Array.isArray(value)) return [];\n return value.filter((item): item is string => typeof item === \"string\" && isSafeCustomIncludePath(item));\n}\n\nexport const extraFilePathsByLower = customIncludePathsByLower;\nexport const isSafeExtraFileName = isSafeCustomIncludePath;\nexport const selectedSyncFileSet = (value: unknown) => new Set(normalizeSyncFiles(value));\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["os", "path", "path", "configuredSessionDir", "path", "path", "path", "TOP_LEVEL_DIRS", "path", "os", "configuredSessionDir"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/sync/sync-local.ts"],
|
|
4
|
-
"sourcesContent": ["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { ExtensionCommandContext, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { agentDir, sessionDirFromContext } from \"../snapshot/session-paths.js\";\nimport { createSnapshot, sessionSnapshotPathFromAbsolute } from \"../snapshot/snapshot.js\";\nimport { encodeSnapshot } from \"../snapshot/snapshot-codec.js\";\nimport type { SnapshotOptions } from \"../snapshot/snapshot-types.js\";\nimport { syncDirectory } from \"../state/json-file.js\";\nimport { stateDir } from \"../state/state-directory.js\";\nimport { throwIfAborted } from \"./signals.js\";\n\nexport function protectedSessionPaths(\n ctx: ExtensionCommandContext | ExtensionContext,\n sessionRoot = sessionDirFromContext(ctx),\n) {\n const getSessionFile = ctx.sessionManager.getSessionFile;\n if (typeof getSessionFile !== \"function\") return new Set<string>();\n const sessionFile = getSessionFile.call(ctx.sessionManager) as string | undefined;\n const snapshotPath = sessionFile ? sessionSnapshotPathFromAbsolute(sessionFile, sessionRoot) : undefined;\n return snapshotPath ? new Set([snapshotPath]) : new Set<string>();\n}\n\nexport function captureMutationOwner(ctx: ExtensionContext | ExtensionCommandContext, signal?: AbortSignal) {\n const manager = ctx.sessionManager;\n const file = manager.getSessionFile?.();\n const id = manager.getSessionId?.();\n const cwd = manager.getCwd?.();\n const root = agentDir();\n return () => {\n throwIfAborted(signal);\n if (\n ctx.sessionManager !== manager ||\n manager.getSessionFile?.() !== file ||\n manager.getSessionId?.() !== id ||\n manager.getCwd?.() !== cwd ||\n agentDir() !== root\n )\n throw new Error(\"Session changed during file mutation; evidence retained for review.\");\n };\n}\n\nexport async function backupLocal(profile: string, options: SnapshotOptions = {}, signal?: AbortSignal) {\n throwIfAborted(signal);\n const snapshot = await createSnapshot(profile, { ...options, signal });\n throwIfAborted(signal);\n const backupDirectory = path.join(stateDir(), \"backups\");\n await fs.mkdir(backupDirectory, { recursive: true, mode: 0o700 });\n throwIfAborted(signal);\n const backupPath = path.join(backupDirectory, `${snapshot.id}.json.gz`);\n const encoded = await encodeSnapshot(snapshot);\n throwIfAborted(signal);\n const handle = await fs.open(backupPath, \"wx\", 0o600);\n try {\n await handle.writeFile(encoded);\n await handle.sync();\n } finally {\n await handle.close();\n }\n await syncDirectory(backupDirectory);\n return backupPath;\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AAUV,SAAS,sBACd,KACA,cAAc,sBAAsB,GAAG,GACvC;AACA,QAAM,iBAAiB,IAAI,eAAe;AAC1C,MAAI,OAAO,mBAAmB,WAAY,QAAO,oBAAI,IAAY;AACjE,QAAM,cAAc,eAAe,KAAK,IAAI,cAAc;AAC1D,QAAM,eAAe,cAAc,gCAAgC,aAAa,WAAW,IAAI;AAC/F,SAAO,eAAe,oBAAI,IAAI,CAAC,YAAY,CAAC,IAAI,oBAAI,IAAY;AAClE;AAEO,SAAS,qBAAqB,KAAiD,QAAsB;AAC1G,QAAM,UAAU,IAAI;AACpB,QAAM,OAAO,QAAQ,iBAAiB;AACtC,QAAM,KAAK,QAAQ,eAAe;AAClC,QAAM,MAAM,QAAQ,SAAS;AAC7B,QAAM,OAAO,SAAS;AACtB,SAAO,MAAM;AACX,mBAAe,MAAM;AACrB,QACE,IAAI,mBAAmB,WACvB,QAAQ,iBAAiB,MAAM,QAC/B,QAAQ,eAAe,MAAM,MAC7B,QAAQ,SAAS,MAAM,OACvB,SAAS,MAAM;AAEf,YAAM,IAAI,MAAM,qEAAqE;AAAA,EACzF;AACF;AAEA,eAAsB,YAAY,SAAiB,UAA2B,CAAC,GAAG,QAAsB;AACtG,iBAAe,MAAM;AACrB,QAAM,WAAW,MAAM,eAAe,SAAS,EAAE,GAAG,SAAS,OAAO,CAAC;AACrE,iBAAe,MAAM;AACrB,QAAM,kBAAkB,KAAK,KAAK,SAAS,GAAG,SAAS;AACvD,QAAM,GAAG,MAAM,iBAAiB,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAChE,iBAAe,MAAM;AACrB,QAAM,aAAa,KAAK,KAAK,iBAAiB,GAAG,SAAS,EAAE,UAAU;AACtE,QAAM,UAAU,MAAM,eAAe,QAAQ;AAC7C,iBAAe,MAAM;AACrB,QAAM,SAAS,MAAM,GAAG,KAAK,YAAY,MAAM,GAAK;AACpD,MAAI;AACF,UAAM,OAAO,UAAU,OAAO;AAC9B,UAAM,OAAO,KAAK;AAAA,EACpB,UAAE;AACA,UAAM,OAAO,MAAM;AAAA,EACrB;AACA,QAAM,cAAc,eAAe;AACnC,SAAO;AACT;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,24 +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
|
-
dispatchManagerResult
|
|
5
|
-
} from "./chunk-P7DD5PWZ.ts";
|
|
6
|
-
import "./chunk-JCH3VXIO.ts";
|
|
7
|
-
import "./chunk-YK52VDXG.ts";
|
|
8
|
-
import "./chunk-ORGBI36T.ts";
|
|
9
|
-
import "./chunk-B4QZBDBT.ts";
|
|
10
|
-
import "./chunk-K3RIEL6J.ts";
|
|
11
|
-
import "./chunk-AMJRUXFT.ts";
|
|
12
|
-
import "./chunk-7D5SF7P3.ts";
|
|
13
|
-
import "./chunk-QO333NM4.ts";
|
|
14
|
-
import "./chunk-A6HU4ERM.ts";
|
|
15
|
-
import "./chunk-PWMWOJP4.ts";
|
|
16
|
-
import "./chunk-QOFMXPM5.ts";
|
|
17
|
-
import "./chunk-ZW5ZLGBI.ts";
|
|
18
|
-
import "./chunk-2JZFHNLM.ts";
|
|
19
|
-
import "./chunk-T2SJD3N7.ts";
|
|
20
|
-
import "./chunk-HUZ5CR4W.ts";
|
|
21
|
-
export {
|
|
22
|
-
dispatchManagerResult
|
|
23
|
-
};
|
|
24
|
-
//# sourceMappingURL=manager-result-dispatcher-HOCM2GDA.ts.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/ui/manager-ui.ts", "../../src/state/operation-availability.ts", "../../src/ui/manager-attention.ts", "../../src/ui/manager-recovery.ts", "../../src/ui/manager-state.ts", "../../src/ui/sync-setups-ui.ts", "../../src/ui/settings-ui.ts", "../../src/ui/agent-mode-setting.ts", "../../src/ui/settings-frame.ts", "../../src/ui/storage-connections-ui.ts", "../../src/ui/setup/setup-switcher.ts", "../../src/ui/setup/setup-actions.ts"],
|
|
4
|
-
"sourcesContent": ["import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport type { Component } from \"@earendil-works/pi-tui\";\nimport { type ActionMenuItem, defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport { loadConfig, syncCheckConfigFingerprint } from \"../settings/config.js\";\nimport { operationBlocksChanges } from \"../state/operation-availability.js\";\nimport { captureMutationOwner } from \"../sync/sync-local.js\";\nimport { type RunRoute, runCancellableOperation } from \"./cancellable-operation.js\";\nimport {\n attentionMainMenuItems,\n blockedSyncMenuItem,\n type SyncManagerAttentionOptions,\n showManagerAttention,\n} from \"./manager-attention.js\";\nimport { recoverSyncAccess } from \"./manager-recovery.js\";\nimport { dispatchManagerResult } from \"./manager-result-dispatcher.js\";\nimport { backendStorageDescription, describeManagerState } from \"./manager-state.js\";\nimport { showSyncSettings } from \"./settings-ui.js\";\nimport { showSyncSetupManager } from \"./setup/setup-actions.js\";\nimport { showSetupSwitcher } from \"./setup/setup-switcher.js\";\nimport { showStorageConnections } from \"./storage-connections-ui.js\";\nimport { observationMatchesConfig } from \"./sync-attention.js\";\nimport { safeTerminalText } from \"./terminal-text.js\";\n\nexport async function showSyncManager(\n ctx: ExtensionCommandContext,\n runRoute: RunRoute,\n sessionSignal?: AbortSignal,\n options: SyncManagerAttentionOptions = {},\n): Promise<void> {\n if (!ctx.hasUI) {\n await runRoute(\"help\");\n return;\n }\n type Screen = \"main\";\n type Action =\n | \"review-attention\"\n | \"retry-refusal\"\n | \"sync\"\n | \"switch\"\n | \"settings\"\n | \"pull\"\n | \"push\"\n | \"diff\"\n | \"status\"\n | \"setups\"\n | \"connections\"\n | \"history\"\n | \"conflicts\"\n | \"doctor\"\n | \"recover\"\n | \"refresh\"\n | \"help\"\n | \"init\";\n interface State {\n manager: Awaited<ReturnType<typeof describeManagerState>>;\n }\n const menu = defineMenu<State, Screen, Action, ExtensionCommandContext>({\n start: \"main\",\n screens: {\n main: ({ state }) => {\n const attentionItems = attentionMainMenuItems(state.manager);\n const managerItems = state.manager.actions.map(\n (label) => blockedSyncMenuItem(label, state.manager) ?? syncMainMenuItem(label),\n );\n const operationFirst = state.manager.operation !== undefined && state.manager.operation.kind !== \"free\";\n return {\n kind: \"actions\",\n title: \"Manage sync\",\n // Frequent transfers stay visible; status is advisory and Help remains a direct route.\n lines: [\n ...state.manager.title.split(\"\\n\").slice(1),\n \"Help: /sync help \u00B7 Fresh status: /sync status \u00B7 Differences: /sync diff\",\n ],\n items: operationFirst ? [...managerItems, ...attentionItems] : [...attentionItems, ...managerItems],\n hint: \"close\",\n };\n },\n },\n actions: {\n \"review-attention\": async () => {\n const attention = options.getAttention?.();\n if (!attention) {\n const observation = options.getObservation?.();\n if (!observation) return { kind: \"stay\" };\n // A head-only observation is not an authoritative decision. Load a fresh\n // snapshot only after the user activates the existing review flow.\n const { showRemoteSelectionReview } = await import(\"./remote-selection-ui.js\");\n if (sessionSignal?.aborted) return { kind: \"close\" };\n const config = await loadConfig();\n if (sessionSignal?.aborted) return { kind: \"close\" };\n if (options.getObservation?.() !== observation || !observationMatchesConfig(observation, config)) {\n options.onObservationInvalidated?.();\n return { kind: \"stay\" };\n }\n // Keep the check-time hint on cancellation or failure. Route commits and\n // the manager's config/baseline reconciliation own invalidation.\n const result = await showRemoteSelectionReview(ctx, observation.setupName, sessionSignal, undefined, {\n origin: \"sync\",\n runRoute,\n onSelectionResolved: () => {\n if (!sessionSignal?.aborted && options.getObservation?.() === observation)\n options.onObservationInvalidated?.();\n },\n });\n if (sessionSignal?.aborted) return { kind: \"close\" };\n if (result.kind === \"route-result\") {\n return dispatchManagerResult(ctx, result.result, result.route, runRoute, sessionSignal);\n }\n return { kind: result.kind === \"closed\" || result.kind === \"stale\" ? \"close\" : \"stay\" };\n }\n const disposition = await showManagerAttention(ctx, attention, runRoute, sessionSignal, () =>\n options.onSelectionResolved?.(attention),\n );\n return { kind: disposition };\n },\n sync: async () => {\n const pendingAttention = options.getAttention?.();\n if (pendingAttention) {\n const activeConfig = await loadConfig();\n if (sessionSignal?.aborted) return { kind: \"close\" };\n if (pendingAttention.decision.setupName === activeConfig.setupName) {\n ctx.ui.notify(\"Review synced content before starting Sync now.\", \"warning\");\n return { kind: \"stay\" };\n }\n }\n const result = await runCancellableOperation(ctx, \"Checking current sync setup\u2026\", \"sync\", runRoute, {\n commitAware: true,\n signal: sessionSignal,\n });\n const disposition = await dispatchManagerResult(ctx, result, \"sync\", runRoute, sessionSignal);\n return disposition.kind === \"close\" ? { kind: \"close\" } : { kind: \"stay\" };\n },\n \"retry-refusal\": async ({ signal: actionSignal }) => {\n const signal = sessionSignal ? AbortSignal.any([sessionSignal, actionSignal]) : actionSignal;\n const validate = captureMutationOwner(ctx, signal);\n validate();\n const retryRoute: RunRoute = (route, operationSignal, onCommit, target, onDialog) =>\n runRoute(route, operationSignal, onCommit, target, onDialog, true);\n const result = await runCancellableOperation(ctx, \"Checking cached refusal\u2026\", \"sync\", retryRoute, {\n commitAware: true,\n cancelAcrossDialogs: true,\n signal,\n cancelledMessage: \"Model retry cancelled. Submitted requests and committed writes cannot be undone.\",\n });\n if (signal.aborted) return { kind: \"close\" };\n validate();\n if (result.kind === \"decision-required\" || result.kind === \"remote-selection-required\")\n ctx.ui.notify(\n \"Model retry needs an established source and matching synced content. Use Sync now to review changed selection or recovery before retrying.\",\n \"warning\",\n );\n return { kind: result.kind === \"closed\" ? \"close\" : \"stay\" };\n },\n switch: async () => {\n const result = await showSetupSwitcher(ctx, runRoute, undefined, sessionSignal);\n return result === \"pull-attempted\" || result === \"closed\" ? { kind: \"close\" } : { kind: \"stay\" };\n },\n settings: async () => {\n const result = await showSyncSettings(ctx, runRoute, sessionSignal);\n return { kind: result === \"exit\" ? \"close\" : \"stay\" };\n },\n pull: async () => {\n const result = await runCancellableOperation(ctx, \"Checking remote changes\u2026\", \"pull\", runRoute, {\n commitAware: true,\n cancelledMessage: \"Pull check cancelled; no local files were changed.\",\n signal: sessionSignal,\n });\n const disposition = await dispatchManagerResult(ctx, result, \"pull\", runRoute, sessionSignal);\n return disposition.kind === \"close\" ? { kind: \"close\" } : { kind: \"stay\" };\n },\n push: async () => {\n const result = await runCancellableOperation(ctx, \"Preparing push preview\u2026\", \"push\", runRoute, {\n commitAware: true,\n cancelledMessage: \"Push preparation cancelled; no remote files were changed.\",\n signal: sessionSignal,\n });\n const disposition = await dispatchManagerResult(ctx, result, \"push\", runRoute, sessionSignal);\n return disposition.kind === \"close\" ? { kind: \"close\" } : { kind: \"stay\" };\n },\n setups: async () => {\n const result = await showSyncSetupManager(ctx, runRoute, sessionSignal);\n return result === \"exit\" ? { kind: \"close\" } : { kind: \"stay\" };\n },\n connections: async () => {\n await showStorageConnections(ctx, sessionSignal);\n return { kind: \"stay\" };\n },\n history: async () => {\n const result = await runCancellableOperation(ctx, \"Loading sync history\u2026\", \"history\", runRoute, {\n signal: sessionSignal,\n commitAware: true,\n cancelAcrossDialogs: true,\n cancelledMessage: \"History review cancelled; no files were changed.\",\n });\n return { kind: result.kind === \"closed\" ? \"close\" : \"stay\" };\n },\n diff: async () => {\n const result = await runCancellableOperation(ctx, \"Comparing local and remote\u2026\", \"diff\", runRoute, {\n signal: sessionSignal,\n });\n return { kind: result.kind === \"closed\" ? \"close\" : \"stay\" };\n },\n status: async () => {\n const result = await runCancellableOperation(ctx, \"Checking remote status\u2026\", \"status\", runRoute, {\n signal: sessionSignal,\n });\n return { kind: result.kind === \"closed\" ? \"close\" : \"stay\" };\n },\n doctor: async ({ signal: actionSignal }) => {\n const signal = sessionSignal ? AbortSignal.any([sessionSignal, actionSignal]) : actionSignal;\n const validate = captureMutationOwner(ctx, signal);\n const config = await loadConfig();\n validate();\n const confirmed = await ctx.ui.confirm(\n \"Run diagnostics?\",\n `Setup: ${safeTerminalText(config.setupName)}\\nStorage: ${backendStorageDescription(config)}\\nS3/R2 reads the latest pointer without writing. Git reads remote snapshots and checks its cache. WebDAV probes conditional writes and cleanup, and can repair a missing history entry. Possible-secret checks still run. This is not the read-only Check remote status action.`,\n { signal },\n );\n if (signal.aborted) return { kind: \"close\" };\n validate();\n if (!confirmed) return { kind: \"stay\" };\n const latest = await loadConfig();\n validate();\n if (syncCheckConfigFingerprint(config) !== syncCheckConfigFingerprint(latest)) {\n ctx.ui.notify(\"Setup changed during diagnostics review; reopen Diagnostics.\", \"warning\");\n return { kind: \"stay\" };\n }\n const result = await runCancellableOperation(ctx, \"Checking setup access\u2026\", \"doctor\", runRoute, {\n signal,\n target: config.setupName,\n });\n return { kind: result.kind === \"closed\" ? \"close\" : \"stay\" };\n },\n recover: async ({ state, signal: actionSignal }) => {\n const result = await recoverSyncAccess(ctx, state.manager, runRoute, sessionSignal, actionSignal);\n return { kind: result === \"close\" ? \"close\" : \"stay\" };\n },\n refresh: async () => ({ kind: \"stay\" }),\n help: async () => {\n await runRoute(\"help\");\n return { kind: \"close\" };\n },\n init: async () => {\n await runRoute(\"init\");\n return { kind: \"stay\" };\n },\n conflicts: async () => {\n const result = await runCancellableOperation(ctx, \"Reviewing private conflicts\u2026\", \"conflicts\", runRoute, {\n commitAware: true,\n signal: sessionSignal,\n });\n const disposition = await dispatchManagerResult(ctx, result, \"sync\", runRoute, sessionSignal);\n return disposition.kind === \"close\" ? { kind: \"close\" } : { kind: \"stay\" };\n },\n },\n });\n const menuContext: ExtensionCommandContext = {\n ...ctx,\n ui: {\n ...ctx.ui,\n custom: (factory, customOptions) =>\n ctx.ui.custom((...args) => {\n const bound = (component: Component & { dispose?(): void }) => {\n const render = component.render.bind(component);\n // Kit menus use a one-cell layout floor; suppress it at a zero-column display boundary.\n component.render = (width) => (width <= 0 ? [] : render(width));\n return component;\n };\n const component = factory(...args);\n // Keep synchronous factories synchronous, including adapters that inspect their returned component.\n return component instanceof Promise ? component.then(bound) : bound(component);\n }, customOptions),\n },\n };\n await runMenu(menuContext, menu, {\n getState: async () => {\n const pendingAttention = options.getAttention?.();\n const observation = options.getObservation?.();\n const manager = await describeManagerState(sessionSignal, pendingAttention, undefined, observation);\n if (sessionSignal?.aborted) return { manager };\n // A busy operation suppresses baseline reads, not the stored check-time hint.\n if (\n observation &&\n options.getObservation?.() === observation &&\n !manager.observation &&\n !(manager.operation && operationBlocksChanges(manager.operation))\n ) {\n options.onObservationInvalidated?.();\n }\n if (pendingAttention && options.getAttention?.() === pendingAttention && !manager.attention) {\n options.onSelectionResolved?.(pendingAttention);\n }\n return { manager };\n },\n signal: sessionSignal,\n isCurrent: () => !sessionSignal?.aborted,\n });\n}\n\nfunction syncMainMenuItem(\n label: string,\n): ActionMenuItem<\n \"main\",\n | \"sync\"\n | \"retry-refusal\"\n | \"pull\"\n | \"push\"\n | \"diff\"\n | \"status\"\n | \"switch\"\n | \"settings\"\n | \"setups\"\n | \"connections\"\n | \"history\"\n | \"conflicts\"\n | \"doctor\"\n | \"recover\"\n | \"refresh\"\n | \"help\"\n | \"init\"\n> {\n const actions = {\n \"Sync now\": \"sync\",\n \"Retry refused model result\u2026\": \"retry-refusal\",\n \"Pull from remote\u2026\": \"pull\",\n \"Push to remote\u2026\": \"push\",\n \"View differences\": \"diff\",\n \"Check remote status\": \"status\",\n \"Switch sync setup\": \"switch\",\n Settings: \"settings\",\n History: \"history\",\n Diagnostics: \"doctor\",\n \"Review unresolved conflicts\": \"conflicts\",\n \"Restore sync access\u2026 (recommended)\": \"recover\",\n \"Refresh operation status\": \"refresh\",\n \"Sync setups\u2026\": \"setups\",\n \"Storage connections\u2026\": \"connections\",\n Help: \"help\",\n \"Set up sync\": \"init\",\n \"Use existing settings\": \"init\",\n } as const;\n const action = actions[label as keyof typeof actions];\n if (!action) throw new Error(`Unknown sync manager action: ${label}`);\n return {\n id: action,\n label,\n action,\n description:\n action === \"retry-refusal\"\n ? \"Transfer: confirm one fresh model request for a current cached refusal; may incur costs.\"\n : action === \"doctor\"\n ? \"Manage: review backend checks before running.\"\n : action === \"settings\" || action === \"history\" || action === \"switch\"\n ? \"Manage\"\n : action === \"sync\"\n ? \"Transfer: choose a safe direction or review conflicts.\"\n : action === \"pull\"\n ? \"Transfer: remote \u2192 local; review writes and removals.\"\n : action === \"push\"\n ? \"Transfer: local \u2192 remote active snapshot; review publication.\"\n : action === \"status\" || action === \"diff\"\n ? \"Inspect: read current local and remote state without transferring files.\"\n : undefined,\n };\n}\n", "import { errorMessage } from \"../sync/sync-errors.js\";\nimport { inspectLock, isLockGuardHeld, isStaleLock, type LockInspection } from \"./lock.js\";\nimport type { LockFile } from \"./state-types.js\";\n\nexport type OperationAvailability =\n | { kind: \"free\" }\n | { kind: \"live\"; lock: LockFile }\n | { kind: \"busy\"; lock?: LockFile; metadata: LockInspection[\"status\"] }\n | { kind: \"recoverable-stale\"; lock: LockFile }\n | { kind: \"recoverable-unreadable\" }\n | { kind: \"inspection-error\"; message: string };\n\ninterface OperationInspectionDependencies {\n inspectMetadata(): Promise<LockInspection>;\n inspectGuard(): Promise<boolean>;\n}\n\nconst DEFAULT_INSPECTION_DEPENDENCIES: OperationInspectionDependencies = {\n inspectMetadata: inspectLock,\n inspectGuard: isLockGuardHeld,\n};\n\nexport async function inspectOperationAvailability(\n dependencies: OperationInspectionDependencies = DEFAULT_INSPECTION_DEPENDENCIES,\n): Promise<OperationAvailability> {\n try {\n const metadata = await dependencies.inspectMetadata();\n const guardHeld = await dependencies.inspectGuard();\n return classifyOperationAvailability(metadata, guardHeld);\n } catch (error) {\n return { kind: \"inspection-error\", message: errorMessage(error) };\n }\n}\n\nexport function classifyOperationAvailability(metadata: LockInspection, guardHeld: boolean): OperationAvailability {\n if (metadata.status === \"valid\" && !isStaleLock(metadata.lock)) {\n return { kind: \"live\", lock: metadata.lock };\n }\n if (guardHeld) {\n return {\n kind: \"busy\",\n metadata: metadata.status,\n ...(metadata.status === \"valid\" ? { lock: metadata.lock } : {}),\n };\n }\n if (metadata.status === \"valid\") {\n return { kind: \"recoverable-stale\", lock: metadata.lock };\n }\n if (metadata.status === \"unreadable\") return { kind: \"recoverable-unreadable\" };\n return { kind: \"free\" };\n}\n\nexport function operationBlocksChanges(availability: OperationAvailability) {\n return availability.kind !== \"free\";\n}\n\nexport function operationCanRecover(availability: OperationAvailability) {\n return availability.kind === \"recoverable-stale\" || availability.kind === \"recoverable-unreadable\";\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport type { ActionMenuItem } from \"@narumitw/pi-tui-kit\";\nimport type { StartupObservation } from \"../sync/sync-inspection.js\";\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 getObservation?: () => StartupObservation | undefined;\n onObservationInvalidated?: () => void;\n getAttention?: () => SyncAttentionState | undefined;\n onSelectionResolved?: (expected: SyncAttentionState) => void;\n}\n\nexport function attentionMainMenuItems(manager: ManagerDescription): ActionMenuItem<\"main\", \"review-attention\">[] {\n if (!manager.attention && manager.observation?.inspection.selectionState?.kind !== \"different\") return [];\n const disabled = manager.attentionReviewDisabled === true;\n return [\n {\n id: \"review-attention\",\n label: \"Review synced content (recommended)\",\n action: \"review-attention\",\n ...(disabled\n ? {\n disabled: true,\n disabledReason: \"Finish or recover the active operation first.\",\n }\n : {}),\n },\n ];\n}\n\nexport function blockedSyncMenuItem(\n label: string,\n manager: ManagerDescription,\n): ActionMenuItem<\"main\", \"sync\"> | undefined {\n if (label !== \"Sync now\" || !manager.attentionBlocksSync) return undefined;\n return {\n id: \"sync\",\n label,\n description: \"Review first.\",\n action: \"sync\",\n disabled: true,\n disabledReason: \"Review synced content first.\",\n };\n}\n\nexport async function showManagerAttention(\n ctx: ExtensionCommandContext,\n attention: SyncAttentionState,\n runRoute: RunRoute,\n signal: AbortSignal | undefined,\n onSelectionResolved: (() => void) | undefined,\n): Promise<\"close\" | \"stay\"> {\n const { showRemoteSelectionReview } = await import(\"./remote-selection-ui.js\");\n if (signal?.aborted) return \"close\";\n const review = await showRemoteSelectionReview(ctx, attention.decision.setupName, signal, undefined, {\n decision: attention.decision,\n origin: attention.origin,\n runRoute,\n onSelectionResolved,\n });\n if (review.kind === \"route-result\") {\n const disposition = await dispatchManagerResult(ctx, review.result, review.route, runRoute, signal, {\n onSelectionResolved,\n });\n return disposition.kind;\n }\n return 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 { inspectOperationAvailability, operationCanRecover } from \"../state/operation-availability.js\";\nimport { errorMessage } from \"../sync/sync-errors.js\";\nimport type { RunRoute } from \"./cancellable-operation.js\";\nimport type { ManagerDescription } from \"./manager-state.js\";\nimport { safeTerminalText } from \"./terminal-text.js\";\n\nexport type RecoveryDisposition = \"restored\" | \"stay\" | \"close\";\n\nexport async function recoverSyncAccess(\n ctx: ExtensionCommandContext,\n manager: ManagerDescription,\n runRoute: RunRoute,\n sessionSignal: AbortSignal | undefined,\n actionSignal: AbortSignal,\n): Promise<RecoveryDisposition> {\n const operation = manager.operation;\n if (!operation || !operationCanRecover(operation)) {\n ctx.ui.notify(\"Operation status changed. Refresh the manager before retrying recovery.\", \"warning\");\n return \"stay\";\n }\n const signal = sessionSignal ? AbortSignal.any([sessionSignal, actionSignal]) : actionSignal;\n if (signal.aborted) return \"close\";\n const unreadable = operation.kind === \"recoverable-unreadable\";\n const details = unreadable\n ? \"Pi-sync cannot verify who owns the unreadable lock. Close other Pi sessions that may be syncing before continuing.\"\n : `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 const confirmation = await runConfirmation(ctx, {\n title: \"Restore sync access?\",\n message: [\n details,\n \"\",\n \"This removes only the local operation lock.\",\n \"It does not change settings, local files, sync state, or remote data.\",\n ].join(\"\\n\"),\n confirmLabel: \"Remove local lock and continue\",\n cancelLabel: \"Cancel\",\n signal,\n isCurrent: () => !signal.aborted,\n onError: (_currentCtx, error) => {\n ctx.ui.notify(`Recovery confirmation failed: ${safeTerminalText(errorMessage(error))}`, \"error\");\n },\n });\n if (confirmation.kind === \"stale\") return \"close\";\n if (confirmation.kind === \"closed\") {\n if (confirmation.reason === \"close\") return \"close\";\n if (!signal.aborted) {\n ctx.ui.notify(\"Recovery cancelled; the local operation lock was not changed.\", \"info\");\n }\n return \"stay\";\n }\n if (confirmation.kind !== \"confirmed\") return \"stay\";\n if (signal.aborted) return \"close\";\n await runRoute(unreadable ? \"unlock --stale\" : \"unlock\", signal);\n if (signal.aborted) return \"close\";\n const latest = await inspectOperationAvailability();\n if (signal.aborted) return \"close\";\n return latest.kind === \"free\" ? \"restored\" : \"stay\";\n}\n", "import { truncateToWidth } from \"@earendil-works/pi-tui\";\nimport { loadConfig } from \"../settings/config.js\";\nimport { activeLocalConfigPath } from \"../settings/config-file.js\";\nimport { readLocalConfigObject } from \"../settings/settings-store.js\";\nimport type { AnySyncConfig } from \"../settings/settings-types.js\";\nimport { isCloudflareR2Endpoint, ownRecord } from \"../settings/settings-validation.js\";\nimport {\n inspectOperationAvailability,\n type OperationAvailability,\n operationBlocksChanges,\n operationCanRecover,\n} from \"../state/operation-availability.js\";\nimport { readStateForConfig, syncStateFingerprint } from \"../state/sync-state-store.js\";\nimport { errorMessage } from \"../sync/sync-errors.js\";\nimport type { StartupObservation } from \"../sync/sync-inspection.js\";\nimport { compareSyncInclude, syncIncludeSelection } from \"../sync/sync-policy.js\";\nimport { automaticSyncSummary } from \"./automatic-sync-summary.js\";\nimport {\n observationMatchesConfig,\n observationSummary,\n type SyncAttentionState,\n syncAttentionMatchesConfig,\n} from \"./sync-attention.js\";\nimport { startupTransferSummary } from \"./sync-behavior.js\";\nimport { countValidSyncSetups } from \"./sync-setups-ui.js\";\nimport { safeTerminalText } from \"./terminal-text.js\";\n\nexport const MAIN_MENU_ACTIONS = [\n \"Sync now\",\n \"Pull from remote\u2026\",\n \"Push to remote\u2026\",\n \"View differences\",\n \"Check remote status\",\n \"Settings\",\n \"History\",\n \"Diagnostics\",\n] as const;\n\nexport interface ManagerDescription {\n title: string;\n actions: string[];\n operation?: OperationAvailability;\n attention?: SyncAttentionState;\n observation?: StartupObservation;\n attentionBlocksSync?: boolean;\n attentionReviewDisabled?: boolean;\n}\n\nexport async function describeManagerState(\n signal?: AbortSignal,\n attention?: SyncAttentionState,\n inspectOperation: () => Promise<OperationAvailability> = inspectOperationAvailability,\n observation?: StartupObservation,\n): Promise<ManagerDescription> {\n let raw: Record<string, unknown> | undefined;\n try {\n raw = await readLocalConfigObject();\n } catch (error) {\n return {\n title: [\n \"Manage sync\",\n \"\",\n \"Settings file needs repair. Automatic sync and settings writes are paused.\",\n `Error: ${safeTerminalText(errorMessage(error))}`,\n `File: ${safeTerminalText(await activeLocalConfigPath())}`,\n \"\",\n \"Repair the JSON file, then reopen /sync.\",\n ].join(\"\\n\"),\n actions: [\"Help\"],\n };\n }\n if (!raw) {\n return {\n title: [\"Manage sync\", \"\", \"Not set up.\", \"\", \"What do you want to do?\"].join(\"\\n\"),\n actions: [\"Set up sync\", \"Help\"],\n };\n }\n const configuredTargets = ownRecord(raw.syncSetups);\n if (\n (raw.version === 3 || raw.version === 4 || raw.version === 5) &&\n configuredTargets &&\n Object.keys(configuredTargets).length === 0\n ) {\n return {\n title: [\n \"Manage sync\",\n \"\",\n \"No sync setups are configured.\",\n \"Add a sync setup using an existing storage connection.\",\n \"\",\n \"What do you want to do?\",\n ].join(\"\\n\"),\n actions: [\"Sync setups\u2026\", \"Storage connections\u2026\", \"Help\"],\n };\n }\n try {\n const config = await loadConfig();\n const operation = await inspectOperation();\n const changesBlocked = operationBlocksChanges(operation);\n const selection = syncIncludeSelection(config.include);\n let currentAttention: SyncAttentionState | undefined;\n if (attention) {\n try {\n const attentionConfig =\n attention.decision.setupName === config.setupName ? config : await loadConfig(attention.decision.setupName);\n if (syncAttentionMatchesConfig(attention, attentionConfig)) currentAttention = attention;\n } catch {\n currentAttention = undefined;\n }\n if (signal?.aborted) throw signal.reason;\n }\n const attentionComparison = currentAttention\n ? compareSyncInclude(currentAttention.decision.localInclude, currentAttention.decision.remoteInclude)\n : undefined;\n const noSyncedContent = config.include.length === 0;\n const syncState = changesBlocked ? undefined : await readStateForConfig(config).catch(() => undefined);\n const currentObservation =\n observation &&\n observationMatchesConfig(observation, config) &&\n syncState &&\n syncStateFingerprint(syncState) === observation.inspection.stateIdentity\n ? observation\n : undefined;\n const lastAppliedSnapshot = changesBlocked\n ? \"Unavailable while operations are locked\"\n : syncState?.lastAppliedSnapshot\n ? `${truncateToWidth(safeTerminalText(syncState.lastAppliedSnapshot), 20, \"\u2026\")} (application time unavailable; full ID in History)`\n : syncState\n ? \"Never synced\"\n : \"Unavailable\";\n const canSwitch = (await countValidSyncSetups(configuredTargets, signal)) > 1;\n const mainActions: string[] = [...MAIN_MENU_ACTIONS];\n if (config.agentMode && !noSyncedContent) mainActions.splice(1, 0, \"Retry refused model result\u2026\");\n if (canSwitch) mainActions.push(\"Switch sync setup\");\n if (syncState?.unresolved?.length) mainActions.unshift(\"Review unresolved conflicts\");\n const ordinaryTitle = [\n \"Manage sync\",\n \"\",\n `Current sync setup: ${safeTerminalText(config.setupName)}`,\n `Storage: ${backendStorageDescription(config)}`,\n \"CURRENT STATE\",\n ...(syncState?.unresolved?.length\n ? [\n `Unresolved: ${syncState.unresolved.length} dependency groups \u00B7 choose Review unresolved conflicts`,\n `Last observed: ${safeTerminalText(syncState.lastObservedSnapshot ?? \"unknown\")}`,\n ]\n : []),\n ...(currentAttention\n ? [\n currentAttention.decision.setupName === config.setupName\n ? \"Sync status: Review needed\"\n : `Sync status: Review needed for setup ${safeTerminalText(currentAttention.decision.setupName)}`,\n attentionComparison?.remoteOnly.length === 0 && attentionComparison.localOnly.length === 0\n ? \"Only the synced-content order differs.\"\n : `Remote-only paths: ${attentionComparison?.remoteOnly.length ?? 0} \u00B7 Device-only paths: ${attentionComparison?.localOnly.length ?? 0}`,\n \"Nothing has been changed.\",\n ]\n : currentObservation\n ? [\n `Startup check (${safeTerminalText(currentObservation.checkedAt)}): ${observationSummary(currentObservation)}`,\n \"Check-time observation only; synchronization rechecks current content.\",\n ]\n : [\"Remote status: Not checked\"]),\n `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 `Automatic sync: ${automaticSyncSummary(config.automatic)}`,\n `Startup transfer: ${startupTransferSummary(config)}`,\n `Agent mode: ${config.agentMode ? \"On (experimental; autonomous merged sync)\" : \"Off\"}`,\n ...(config.continuous ? await (await import(\"../sync/continuous-record.js\")).continuousStatusLines(config) : []),\n `Last applied: ${lastAppliedSnapshot}`,\n ...(noSyncedContent\n ? [\"\", \"No included content is selected. Choose included content in Settings before syncing.\"]\n : []),\n \"\",\n \"ACTIONS \u00B7 transfer, inspect, or manage\",\n ];\n return {\n title: (changesBlocked ? [\"Manage sync\", ...operationStatusLines(operation)] : ordinaryTitle).join(\"\\n\"),\n actions: operationActions(operation, noSyncedContent, canSwitch, mainActions),\n operation,\n ...(currentObservation ? { observation: currentObservation } : {}),\n ...(currentAttention\n ? {\n attention: currentAttention,\n attentionBlocksSync: currentAttention.decision.setupName === config.setupName,\n attentionReviewDisabled: changesBlocked,\n }\n : {}),\n };\n } catch (error) {\n if (signal?.aborted) throw error;\n return {\n title: [\n \"Manage sync\",\n \"\",\n \"Settings need attention. Automatic sync is paused.\",\n `Current sync setup: ${safeTerminalText(typeof raw.activeSyncSetup === \"string\" ? raw.activeSyncSetup : \"none\")}`,\n `Error: ${safeTerminalText(errorMessage(error))}`,\n `File: ${safeTerminalText(await activeLocalConfigPath())}`,\n \"\",\n \"What do you want to do?\",\n ].join(\"\\n\"),\n actions: [\"Sync setups\u2026\", \"Storage connections\u2026\", \"History\", \"Help\"],\n };\n }\n}\n\nfunction operationActions(\n operation: OperationAvailability,\n noSyncedContent: boolean,\n canSwitch: boolean,\n mainActions: string[],\n) {\n if (operationCanRecover(operation)) {\n return [\"Restore sync access\u2026 (recommended)\", \"History\", \"Help\"];\n }\n if (operation.kind !== \"free\") {\n return [\"Refresh operation status\", \"History\", \"Help\"];\n }\n return noSyncedContent\n ? [\n ...(mainActions.includes(\"Review unresolved conflicts\") ? [\"Review unresolved conflicts\"] : []),\n \"Settings\",\n ...(canSwitch ? [\"Switch sync setup\"] : []),\n \"History\",\n \"Diagnostics\",\n ]\n : mainActions;\n}\n\nfunction operationStatusLines(operation: OperationAvailability): string[] {\n switch (operation.kind) {\n case \"free\":\n return [];\n case \"live\": {\n const command = truncateToWidth(safeTerminalText(operation.lock.command), 16, \"\u2026\");\n return [\n `Running: ${command} (pid ${operation.lock.pid}). Wait, then refresh; Transfer actions and Settings return.`,\n ];\n }\n case \"busy\":\n return [\n \"Pi-sync may be starting or finishing. Wait, then refresh; Transfer actions and Settings remain unavailable.\",\n ];\n case \"recoverable-stale\":\n return [\n \"Sync paused: old lock remains. Close other Pi sessions then restore; Transfer actions and Settings return.\",\n ];\n case \"recoverable-unreadable\":\n return [\n \"Sync paused: owner unknown. Close other Pi sessions then restore; Transfer actions and Settings return.\",\n ];\n case \"inspection-error\":\n return [\"Lock check failed. Fix path access, then refresh; Transfer actions and Settings remain unavailable.\"];\n }\n}\n\nexport function backendStorageDescription(config: AnySyncConfig) {\n const connection = safeTerminalText(config.connectionName);\n switch (config.backend.type) {\n case \"s3\": {\n const type =\n config.backend.profile.kind === \"r2\" || isCloudflareR2Endpoint(config.backend.profile.endpoint)\n ? \"Cloudflare R2\"\n : \"S3-compatible\";\n return `${type} \u00B7 ${connection} \u00B7 ${safeTerminalText(config.backend.destination.bucket)}`;\n }\n case \"webdav\":\n return `WebDAV \u00B7 ${connection} \u00B7 ${safeTerminalText(config.backend.destination.path)}`;\n case \"git\":\n return `Git \u00B7 ${connection} \u00B7 ${safeTerminalText(config.backend.destination.branch)}`;\n }\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport { loadConfig } from \"../settings/config.js\";\nimport { readLocalConfigObject } from \"../settings/settings-store.js\";\nimport { ownRecord } from \"../settings/settings-validation.js\";\nimport { throwIfAborted } from \"../sync/signals.js\";\nimport { syncErrorGuidance } from \"../sync/sync-error-guidance.js\";\nimport { syncIncludeSelection } from \"../sync/sync-policy.js\";\nimport { safeTerminalText } from \"./terminal-text.js\";\n\nexport async function countValidSyncSetups(setups: Record<string, unknown> | undefined, signal?: AbortSignal) {\n let count = 0;\n for (const name of Object.keys(setups ?? {})) {\n throwIfAborted(signal);\n let valid = false;\n try {\n await loadConfig(name);\n valid = true;\n } catch {\n // Invalid setups stay visible in management but are not switchable.\n }\n throwIfAborted(signal);\n if (valid) count += 1;\n }\n return count;\n}\n\ntype SyncSetupActions = {\n add(signal?: AbortSignal): Promise<void>;\n edit(name: string, signal?: AbortSignal): Promise<void>;\n makeCurrent(name: string, signal?: AbortSignal): Promise<\"exit\" | undefined>;\n remove(name: string, signal?: AbortSignal): Promise<void>;\n};\n\ninterface SetupMenuState {\n setups: Record<string, unknown>;\n active?: string;\n selected?: {\n name: string;\n detail: string[];\n valid: boolean;\n removeUnavailable: boolean;\n };\n}\n\nexport async function showSyncSetups(\n ctx: ExtensionCommandContext,\n actions: SyncSetupActions,\n signal?: AbortSignal,\n): Promise<\"exit\" | undefined> {\n let selectedName: string | undefined;\n let exit = false;\n const nameById = new Map<string, string>();\n type Screen = \"list\" | \"detail\";\n type Action = \"add\" | \"select\" | \"make-current\" | \"edit\" | \"remove\" | \"back\";\n const menu = defineMenu<SetupMenuState, Screen, Action, ExtensionCommandContext>({\n start: \"list\",\n screens: {\n list: ({ state }) => {\n nameById.clear();\n const names = Object.keys(state.setups).sort((left, right) => left.localeCompare(right));\n return {\n kind: \"actions\",\n title: \"Sync setups\",\n lines: [\"What to sync, where to store it, and when to sync.\"],\n items: [\n { id: \"add\", label: \"Add sync setup\", action: \"add\" },\n ...names.map((name, index) => {\n const id = `setup:${index}`;\n nameById.set(id, name);\n return {\n id,\n label: `${safeTerminalText(name)}${name === state.active ? \" (current)\" : \"\"}`,\n description: setupSummary(state.setups[name]),\n action: \"select\" as const,\n };\n }),\n ],\n hint: \"back\",\n };\n },\n detail: ({ state }) => ({\n kind: \"actions\",\n title: state.selected ? `Sync setup \u201C${safeTerminalText(state.selected.name)}\u201D` : \"Sync setup\",\n lines: state.selected?.detail ?? [\"This sync setup no longer exists.\"],\n items: state.selected\n ? [\n ...(!state.selected.name || state.selected.name === state.active || !state.selected.valid\n ? []\n : [\n {\n id: \"make-current\",\n label: \"Make current\u2026\",\n action: \"make-current\" as const,\n },\n ]),\n { id: \"edit\", label: \"Edit storage location\u2026\", action: \"edit\" },\n ...(state.selected.removeUnavailable\n ? []\n : [\n {\n id: \"remove\",\n label: \"Remove sync setup\u2026\",\n action: \"remove\" as const,\n },\n ]),\n { id: \"back\", label: \"Back\", action: \"back\" },\n ]\n : [{ id: \"back\", label: \"Back\", action: \"back\" }],\n hint: \"back\",\n }),\n },\n actions: {\n add: async () => {\n try {\n await actions.add(signal);\n } catch (error) {\n if (!signal?.aborted) {\n ctx.ui.notify(`Sync setup was not added: ${menuErrorMessage(error)}`, \"error\");\n }\n }\n return { kind: \"stay\" };\n },\n select: async ({ itemId }) => {\n selectedName = nameById.get(itemId);\n return selectedName ? { kind: \"to\", screen: \"detail\" } : { kind: \"rejected\" };\n },\n \"make-current\": async () => {\n if (!selectedName) return { kind: \"rejected\" };\n try {\n exit = (await actions.makeCurrent(selectedName, signal)) === \"exit\";\n return exit ? { kind: \"close\" } : { kind: \"stay\" };\n } catch (error) {\n notifySetupChangeError(ctx, selectedName, error, signal);\n return { kind: \"stay\" };\n }\n },\n edit: async () => {\n if (!selectedName) return { kind: \"rejected\" };\n try {\n await actions.edit(selectedName, signal);\n } catch (error) {\n notifySetupChangeError(ctx, selectedName, error, signal);\n }\n return { kind: \"stay\" };\n },\n remove: async () => {\n if (!selectedName) return { kind: \"rejected\" };\n const name = selectedName;\n try {\n await actions.remove(name, signal);\n selectedName = undefined;\n return { kind: \"back\" };\n } catch (error) {\n notifySetupChangeError(ctx, name, error, signal);\n return { kind: \"stay\" };\n }\n },\n back: async () => {\n selectedName = undefined;\n return { kind: \"back\" };\n },\n },\n });\n await runMenu(ctx, menu, {\n getState: async () => loadSetupMenuState(selectedName, signal),\n signal,\n isCurrent: () => !signal?.aborted,\n });\n return exit ? \"exit\" : undefined;\n}\n\nasync function loadSetupMenuState(selectedName: string | undefined, signal?: AbortSignal): Promise<SetupMenuState> {\n const raw = await readLocalConfigObject();\n throwIfAborted(signal);\n const setups = ownRecord(raw?.syncSetups) ?? {};\n const active = typeof raw?.activeSyncSetup === \"string\" ? raw.activeSyncSetup : undefined;\n if (!selectedName || !ownRecord(setups[selectedName])) return { setups, active };\n const setupCount = Object.keys(setups).length;\n const isCurrent = selectedName === active;\n let detail: string[];\n let valid = true;\n try {\n const config = await loadConfig(selectedName);\n throwIfAborted(signal);\n const selection = syncIncludeSelection(config.include);\n detail = [\n `Status: ${isCurrent ? \"Current\" : \"Not current\"}`,\n `Storage connection: ${safeTerminalText(config.connectionName)}`,\n `Endpoint: ${storageEndpoint(config)}`,\n `Storage location: ${storageLocation(config)}`,\n `Included content: ${selection.builtIns.length} built-in groups \u00B7 ${selection.custom.length} extra paths`,\n `Sessions: ${selection.sessions ? \"On \u2014 privacy-sensitive\" : \"Off\"}`,\n `Automatic sync: ${config.automatic ? \"On\" : \"Off\"}`,\n `Automatic transfer at startup: ${config.automaticTransfer ? \"On \u2014 may upload, replace, or delete selected files; no reload\" : \"Off\"}`,\n `Agent mode: ${config.agentMode ? \"On (experimental; autonomous merged sync)\" : \"Off\"}`,\n `Continuous sync: ${config.continuous ? (config.agentMode ? \"On (experimental; recurring requests and transfers)\" : \"Saved On; paused until Agent mode is enabled\") : \"Off\"}`,\n isCurrent\n ? \"Edit included content and automatic sync in /sync \u2192 Settings.\"\n : \"To edit included content or automatic sync, make this setup current, then open /sync \u2192 Settings.\",\n ];\n } catch (error) {\n valid = false;\n detail = [\n `Status: Invalid${isCurrent ? \" current setup\" : \"\"}`,\n `Reason: ${menuErrorMessage(error)}`,\n \"Make current and sync are unavailable until this setup is repaired.\",\n ];\n }\n const removeUnavailable = isCurrent && setupCount > 1;\n if (removeUnavailable) detail.push(\"Remove unavailable: switch to another setup first.\");\n return {\n setups,\n active,\n selected: { name: selectedName, detail, valid, removeUnavailable },\n };\n}\n\nfunction notifySetupChangeError(ctx: ExtensionCommandContext, name: string, error: unknown, signal?: AbortSignal) {\n if (signal?.aborted) return;\n ctx.ui.notify(`Sync setup \u201C${safeTerminalText(name)}\u201D was not changed: ${menuErrorMessage(error)}`, \"error\");\n}\n\nfunction menuErrorMessage(error: unknown) {\n return syncErrorGuidance(error);\n}\n\nfunction setupSummary(value: unknown) {\n const storage = ownRecord(ownRecord(value)?.storage);\n if (!storage || typeof storage.connection !== \"string\") return \"Invalid storage reference\";\n return safeTerminalText(\n `${storage.connection} \u00B7 ${storage.bucket ?? storage.branch ?? \"WebDAV\"} \u00B7 ${storage.path ?? \"missing path\"}`,\n );\n}\n\nfunction storageEndpoint(config: Awaited<ReturnType<typeof loadConfig>>) {\n switch (config.backend.type) {\n case \"s3\":\n return safeTerminalText(config.backend.profile.endpoint);\n case \"git\":\n return safeTerminalText(config.backend.profile.remote);\n case \"webdav\":\n return safeTerminalText(config.backend.profile.url);\n }\n}\n\nfunction storageLocation(config: Awaited<ReturnType<typeof loadConfig>>) {\n switch (config.backend.type) {\n case \"s3\":\n return safeTerminalText(`${config.backend.destination.bucket}/${config.storagePath}`);\n case \"git\":\n return safeTerminalText(`Git \u00B7 ${config.backend.destination.branch}:${config.storagePath}`);\n case \"webdav\":\n return safeTerminalText(`WebDAV \u00B7 ${config.storagePath}`);\n }\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, type MenuSettingItem, runMenu } from \"@narumitw/pi-tui-kit\";\nimport { loadConfig } from \"../settings/config.js\";\nimport { localConfigPath } from \"../settings/config-file.js\";\nimport { updateSyncSetup } from \"../settings/settings-management.js\";\nimport { updateLocalConfig } from \"../settings/settings-store.js\";\nimport { normalizeLocalFields, sameLocalFields } from \"../sync/local-fields.js\";\nimport {\n SETUP_SWITCH_ACTION_OPTIONS,\n saveOnSwitch,\n setupSwitchActionFromLabel,\n setupSwitchActionLabel,\n} from \"../sync/setup-switch.js\";\nimport { captureMutationOwner } from \"../sync/sync-local.js\";\nimport {\n AGENT_MODE_DESCRIPTION,\n CONTINUOUS_DESCRIPTION,\n saveAgentMode,\n saveContinuousMode,\n} from \"./agent-mode-setting.js\";\nimport type { RunRoute } from \"./cancellable-operation.js\";\nimport { dispatchManagerResult } from \"./manager-result-dispatcher.js\";\nimport { boundedSettingsUI } from \"./settings-frame.js\";\nimport { showEditSyncSetupStorage, showSyncSetupManager } from \"./setup/setup-actions.js\";\nimport { showStorageConnections } from \"./storage-connections-ui.js\";\nimport { AUTOMATIC_SYNC_DESCRIPTION, STARTUP_TRANSFER_DESCRIPTION, startupTransferSummary } from \"./sync-behavior.js\";\nimport { configureSyncStatus } from \"./sync-status.js\";\nimport { safeTerminalText } from \"./terminal-text.js\";\n\nexport type SyncSettingsRoute = RunRoute;\n\nexport async function showSyncSettings(\n ctx: ExtensionCommandContext,\n runRoute: SyncSettingsRoute,\n signal?: AbortSignal,\n): Promise<\"back\" | \"exit\"> {\n let disposition: \"back\" | \"exit\" = \"back\";\n const exitSettings = () => {\n disposition = \"exit\";\n return { kind: \"close\" as const };\n };\n if (ctx.mode !== \"tui\") {\n ctx.ui.notify(`Edit pi-sync settings manually: ${safeTerminalText(localConfigPath())}`, \"info\");\n if (ctx.mode === \"rpc\" && ctx.hasUI) {\n // Preserve RPC catalog management; preference/credential editing stays TUI-only.\n const management = defineMenu<undefined, \"management\", \"setups\" | \"connections\", ExtensionCommandContext>({\n start: \"management\",\n screens: {\n management: () => ({\n kind: \"actions\",\n title: \"Sync settings management\",\n items: [\n { id: \"setups\", label: \"Manage sync setups\", action: \"setups\" },\n { id: \"connections\", label: \"Manage storage connections\", action: \"connections\" },\n ],\n hint: \"back\",\n }),\n },\n actions: {\n setups: async ({ signal: actionSignal }) => {\n const result = await showSyncSetupManager(ctx, runRoute, actionSignal);\n return result === \"exit\" ? exitSettings() : { kind: \"stay\" };\n },\n connections: async ({ signal: actionSignal }) => {\n await showStorageConnections(ctx, actionSignal);\n return { kind: \"stay\" };\n },\n },\n });\n await runMenu(ctx, management, { getState: () => undefined, signal, isCurrent: () => !signal?.aborted });\n }\n return disposition;\n }\n const initial = await loadConfig();\n if (signal?.aborted) return \"back\";\n const setupName = initial.setupName;\n type Action =\n | \"automatic\"\n | \"automatic-transfer\"\n | \"agent-mode\"\n | \"continuous\"\n | \"merge-settings\"\n | \"local-fields\"\n | \"content-policy\"\n | \"skip-secret-scan\"\n | \"show-status\"\n | \"debug\"\n | \"on-switch\"\n | \"include\"\n | \"remote-include\"\n | \"storage-location\"\n | \"setups\"\n | \"connections\";\n type Group = \"content\" | \"behavior\" | \"storage\" | \"advanced\" | \"all\";\n type Screen = \"categories\" | Group;\n const groups: Record<Group, { label: string; ids: readonly string[] }> = {\n content: { label: \"Sync content\", ids: [\"include\", \"remoteInclude\", \"localFields\"] },\n behavior: {\n label: \"Sync behavior\",\n ids: [\"automatic\", \"automaticTransfer\", \"agentMode\", \"continuous\", \"onSwitch\"],\n },\n storage: { label: \"Storage & setups\", ids: [\"storageLocation\", \"setups\", \"connections\"] },\n advanced: { label: \"Advanced\", ids: [\"mergeSettings\", \"contentPolicy\", \"skipSecretScan\", \"showStatus\", \"debug\"] },\n all: { label: \"All settings (search)\", ids: [] },\n };\n let saveStatus = \"Simple choices save immediately. Back does not undo saved changes.\";\n // Keep Kit's existing settings adapter: native SettingsList has no async save/rollback\n // contract or injected keybindings. Kit preserves these safety and accessibility behaviors.\n // Categories use public navigation; All settings retains cross-category search.\n const settingsScreen = (state: Awaited<ReturnType<typeof loadConfig>>, group: Group) =>\n ({\n kind: \"settings\",\n title: `Pi Sync Settings \u00B7 ${groups[group].label}`,\n lines: [\n `Setup: ${safeTerminalText(state.setupName)} \u00B7 Connection: ${safeTerminalText(state.connectionName)}`,\n saveStatus,\n ],\n items: (\n [\n {\n id: \"include\",\n label: \"Included paths\",\n description:\n \"This setup: choose paths in a draft, then review and Save or Discard. No transfer is started.\",\n currentValue: `${state.include.length} paths \u00B7 Edit`,\n action: \"include\",\n },\n {\n id: \"remoteInclude\",\n label: \"Compare included paths\",\n description:\n \"This setup: compare included-path policies, not file contents. Review before saving either list; no files transfer unless you explicitly Continue.\",\n currentValue: \"Review\",\n action: \"remote-include\",\n },\n {\n id: \"localFields\",\n label: \"Machine-local fields\",\n description:\n \"This setup: settings.json root fields excluded from future portable snapshots, not project overrides. Policy changes require reviewed directional migration; old history remains.\",\n currentValue: `${state.localFields?.length ?? 0} fields \u00B7 Edit`,\n action: \"local-fields\",\n },\n {\n id: \"storageLocation\",\n label: \"Storage location\",\n description: \"This setup: review and save bucket, branch, or path changes. Remote history is not moved.\",\n currentValue:\n state.backend.type === \"s3\"\n ? `${safeTerminalText(state.backend.destination.bucket)} \u00B7 ${safeTerminalText(state.backend.destination.prefix)}`\n : state.backend.type === \"git\"\n ? `${safeTerminalText(state.backend.destination.branch)} \u00B7 ${safeTerminalText(state.backend.destination.directory)}`\n : safeTerminalText(state.backend.destination.path),\n action: \"storage-location\",\n },\n {\n id: \"setups\",\n label: \"Manage sync setups\",\n description:\n \"This device: add, switch, edit, or remove sync setups. Each edit identifies its owner before saving.\",\n currentValue: \"Open\",\n action: \"setups\",\n },\n {\n id: \"connections\",\n label: \"Manage storage connections\",\n description:\n \"Shared connections on this device: review affected setups before saving server or credential changes.\",\n currentValue: \"Open\",\n action: \"connections\",\n },\n {\n id: \"automatic\",\n label: \"Automatic sync\",\n description: AUTOMATIC_SYNC_DESCRIPTION,\n currentValue: state.automatic ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"automatic\",\n },\n {\n id: \"automaticTransfer\",\n label: \"Startup transfer\",\n description: `${STARTUP_TRANSFER_DESCRIPTION} Saved preference and requirements: ${startupTransferSummary(state)}.`,\n currentValue: state.automaticTransfer ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"automatic-transfer\",\n },\n {\n id: \"agentMode\",\n label: \"Agent mode (experimental)\",\n description: AGENT_MODE_DESCRIPTION,\n currentValue: state.agentMode ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"agent-mode\",\n },\n {\n id: \"continuous\",\n label: \"Continuous sync (experimental)\",\n description: `${CONTINUOUS_DESCRIPTION}${state.continuous && !state.agentMode ? \" Saved On, but paused until Agent mode is enabled.\" : \"\"}`,\n currentValue: state.continuous ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"continuous\",\n },\n {\n id: \"onSwitch\",\n label: \"On setup switch\",\n description:\n \"All setups on this device: ask before a pull review, open it automatically, or switch without pulling. Applies to subsequent switches.\",\n currentValue: setupSwitchActionLabel(state.onSwitch),\n values: SETUP_SWITCH_ACTION_OPTIONS.map(({ label }) => label),\n action: \"on-switch\",\n },\n {\n id: \"mergeSettings\",\n label: \"Merge settings fields\",\n description:\n \"This setup, experimental opt-in: merge independent global settings.json root fields with a verified private ancestor. Arrays and nested objects remain atomic. Applies to subsequent sync; no reload.\",\n currentValue: state.mergeSettings ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"merge-settings\",\n },\n {\n id: \"contentPolicy\",\n label: \"Content merge / partial progress\",\n description:\n \"This setup, experimental opt-in: review the version-5 upgrade before saving. Merge bounded text and prefix-only sessions; partial progress keeps withheld versions and baselines. Applies to subsequent sync; disabling does not clear recovery evidence.\",\n currentValue: state.mergeContent\n ? state.partialSync\n ? \"Merge + partial\"\n : \"Merge only\"\n : state.partialSync\n ? \"Partial only\"\n : \"Off\",\n values: [\"Off\", \"Merge only\", \"Merge + partial\", \"Partial only\"],\n action: \"content-policy\",\n },\n {\n id: \"skipSecretScan\",\n label: \"Skip secret scan\",\n description:\n \"All setups on this device: skip possible-secret checks on subsequent pushes, including automatic pushes. Other safety checks remain. Diagnostics still scans.\",\n currentValue: state.skipSecretScan ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"skip-secret-scan\",\n },\n {\n id: \"showStatus\",\n label: \"Show sync status\",\n description:\n \"All setups on this device: saved and applied immediately to Pi status. Review widgets and notifications remain available.\",\n currentValue: state.showStatus ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"show-status\",\n },\n {\n id: \"debug\",\n label: \"Debug startup timings\",\n description:\n \"All setups on this device: show startup durations in the TUI transcript or RPC notifications, including initial Continuous sync. Applies next session start; no credentials or file contents.\",\n currentValue: state.debug ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"debug\",\n },\n ] satisfies MenuSettingItem<Action>[]\n ).filter((item) => group === \"all\" || groups[group].ids.includes(item.id)),\n }) as const;\n const menu = defineMenu<Awaited<ReturnType<typeof loadConfig>>, Screen, Action, ExtensionCommandContext>({\n start: \"categories\",\n screens: {\n categories: ({ state }) => ({\n kind: \"actions\",\n title: \"Pi Sync Settings\",\n lines: [\n `Setup: ${safeTerminalText(state.setupName)} \u00B7 Connection: ${safeTerminalText(state.connectionName)}`,\n \"Choose a task, or search all settings. Scope is shown in each setting's description.\",\n saveStatus,\n ],\n items: (Object.entries(groups) as [Group, (typeof groups)[Group]][]).map(([id, group]) => ({\n id,\n label: group.label,\n to: id,\n })),\n hint: \"back\",\n }),\n content: ({ state }) => settingsScreen(state, \"content\"),\n behavior: ({ state }) => settingsScreen(state, \"behavior\"),\n storage: ({ state }) => settingsScreen(state, \"storage\"),\n advanced: ({ state }) => settingsScreen(state, \"advanced\"),\n all: ({ state }) => settingsScreen(state, \"all\"),\n },\n actions: {\n \"storage-location\": async ({ signal: actionSignal }) => {\n const editorSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n await showEditSyncSetupStorage(ctx, setupName, editorSignal);\n return resumeSettings(editorSignal);\n },\n setups: async ({ signal: actionSignal }) => {\n const editorSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n const result = await showSyncSetupManager(ctx, runRoute, editorSignal);\n return result === \"exit\" ? exitSettings() : resumeSettings(editorSignal);\n },\n connections: async ({ signal: actionSignal }) => {\n const editorSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n await showStorageConnections(ctx, editorSignal);\n return resumeSettings(editorSignal);\n },\n \"content-policy\": async ({ value, signal: actionSignal }) => {\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n const validate = captureMutationOwner(ctx, mutationSignal);\n try {\n const previous = await loadConfig(setupName);\n validate();\n const mergeContent = value === \"Merge only\" || value === \"Merge + partial\";\n const partialSync = value === \"Partial only\" || value === \"Merge + partial\";\n if (\n !(await ctx.ui.confirm(\n \"Save experimental content policy?\",\n \"This explicitly upgrades settings to version 5; partial snapshots use version 3 and older clients must refuse them. Text/session merge is conservative. Partial sync preserves withheld versions and old baselines. Disabling does not clear unresolved groups or recovery evidence. Review a directional migration first if portable policy changes.\",\n { signal: mutationSignal },\n ))\n )\n return { kind: \"rejected\" };\n validate();\n ctx.ui.notify(\"Saving reviewed Pi Sync policy\u2026\", \"info\");\n await updateLocalConfig((current) => {\n validate();\n const setup = current.syncSetups[setupName];\n if (\n !setup ||\n Boolean(setup.sync.mergeContent) !== Boolean(previous.mergeContent) ||\n Boolean(setup.sync.partialSync) !== Boolean(previous.partialSync)\n )\n throw new Error(\"Content policy changed during review.\");\n return {\n ...current,\n version: 5,\n syncSetups: {\n ...current.syncSetups,\n [setupName]: { ...setup, sync: { ...setup.sync, mergeContent, partialSync } },\n },\n };\n }, mutationSignal);\n validate();\n saveStatus =\n \"Saved reviewed policy for this setup. Applies to subsequent sync operations; recovery evidence is retained.\";\n ctx.ui.notify(saveStatus, \"info\");\n return { kind: \"stay\" };\n } catch (error) {\n if (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n \"merge-settings\": async ({ value, signal: actionSignal }) => {\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n const validate = captureMutationOwner(ctx, mutationSignal);\n try {\n validate();\n await updateSyncSetup(\n setupName,\n (setup) => ({ ...setup, sync: { ...setup.sync, mergeSettings: value === \"On\" } }),\n { signal: mutationSignal },\n );\n validate();\n return { kind: \"stay\" };\n } catch (error) {\n if (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n \"local-fields\": async ({ signal: actionSignal }) => {\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n const validate = captureMutationOwner(ctx, mutationSignal);\n try {\n const previous = await loadConfig(setupName);\n validate();\n const input = await ctx.ui.input(\n \"Machine-local settings.json root fields (JSON string array)\",\n JSON.stringify(previous.localFields ?? []),\n { signal: mutationSignal },\n );\n validate();\n if (input === undefined) return { kind: \"rejected\" };\n let fields: string[];\n try {\n fields = normalizeLocalFields(JSON.parse(input));\n } catch {\n throw new Error(\"Invalid localFields JSON array; no policy was changed.\");\n }\n if (sameLocalFields(previous.localFields, fields)) return { kind: \"stay\" };\n const confirmed = await ctx.ui.confirm(\n \"Save portable field policy?\",\n \"This opts into settings/snapshot version 4/2; older clients must refuse them. Future snapshots omit these fields, but old remote history is NOT erased. Review an explicit force push/pull migration before further sync. Removed rules can expose or replace local-only values.\",\n { signal: mutationSignal },\n );\n validate();\n if (!confirmed) return { kind: \"rejected\" };\n ctx.ui.notify(\"Saving reviewed Pi Sync policy\u2026\", \"info\");\n await updateLocalConfig((current) => {\n validate();\n const setup = current.syncSetups[setupName];\n if (!setup || !sameLocalFields(setup.sync.localFields, previous.localFields))\n throw new Error(\"Field policy changed while under review; reopen settings.\");\n return {\n ...current,\n version: current.version === 5 ? 5 : 4,\n syncSetups: {\n ...current.syncSetups,\n [setupName]: { ...setup, sync: { ...setup.sync, localFields: fields } },\n },\n };\n }, mutationSignal);\n validate();\n saveStatus =\n \"Saved reviewed policy for this setup. Applies to subsequent sync operations; recovery evidence is retained.\";\n ctx.ui.notify(saveStatus, \"info\");\n return { kind: \"stay\" };\n } catch (error) {\n if (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n automatic: async ({ value, signal: actionSignal }) => {\n const automatic = value === \"On\";\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n try {\n const latest = await loadConfig(setupName);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n if (latest.automatic === automatic) return { kind: \"stay\" };\n await updateSyncSetup(setupName, (setup) => ({ ...setup, sync: { ...setup.sync, automatic } }), {\n signal: mutationSignal,\n });\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n ctx.ui.notify(\n `Automatic sync ${automatic ? \"enabled\" : \"disabled\"} for \u201C${safeTerminalText(setupName)}\u201D.`,\n \"info\",\n );\n return { kind: \"stay\" };\n } catch (error) {\n if (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n \"agent-mode\": async ({ value, signal: actionSignal }) => {\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n const validate = captureMutationOwner(ctx, mutationSignal);\n try {\n const saved = await saveAgentMode(ctx, setupName, value === \"On\", mutationSignal);\n if (!saved) return { kind: \"rejected\" };\n try {\n validate();\n ctx.ui.notify(\n \"Agent mode saved. Applies to subsequent sync and the next session start; no transfer started.\",\n \"info\",\n );\n } catch {\n // The save committed. A closed or replaced UI must not report a failed save.\n // The next Settings read shows the persisted value.\n }\n return { kind: \"stay\" };\n } catch (error) {\n try {\n validate();\n } catch {\n return { kind: \"rejected\" };\n }\n notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n continuous: async ({ value, signal: actionSignal }) => {\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n const validate = captureMutationOwner(ctx, mutationSignal);\n try {\n const saved = await saveContinuousMode(ctx, setupName, value === \"On\", mutationSignal);\n if (!saved) return { kind: \"rejected\" };\n try {\n validate();\n ctx.ui.notify(\n value === \"On\"\n ? \"Continuous sync enabled. Monitoring starts after the /sync command or manager closes; completed work is not undone.\"\n : \"Continuous sync disabled. Completed work is not undone.\",\n \"info\",\n );\n } catch {\n /* committed save; do not use stale UI */\n }\n return { kind: \"stay\" };\n } catch (error) {\n try {\n validate();\n } catch {\n return { kind: \"rejected\" };\n }\n notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n \"automatic-transfer\": async ({ value, signal: actionSignal }) => {\n const automaticTransfer = value === \"On\";\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n try {\n await updateSyncSetup(setupName, (setup) => ({ ...setup, sync: { ...setup.sync, automaticTransfer } }), {\n signal: mutationSignal,\n });\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n ctx.ui.notify(\n `Automatic startup transfer ${automaticTransfer ? \"enabled for the next session start\" : \"disabled\"}. Completed transfers are not undone.`,\n \"info\",\n );\n return { kind: \"stay\" };\n } catch (error) {\n if (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n \"skip-secret-scan\": async ({ value, signal: actionSignal }) => {\n const skipSecretScan = value === \"On\";\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n try {\n const latest = await loadConfig(setupName);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n if (latest.skipSecretScan === skipSecretScan) return { kind: \"stay\" };\n await updateLocalConfig((settings) => ({ ...settings, skipSecretScan }), mutationSignal);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n ctx.ui.notify(`Secret scan ${skipSecretScan ? \"disabled\" : \"enabled\"} for pushes in all setups.`, \"info\");\n return { kind: \"stay\" };\n } catch (error) {\n if (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n \"show-status\": async ({ value, signal: actionSignal }) => {\n const showStatus = value === \"On\";\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n try {\n const latest = await loadConfig(setupName);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n if (latest.showStatus === showStatus) return { kind: \"stay\" };\n await updateLocalConfig((settings) => ({ ...settings, showStatus }), mutationSignal);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n configureSyncStatus(ctx, showStatus);\n ctx.ui.notify(`Pi Sync status ${showStatus ? \"enabled\" : \"disabled\"} for all setups.`, \"info\");\n return { kind: \"stay\" };\n } catch (error) {\n if (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n debug: async ({ value, signal: actionSignal }) => {\n const debug = value === \"On\";\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n try {\n await updateLocalConfig((settings) => ({ ...settings, debug }), mutationSignal);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n return { kind: \"stay\" };\n } catch (error) {\n if (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n \"on-switch\": async ({ value, signal: actionSignal }) => {\n const action = value ? setupSwitchActionFromLabel(value) : undefined;\n if (!action) return { kind: \"rejected\" };\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n try {\n const latest = await loadConfig(setupName);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n if (latest.onSwitch === action) return { kind: \"stay\" };\n await saveOnSwitch(action, mutationSignal);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n ctx.ui.notify(`After switching setup: ${value}.`, \"info\");\n return { kind: \"stay\" };\n } catch (error) {\n if (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n include: async ({ signal: actionSignal }) => {\n const editorSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n await runRoute(\"files\", editorSignal, undefined, setupName);\n return editorSignal.aborted ? { kind: \"rejected\" } : { kind: \"stay\" };\n },\n \"remote-include\": async ({ signal: actionSignal }) => {\n const reviewSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n const { showRemoteSelectionReview } = await import(\"./remote-selection-ui.js\");\n if (reviewSignal.aborted) return { kind: \"rejected\" };\n const review = await showRemoteSelectionReview(ctx, setupName, reviewSignal, undefined, {\n origin: \"settings\",\n runRoute,\n });\n if (reviewSignal.aborted) return { kind: \"rejected\" };\n if (review.kind === \"route-result\") {\n const disposition = await dispatchManagerResult(ctx, review.result, review.route, runRoute, reviewSignal);\n return disposition.kind === \"close\" ? exitSettings() : { kind: \"stay\" };\n }\n return review.kind === \"closed\" || review.kind === \"stale\" ? exitSettings() : { kind: \"stay\" };\n },\n },\n });\n for (const id of [\n \"automatic\",\n \"automatic-transfer\",\n \"merge-settings\",\n \"skip-secret-scan\",\n \"show-status\",\n \"debug\",\n \"on-switch\",\n ] as const) {\n const save = menu.actions[id];\n menu.actions[id] = async (action) => {\n const validate = captureMutationOwner(ctx, action.signal);\n validate();\n ctx.ui.notify(\"Saving Pi Sync setting\u2026\", \"info\");\n const result = await save(action);\n if (action.signal.aborted || signal?.aborted) return { kind: \"rejected\" };\n validate();\n saveStatus =\n result?.kind === \"rejected\"\n ? \"Save failed or rejected. Previous value retained; retry is available.\"\n : id === \"automatic-transfer\" || id === \"automatic\" || id === \"debug\"\n ? \"Saved. Enabling startup work applies next session start; completed transfers are not undone.\"\n : \"Saved. Applies to subsequent operations; status visibility applies immediately.\";\n ctx.ui.notify(saveStatus, result?.kind === \"rejected\" ? \"warning\" : \"info\");\n return result;\n };\n }\n async function resumeSettings(editorSignal: AbortSignal) {\n if (editorSignal.aborted) return { kind: \"close\" as const };\n try {\n const active = await loadConfig();\n if (editorSignal.aborted || active.setupName !== setupName) return { kind: \"close\" as const };\n // Stay reloads authoritative rows without pushing a duplicate screen or clearing search.\n return { kind: \"stay\" as const };\n } catch {\n return { kind: \"close\" as const };\n }\n }\n await runMenu({ ...ctx, ui: boundedSettingsUI(ctx) }, menu, {\n getState: () => loadConfig(setupName),\n signal,\n isCurrent: () => !signal?.aborted,\n });\n return disposition;\n}\n\nfunction notifySaveFailure(ctx: ExtensionCommandContext, error: unknown) {\n ctx.ui.notify(\n `Pi Sync settings save failed: ${safeTerminalText(error instanceof Error ? error.message : String(error))}`,\n \"error\",\n );\n}\n", "import { isDeepStrictEqual } from \"node:util\";\nimport type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { requireSettings, updateLocalConfig } from \"../settings/settings-store.js\";\nimport { captureMutationOwner } from \"../sync/sync-local.js\";\nimport { confirmMergeReview } from \"./merge-review.js\";\nimport { safeTerminalText } from \"./terminal-text.js\";\n\nexport const AGENT_MODE_DESCRIPTION =\n \"This setup, experimental: one autonomous merged sync next startup and on Sync now. Sends eligible conflict text to the selected Pi model; may incur costs and replace/delete selected local and remote content without transfer prompts. No automatic reload. Unsupported conflicts pause.\";\n\nexport const CONTINUOUS_DESCRIPTION =\n \"This setup, experimental: recurring sync while Pi is open. Requires Agent mode. Watches selected files, checks the remote every 60\u201366 seconds, and retries temporary failures. Local changes and retries can cause extra requests between polls. May disclose conflict text and incur model/storage costs. No automatic reload.\";\n\nexport function saveContinuousMode(\n ctx: ExtensionCommandContext,\n setupName: string,\n enabled: boolean,\n signal?: AbortSignal,\n) {\n return saveAgentMode(ctx, setupName, enabled, signal, \"continuous\");\n}\n\nexport async function saveAgentMode(\n ctx: ExtensionCommandContext,\n setupName: string,\n enabled: boolean,\n signal?: AbortSignal,\n preference: \"agentMode\" | \"continuous\" = \"agentMode\",\n) {\n const validate = captureMutationOwner(ctx, signal);\n const settings = await requireSettings();\n validate();\n const setup = settings.syncSetups[setupName];\n if (!setup || settings.activeSyncSetup !== setupName) throw new Error(\"Current sync setup changed; reopen Settings.\");\n const continuous = preference === \"continuous\";\n const label = continuous ? \"Continuous sync\" : \"Agent mode\";\n if (enabled && continuous && !setup.sync.agentMode) throw new Error(\"Enable Agent mode before Continuous sync.\");\n if (Boolean(setup.sync[preference]) === enabled) return true;\n if (enabled) {\n const summary = [\n `Setup: ${safeTerminalText(setupName)}`,\n `Storage connection: ${safeTerminalText(setup.storage.connection)}`,\n `Storage path: ${safeTerminalText(setup.storage.path)}`,\n ...(setup.storage.bucket ? [`Bucket: ${safeTerminalText(String(setup.storage.bucket))}`] : []),\n ...(setup.storage.branch ? [`Branch: ${safeTerminalText(String(setup.storage.branch))}`] : []),\n `Included paths: ${setup.sync.include.map(safeTerminalText).join(\", \")}`,\n continuous ? CONTINUOUS_DESCRIPTION : AGENT_MODE_DESCRIPTION,\n ...(continuous\n ? [\n \"Upgrade all Pi processes sharing this agent directory before enabling Continuous sync. Monitoring starts after the /sync command or manager closes. An elected idle local session uses its selected Pi model; another session can use a different provider/model. Each computer is a separate replica.\",\n \"Automatic requests are limited to two per candidate and two per replica binding in a rolling 15-minute window, across restarts. Network/storage checks and requests may incur costs. Retries start at five seconds and grow to five minutes. These are request bounds, not a currency cap.\",\n ]\n : setup.sync.continuous\n ? [\"The saved Continuous sync preference will resume monitoring after the /sync command or manager closes.\"]\n : []),\n \"Only bounded Markdown/plain-text conflicts and atomic global settings choices are eligible. Model errors can change intended behavior. Session histories, code, deletion conflicts and path collisions are not model-resolved.\",\n \"The existing baseline, selection, secret-scan and publication checks remain. Pi Sync cannot exclude arbitrary concurrent local writers. Disabling does not undo completed transfers or provider charges. No transfer starts from Settings.\",\n ].join(\"\\n\\n\");\n if (\n !(await confirmMergeReview(\n ctx,\n `Enable experimental ${label}?`,\n summary,\n signal,\n () => !signal?.aborted,\n `Enable ${label}`,\n summary.split(\"\\n\"),\n ))\n )\n return false;\n validate();\n }\n await updateLocalConfig((current) => {\n validate();\n if (\n current.activeSyncSetup !== setupName ||\n !isDeepStrictEqual(current.syncSetups[setupName], setup) ||\n !isDeepStrictEqual(\n current.storageConnections[setup.storage.connection],\n settings.storageConnections[setup.storage.connection],\n )\n )\n throw new Error(\"Sync setup or connection changed during Agent mode review; reopen Settings.\");\n return {\n ...current,\n syncSetups: { ...current.syncSetups, [setupName]: { ...setup, sync: { ...setup.sync, [preference]: enabled } } },\n };\n }, signal);\n // The atomic writer has committed. Later cancellation cannot undo this save.\n return true;\n}\n", "import { stripVTControlCharacters } from \"node:util\";\nimport type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\n\n/** Adapt only public rendering/input boundaries; Kit still owns search, saves and focus. */\nexport function boundedSettingsUI(ctx: ExtensionCommandContext): ExtensionCommandContext[\"ui\"] {\n return {\n ...ctx.ui,\n custom: (factory, options) =>\n ctx.ui.custom((tui, ...args) => {\n // Kit pins search before the selected setting at a one-row budget. Render its\n // smallest complete frame, then retain the active row when the real budget is smaller.\n const terminal = new Proxy(tui.terminal, {\n get: (target, key) => (key === \"rows\" ? Math.max(8, target.rows) : Reflect.get(target, key)),\n });\n const screenTui = new Proxy(tui, {\n get(target, key) {\n if (key === \"terminal\") return terminal;\n const value = Reflect.get(target, key);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n const guard = <\n T extends {\n render(width: number): string[];\n handleMouse?: import(\"@earendil-works/pi-tui\").Component[\"handleMouse\"];\n },\n >(\n component: T,\n ): T => {\n const render = component.render.bind(component);\n const handleMouse = component.handleMouse?.bind(component);\n let sourceRow = 0;\n const compact = () => tui.terminal.rows < 8;\n component.render = (width) => {\n if (width <= 0) return [];\n const lines = render(width);\n if (!compact()) return lines;\n const active = lines.findIndex((line) => stripVTControlCharacters(line).startsWith(\"\u2192\"));\n const search = lines.findIndex((line) => stripVTControlCharacters(line).startsWith(\">\"));\n sourceRow = active < 0 ? Math.max(0, search) : active;\n return lines.slice(sourceRow, sourceRow + 1);\n };\n if (handleMouse)\n component.handleMouse = (event) => {\n if (event.width <= 0 || (compact() && event.y !== 0)) return undefined;\n component.render(event.width);\n return handleMouse(compact() ? { ...event, y: event.y + sourceRow } : event);\n };\n return component;\n };\n const component = factory(screenTui, ...args);\n return component instanceof Promise ? component.then(guard) : guard(component);\n }, options),\n };\n}\n", "import { isDeepStrictEqual } from \"node:util\";\nimport type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport {\n addStorageConnection,\n removeStorageConnection,\n updateStorageConnection,\n} from \"../settings/settings-management.js\";\nimport { readLocalConfigObject } from \"../settings/settings-store.js\";\nimport { isCloudflareR2Endpoint, normalizeS3Endpoint, ownRecord } from \"../settings/settings-validation.js\";\nimport { syncErrorGuidance } from \"../sync/sync-error-guidance.js\";\nimport { showAddGitStorageProfile, showEditGitStorageProfile } from \"./setup/git-ui.js\";\nimport { applyS3CredentialUpdate, chooseS3Credentials, chooseS3CredentialUpdate } from \"./setup/s3-credentials-ui.js\";\nimport { promptResourceName } from \"./setup/setup-prompts.js\";\nimport { saveReviewedDraft } from \"./setup/setup-review.js\";\nimport { requiredInput, requiredValueInput } from \"./setup/text-input.js\";\nimport { showAddWebDavStorageProfile, showEditWebDavStorageProfile } from \"./setup/webdav-ui.js\";\nimport { safeTerminalText } from \"./terminal-text.js\";\n\nexport async function showStorageConnections(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n let selectedName: string | undefined;\n const nameById = new Map<string, string>();\n type Screen = \"list\" | \"detail\";\n type Action = \"add\" | \"select\" | \"edit\" | \"remove\" | \"back\";\n const menu = defineMenu<Awaited<ReturnType<typeof loadStorageMenuState>>, Screen, Action, ExtensionCommandContext>({\n start: \"list\",\n screens: {\n list: ({ state }) => {\n nameById.clear();\n const names = Object.keys(state.profiles).sort((left, right) => left.localeCompare(right));\n return {\n kind: \"actions\",\n title: \"Storage connections\",\n lines: state.supportedVersion\n ? [\"Server addresses and sign-in details, reusable across sync setups.\"]\n : [\"Create supported pi-sync settings before managing storage connections.\"],\n items: state.supportedVersion\n ? [\n { id: \"add\", label: \"Add storage connection\", action: \"add\" as const },\n ...names.map((name, index) => {\n const id = `connection:${index}`;\n nameById.set(id, name);\n return {\n id,\n label: safeTerminalText(name),\n description: connectionSummary(ownRecord(state.profiles[name]) ?? {}),\n action: \"select\" as const,\n };\n }),\n ]\n : [],\n hint: \"back\",\n };\n },\n detail: ({ state }) => ({\n kind: \"actions\",\n title: state.selected ? `Storage connection \u201C${safeTerminalText(state.selected.name)}\u201D` : \"Storage connection\",\n lines: state.selected?.lines ?? [\"This storage connection no longer exists.\"],\n items: state.selected\n ? [\n { id: \"edit\", label: \"Edit storage connection\u2026\", action: \"edit\" },\n ...(state.selected.usedBy.length === 0\n ? [\n {\n id: \"remove\",\n label: \"Remove storage connection\u2026\",\n action: \"remove\" as const,\n },\n ]\n : []),\n { id: \"back\", label: \"Back\", action: \"back\" },\n ]\n : [{ id: \"back\", label: \"Back\", action: \"back\" }],\n hint: \"back\",\n }),\n },\n actions: {\n add: async () => {\n try {\n await showAddStorageConnection(ctx, signal);\n } catch (error) {\n if (!signal?.aborted) {\n ctx.ui.notify(`Storage connection was not added: ${syncErrorGuidance(error)}`, \"error\");\n }\n }\n return { kind: \"stay\" };\n },\n select: async ({ itemId }) => {\n selectedName = nameById.get(itemId);\n return selectedName ? { kind: \"to\", screen: \"detail\" } : { kind: \"rejected\" };\n },\n edit: async ({ state }) => {\n if (!state.selected || state.selected.name !== selectedName) return { kind: \"rejected\" };\n try {\n await editStorageConnection(ctx, state.selected.name, state.selected.profile, state.selected.usedBy, signal);\n } catch (error) {\n notifyConnectionError(ctx, state.selected.name, error, signal);\n }\n return { kind: \"stay\" };\n },\n remove: async ({ state }) => {\n if (!state.selected || state.selected.name !== selectedName) return { kind: \"rejected\" };\n const name = state.selected.name;\n const confirmed = await ctx.ui.confirm(\n \"Remove storage connection?\",\n `Remove local storage connection \u201C${safeTerminalText(name)}\u201D? Remote data and history are not deleted.`,\n { signal },\n );\n if (!confirmed || signal?.aborted) return { kind: \"rejected\" };\n try {\n await removeStorageConnection(name, signal);\n ctx.ui.notify(`Removed storage connection \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n selectedName = undefined;\n return { kind: \"back\" };\n } catch (error) {\n notifyConnectionError(ctx, name, error, signal);\n return { kind: \"stay\" };\n }\n },\n back: async () => {\n selectedName = undefined;\n return { kind: \"back\" };\n },\n },\n });\n await runMenu(ctx, menu, {\n getState: () => loadStorageMenuState(selectedName, signal),\n signal,\n isCurrent: () => !signal?.aborted,\n });\n}\n\nasync function loadStorageMenuState(selectedName: string | undefined, signal?: AbortSignal) {\n const raw = await readLocalConfigObject();\n if (signal?.aborted) throw signal.reason;\n const profiles = ownRecord(raw?.storageConnections) ?? {};\n const profile = selectedName ? ownRecord(profiles[selectedName]) : undefined;\n if (!selectedName || !profile) {\n return {\n supportedVersion: raw?.version === 3 || raw?.version === 4 || raw?.version === 5,\n profiles,\n selected: undefined,\n };\n }\n const usedBy = referencingSetups(raw, selectedName);\n return {\n supportedVersion: raw?.version === 3 || raw?.version === 4 || raw?.version === 5,\n profiles,\n selected: {\n name: selectedName,\n profile,\n usedBy,\n lines: [\n `Type: ${connectionType(profile)}`,\n `Endpoint: ${connectionEndpoint(profile)}`,\n `Credentials: ${credentialSource(profile)}`,\n `Used by: ${usedBy.length > 0 ? usedBy.map(safeTerminalText).join(\", \") : \"No sync setups\"}`,\n ...(usedBy.length > 0\n ? [\n \"Remove unavailable: remove the listed sync setups first. Switch away from a current setup before removing it if other setups remain.\",\n ]\n : []),\n ],\n },\n };\n}\n\nfunction notifyConnectionError(ctx: ExtensionCommandContext, name: string, error: unknown, signal?: AbortSignal) {\n if (signal?.aborted) return;\n ctx.ui.notify(`Storage connection \u201C${safeTerminalText(name)}\u201D was not changed: ${syncErrorGuidance(error)}`, \"error\");\n}\n\nasync function editStorageConnection(\n ctx: ExtensionCommandContext,\n name: string,\n profile: Record<string, unknown>,\n usedBy: string[],\n signal?: AbortSignal,\n) {\n if (ctx.mode !== \"tui\") {\n ctx.ui.notify(\n \"Editing storage connections requires TUI mode for safe credential handling. Edit the private pi-sync settings file instead.\",\n \"warning\",\n );\n return;\n }\n if (profile.type === \"webdav\") {\n await showEditWebDavStorageProfile(\n ctx,\n name,\n { ...profile, kind: \"webdav\", ...(ownRecord(profile.credentials) ?? {}) },\n signal,\n usedBy,\n );\n return;\n }\n if (profile.type === \"git\") {\n await showEditGitStorageProfile(ctx, name, { ...profile, kind: \"git\" }, signal, usedBy);\n return;\n }\n const endpoint = await requiredInput(\n ctx,\n \"Endpoint\",\n String(profile.endpoint ?? \"https://s3.example.com\"),\n signal,\n normalizeS3Endpoint,\n );\n if (!endpoint || signal?.aborted) return;\n const region = await requiredInput(\n ctx,\n \"Region\\n\\nUse your bucket's region; Cloudflare R2 uses auto.\",\n String(profile.region ?? \"auto\"),\n signal,\n );\n if (!region || signal?.aborted) return;\n const storedCredentials = ownRecord(profile.credentials) ?? {};\n const credentials = await chooseS3CredentialUpdate(ctx, { ...profile, ...storedCredentials }, signal);\n if (!credentials || signal?.aborted) return;\n const saved = await saveReviewedDraft(\n ctx,\n \"Review storage connection\",\n [\n `Storage connection: ${safeTerminalText(name)}`,\n `Endpoint: ${safeTerminalText(String(profile.endpoint ?? \"missing\"))} \u2192 ${safeTerminalText(endpoint)}`,\n `Region: ${safeTerminalText(String(profile.region ?? \"auto\"))} \u2192 ${safeTerminalText(region)}`,\n `Credentials: ${safeTerminalText(credentials.summary)}`,\n `Affected sync setups: ${usedBy.length > 0 ? usedBy.map(safeTerminalText).join(\", \") : \"None\"}`,\n \"Saving changes future storage access for every affected setup; it does not move remote data.\",\n ],\n \"Save storage connection\",\n (saveSignal) =>\n updateStorageConnection(\n name,\n (current) => {\n if (current.type !== \"s3\" || !isDeepStrictEqual(current, profile)) {\n throw new Error(\"Storage connection changed while it was open; reopen it.\");\n }\n return {\n ...current,\n endpoint,\n region,\n credentials: applyS3CredentialUpdate(current.credentials, credentials) as typeof current.credentials,\n };\n },\n usedBy,\n saveSignal,\n ),\n signal,\n );\n if (!saved || signal?.aborted) return;\n ctx.ui.notify(`Saved storage connection \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n}\n\nexport async function showAddStorageConnection(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n if (ctx.mode !== \"tui\") {\n ctx.ui.notify(\n \"Adding storage connections requires TUI mode for safe credential handling. Edit the private pi-sync settings file instead.\",\n \"warning\",\n );\n return false;\n }\n const preset = await ctx.ui.select(\n \"Storage type\",\n [\"Cloudflare R2\", \"Other S3-compatible storage\", \"WebDAV\", \"Git\", \"Cancel\"],\n { signal },\n );\n if (signal?.aborted || !preset || preset === \"Cancel\") return false;\n if (preset === \"WebDAV\") return showAddWebDavStorageProfile(ctx, signal);\n if (preset === \"Git\") return showAddGitStorageProfile(ctx, signal);\n const name = await promptResourceName(ctx, \"storage connection\", preset === \"Cloudflare R2\" ? \"r2\" : \"s3\", signal);\n if (!name || signal?.aborted) return false;\n const endpoint = await requiredValueInput(\n ctx,\n \"S3 API endpoint\\n\\nUse the API URL from your storage provider, not its web console.\",\n preset === \"Cloudflare R2\" ? \"https://<account-id>.r2.cloudflarestorage.com\" : \"https://s3.example.com\",\n signal,\n normalizeS3Endpoint,\n );\n if (!endpoint || signal?.aborted) return false;\n const region =\n preset === \"Cloudflare R2\"\n ? \"auto\"\n : await requiredInput(\n ctx,\n \"Region\\n\\nUse the region assigned to your bucket by the provider.\",\n \"us-east-1\",\n signal,\n );\n if (!region || signal?.aborted) return false;\n const credentials = await chooseS3Credentials(ctx, signal);\n if (!credentials || signal?.aborted) return false;\n const saved = await saveReviewedDraft(\n ctx,\n \"Review storage connection\",\n [\n `Name: ${safeTerminalText(name)}`,\n `Type: ${preset}`,\n `Endpoint: ${safeTerminalText(endpoint)}`,\n `Region: ${safeTerminalText(region)}`,\n `Credentials: ${safeTerminalText(credentials.summary)}`,\n \"Adding a connection does not contact remote storage or start syncing.\",\n ],\n \"Add storage connection\",\n (saveSignal) =>\n addStorageConnection(\n name,\n {\n type: \"s3\",\n endpoint,\n region,\n credentials: {\n accessKeyId: credentials.profileFields.accessKeyId ?? \"\",\n secretAccessKey: credentials.profileFields.secretAccessKey ?? \"\",\n },\n },\n saveSignal,\n ),\n signal,\n );\n if (!saved) return false;\n if (signal?.aborted) return true;\n ctx.ui.notify(`Added storage connection \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n return true;\n}\n\nfunction referencingSetups(raw: Record<string, unknown> | undefined, connection: string) {\n return Object.entries(ownRecord(raw?.syncSetups) ?? {})\n .filter(([, value]) => ownRecord(ownRecord(value)?.storage)?.connection === connection)\n .map(([name]) => name)\n .sort((left, right) => left.localeCompare(right));\n}\n\nexport function connectionSummary(profile: Record<string, unknown>) {\n return `${connectionType(profile)} \u00B7 ${connectionEndpoint(profile)}`;\n}\n\nfunction connectionType(profile: Record<string, unknown>) {\n if (profile.type === \"git\") return \"Git\";\n if (profile.type === \"webdav\") return \"WebDAV\";\n if (profile.type === \"s3\" && typeof profile.endpoint === \"string\" && isCloudflareR2Endpoint(profile.endpoint)) {\n return \"Cloudflare R2\";\n }\n return \"S3-compatible\";\n}\n\nfunction connectionEndpoint(profile: Record<string, unknown>) {\n const value = profile.type === \"git\" ? profile.remote : profile.type === \"webdav\" ? profile.url : profile.endpoint;\n if (typeof value !== \"string\" || value.length === 0) return \"Missing\";\n if (profile.type === \"git\") return safeTerminalText(value);\n try {\n const url = new URL(value);\n return safeTerminalText(`${url.origin}${url.pathname}`);\n } catch {\n return \"Invalid\";\n }\n}\n\nfunction credentialSource(profile: Record<string, unknown>) {\n if (profile.type === \"git\") return \"Git credential helper or SSH configuration\";\n const credentials = ownRecord(profile.credentials);\n if (profile.type === \"webdav\") return credentials?.password ? \"Settings file\" : \"Missing\";\n if (credentials?.accessKeyId && credentials.secretAccessKey) return \"Settings file\";\n return \"Missing\";\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport { loadConfig, syncConfigReviewIdentity } from \"../../settings/config.js\";\nimport { loadOnSwitch, readLocalConfigObject } from \"../../settings/settings-store.js\";\nimport type { AnySyncConfig } from \"../../settings/settings-types.js\";\nimport { ownRecord } from \"../../settings/settings-validation.js\";\nimport { useSyncSetup } from \"../../sync/setup-switch.js\";\nimport { errorMessage } from \"../../sync/sync-errors.js\";\nimport { automaticSyncSummary } from \"../automatic-sync-summary.js\";\nimport { type RunRoute, runCancellableOperation } from \"../cancellable-operation.js\";\nimport { dispatchManagerResult } from \"../manager-result-dispatcher.js\";\nimport { backendStorageDescription } from \"../manager-state.js\";\nimport { safeTerminalText } from \"../terminal-text.js\";\n\nasync function selectSetupForSwitch(\n ctx: ExtensionCommandContext,\n raw: Record<string, unknown>,\n targets: Record<string, unknown>,\n active: string | undefined,\n signal?: AbortSignal,\n) {\n let selectedName: string | undefined;\n const nameById = new Map<string, string>();\n const profiles = ownRecord(raw.storageConnections);\n const menu = defineMenu<undefined, \"setups\", \"select\", ExtensionCommandContext>({\n start: \"setups\",\n screens: {\n setups: () => ({\n kind: \"actions\",\n title: \"Switch sync setup\",\n lines: [`Current sync setup: ${safeTerminalText(active ?? \"none\")}`],\n items: Object.keys(targets)\n .sort((left, right) => left.localeCompare(right))\n .map((candidate, index) => {\n const target = ownRecord(targets[candidate]);\n const storage = ownRecord(target?.storage);\n const profileName = typeof storage?.connection === \"string\" ? storage.connection : undefined;\n const profile = profileName && profiles ? ownRecord(profiles[profileName]) : undefined;\n const location = profile\n ? profile.type === \"git\"\n ? `${String(storage?.branch ?? \"missing branch\")}:${String(storage?.path ?? \"missing path\")}`\n : profile.type === \"s3\"\n ? `${String(storage?.bucket ?? \"missing bucket\")}/${String(storage?.path ?? \"missing path\")}`\n : String(storage?.path ?? \"missing path\")\n : `invalid: missing connection ${profileName ?? \"reference\"}`;\n const id = `setup:${index}`;\n nameById.set(id, candidate);\n return {\n id,\n label: `${safeTerminalText(candidate)}${candidate === active ? \" (current)\" : \"\"}`,\n description: `${safeTerminalText(profileName ?? \"unknown\")} \u00B7 ${safeTerminalText(location)}`,\n action: \"select\" as const,\n };\n }),\n hint: \"close\",\n }),\n },\n actions: {\n select: async ({ itemId }) => {\n selectedName = nameById.get(itemId);\n return { kind: \"close\" };\n },\n },\n });\n await runMenu(ctx, menu, {\n getState: () => undefined,\n signal,\n isCurrent: () => !signal?.aborted,\n });\n return selectedName;\n}\n\nexport async function showSetupSwitcher(\n ctx: ExtensionCommandContext,\n runRoute: RunRoute,\n selectedName?: string,\n signal?: AbortSignal,\n) {\n const raw = await readLocalConfigObject();\n if (signal?.aborted) return false;\n if (raw?.version !== 3 && raw?.version !== 4 && raw?.version !== 5) {\n ctx.ui.notify(\"Add a second sync setup before switching setups.\", \"info\");\n return false;\n }\n const targets = ownRecord(raw.syncSetups);\n if (!targets) {\n ctx.ui.notify(\"No sync setups are configured.\", \"warning\");\n return false;\n }\n const active = typeof raw.activeSyncSetup === \"string\" ? raw.activeSyncSetup : undefined;\n let name = selectedName;\n if (!name) {\n name = await selectSetupForSwitch(ctx, raw, targets, active, signal);\n if (!name) return false;\n }\n if (!name || !Object.hasOwn(targets, name)) {\n ctx.ui.notify(`Sync setup \u201C${safeTerminalText(name ?? \"unknown\")}\u201D no longer exists.`, \"warning\");\n return false;\n }\n if (name === active) {\n ctx.ui.notify(`Sync setup \u201C${safeTerminalText(name)}\u201D is already current.`, \"info\");\n return false;\n }\n let config: AnySyncConfig;\n try {\n config = await loadConfig(name);\n if (signal?.aborted) return false;\n } catch (error) {\n ctx.ui.notify(\n `Cannot use sync setup \u201C${safeTerminalText(name)}\u201D: ${safeTerminalText(errorMessage(error))}`,\n \"error\",\n );\n return false;\n }\n const onSwitch = await loadOnSwitch();\n if (signal?.aborted) return false;\n const switchEffect =\n onSwitch === \"ask-before-pull\"\n ? \"After switching, pi-sync will ask whether to review a pull for this setup.\"\n : onSwitch === \"pull-after-switch\"\n ? \"After switching, pi-sync will check this setup and show exact changes before applying them.\"\n : \"After switching, pi-sync will not pull or modify synced files.\";\n const confirmed = await ctx.ui.confirm(\n \"Switch sync setup?\",\n [\n `From: ${safeTerminalText(active ?? \"none\")}`,\n `To: ${safeTerminalText(name)}`,\n `Storage: ${backendStorageDescription(config)}`,\n `Included content: ${config.include.length} paths`,\n `Automatic sync: ${automaticSyncSummary(config.automatic)} \u00B7 Sessions: ${config.include.includes(\"sessions\") ? \"On\" : \"Off\"}`,\n `Automatic transfer at startup: ${config.automaticTransfer ? \"On \u2014 may upload, replace, or delete selected files; no reload\" : \"Off\"}`,\n `Agent mode: ${config.agentMode ? \"On (experimental; autonomous merged sync)\" : \"Off\"}`,\n `Continuous sync: ${config.continuous ? (config.agentMode ? \"On (experimental; recurring requests and transfers)\" : \"Saved On; paused until Agent mode is enabled\") : \"Off\"}`,\n \"\",\n switchEffect,\n ].join(\"\\n\"),\n { signal },\n );\n if (signal?.aborted || !confirmed) return false;\n try {\n let pullClosed = false;\n const result = await useSyncSetup(\n ctx,\n name,\n async (selectedTarget) => {\n const pullResult = await runCancellableOperation(\n ctx,\n `Pulling sync setup \u201C${safeTerminalText(name)}\u201D\u2026`,\n \"pull\",\n runRoute,\n {\n commitAware: true,\n cancelledMessage: null,\n target: selectedTarget,\n signal,\n },\n );\n const disposition = await dispatchManagerResult(ctx, pullResult, \"pull\", runRoute, signal);\n if (pullResult.kind === \"closed\" || pullResult.kind.endsWith(\"required\")) {\n pullClosed = disposition.kind === \"close\";\n }\n if (disposition.appliedRoute === \"pull\") return \"applied\";\n if (pullResult.kind === \"completed\") return pullResult.outcome;\n return pullResult.kind === \"cancelled\" ? \"cancelled\" : undefined;\n },\n onSwitch,\n signal,\n syncConfigReviewIdentity(config),\n );\n if (pullClosed) return \"closed\";\n return result.pullApplied ? \"pull-attempted\" : \"switched\";\n } catch (error) {\n if (signal?.aborted) return false;\n ctx.ui.notify(\n `Sync setup \u201C${safeTerminalText(name)}\u201D was not switched: ${safeTerminalText(errorMessage(error))}`,\n \"error\",\n );\n return false;\n }\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { refreshTargetCompletions } from \"../../commands/setup-completions.js\";\nimport { loadPartialConfig } from \"../../settings/config.js\";\nimport { removeSyncSetup } from \"../../settings/settings-management.js\";\nimport { readLocalConfigObject } from \"../../settings/settings-store.js\";\nimport { ownRecord } from \"../../settings/settings-validation.js\";\nimport type { RunRoute } from \"../cancellable-operation.js\";\nimport { showAddStorageConnection } from \"../storage-connections-ui.js\";\nimport { showSyncSetups } from \"../sync-setups-ui.js\";\nimport { safeTerminalText } from \"../terminal-text.js\";\nimport { showAddGitTarget, showEditGitTarget } from \"./git-ui.js\";\nimport { showAddS3Target, showEditS3Target } from \"./s3-ui.js\";\nimport { promptResourceName } from \"./setup-prompts.js\";\nimport { showSetupSwitcher } from \"./setup-switcher.js\";\nimport { showAddWebDavTarget, showEditWebDavTarget } from \"./webdav-ui.js\";\n\nexport async function showSyncSetupManager(ctx: ExtensionCommandContext, runRoute: RunRoute, signal?: AbortSignal) {\n return showSyncSetups(\n ctx,\n {\n add: async (setupSignal) => {\n await showAddTarget(ctx, setupSignal);\n },\n edit: async (name, setupSignal) => {\n await showEditSyncSetupStorage(ctx, name, setupSignal);\n },\n makeCurrent: async (name, setupSignal) => {\n const result = await showSetupSwitcher(ctx, runRoute, name, setupSignal);\n return result === \"pull-attempted\" || result === \"closed\" ? \"exit\" : undefined;\n },\n remove: async (name, setupSignal) => {\n await showRemoveTarget(ctx, name, setupSignal);\n },\n },\n signal,\n );\n}\n\nasync function showAddTarget(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n let raw = await readLocalConfigObject();\n if (signal?.aborted) return;\n if (!raw) return void ctx.ui.notify(\"Set up the first sync setup before adding another.\", \"info\");\n if (raw.version !== 3 && raw.version !== 4 && raw.version !== 5) {\n ctx.ui.notify(\"Version 1 and version 2 settings are unsupported and are never migrated.\", \"error\");\n return;\n }\n let profiles = ownRecord(raw.storageConnections) ?? {};\n const name = await promptResourceName(ctx, \"sync setup\", \"work\", signal);\n if (!name) return;\n const createConnection = \"Add a new storage connection\u2026\";\n let profile = await ctx.ui.select(\n \"Choose a storage connection\\n\\nReuse a server address and sign-in details. A new connection is saved separately and remains if you cancel this setup.\",\n [...Object.keys(profiles).sort(), createConnection, \"Cancel\"],\n { signal },\n );\n if (signal?.aborted || !profile || profile === \"Cancel\") return;\n if (profile === createConnection) {\n const previousNames = new Set(Object.keys(profiles));\n if (!(await showAddStorageConnection(ctx, signal))) return;\n if (signal?.aborted) return;\n raw = (await readLocalConfigObject()) ?? raw;\n if (signal?.aborted) return;\n profiles = ownRecord(raw.storageConnections) ?? {};\n profile = Object.keys(profiles).find((candidate) => !previousNames.has(candidate));\n if (!profile) return;\n ctx.ui.notify(\n `Connection \u201C${safeTerminalText(profile)}\u201D saved. Cancelling setup will keep this connection.`,\n \"info\",\n );\n }\n const storageKind = ownRecord(profiles[profile])?.type;\n if (storageKind === \"webdav\") {\n const saved = await showAddWebDavTarget(ctx, name, profile, signal);\n if (signal?.aborted) return;\n if (saved) await refreshTargetCompletions();\n return;\n }\n if (storageKind === \"git\") {\n const saved = await showAddGitTarget(ctx, name, profile, signal);\n if (signal?.aborted) return;\n if (saved) await refreshTargetCompletions();\n return;\n }\n await showAddS3Target(ctx, raw, profile, name, signal);\n}\n\nexport async function showEditSyncSetupStorage(ctx: ExtensionCommandContext, name: string, signal?: AbortSignal) {\n const partial = await loadPartialConfig(name);\n if (signal?.aborted) return;\n if (!partial.setupName) {\n ctx.ui.notify(\"Create supported pi-sync settings before editing a named sync setup.\", \"info\");\n return;\n }\n if (partial.storageKind === \"webdav\") {\n await showEditWebDavTarget(ctx, partial, signal);\n return;\n }\n if (partial.storageKind === \"git\") {\n await showEditGitTarget(ctx, partial, signal);\n return;\n }\n await showEditS3Target(ctx, partial, signal);\n}\n\nasync function showRemoveTarget(ctx: ExtensionCommandContext, name: string, signal?: AbortSignal) {\n const confirmed = await ctx.ui.confirm(\n \"Remove sync setup?\",\n `Remove local sync setup \u201C${safeTerminalText(name)}\u201D? Remote data and history are not deleted.`,\n { signal },\n );\n if (signal?.aborted || !confirmed) return;\n await removeSyncSetup(name, signal);\n if (signal?.aborted) return;\n await refreshTargetCompletions();\n if (signal?.aborted) return;\n ctx.ui.notify(`Removed sync setup \u201C${safeTerminalText(name)}\u201D; remote data was not deleted.`, \"info\");\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["defineMenu", "runMenu", "defineMenu", "runMenu", "component", "isDeepStrictEqual", "defineMenu", "runMenu", "defineMenu", "runMenu", "isDeepStrictEqual", "defineMenu", "runMenu", "defineMenu", "runMenu", "defineMenu", "runMenu", "disposition", "defineMenu", "component", "runMenu"]
|
|
7
|
-
}
|