@narumitw/pi-sync 0.54.2 → 0.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -15
- package/dist/chunks/agent-candidate-3JN6DJKT.ts +26 -0
- package/dist/chunks/agent-plan-QCUJWBP4.ts +99 -0
- package/dist/chunks/agent-plan-QCUJWBP4.ts.map +7 -0
- package/dist/chunks/agent-runner-E2JU2VZ6.ts +182 -0
- package/dist/chunks/agent-runner-E2JU2VZ6.ts.map +7 -0
- package/dist/chunks/agent-store-A3F6IYWZ.ts +152 -0
- package/dist/chunks/agent-store-A3F6IYWZ.ts.map +7 -0
- package/dist/chunks/chunk-5Q5SSKNG.ts +128 -0
- package/dist/chunks/chunk-5Q5SSKNG.ts.map +7 -0
- package/dist/chunks/chunk-5XZOC7FD.ts +215 -0
- package/dist/chunks/chunk-5XZOC7FD.ts.map +7 -0
- package/dist/chunks/{chunk-IJ6VV6FN.ts → chunk-AAEEHR7H.ts} +31 -87
- package/dist/chunks/chunk-AAEEHR7H.ts.map +7 -0
- package/dist/chunks/{chunk-CHSIAC4N.ts → chunk-B4QZBDBT.ts} +2 -2
- package/dist/chunks/{chunk-CL7BZRRQ.ts → chunk-CRKTAPSL.ts} +8 -8
- package/dist/chunks/chunk-DT7M4VQS.ts +69 -0
- package/dist/chunks/chunk-DT7M4VQS.ts.map +7 -0
- package/dist/chunks/chunk-ED3TYIVW.ts +229 -0
- package/dist/chunks/chunk-ED3TYIVW.ts.map +7 -0
- package/dist/chunks/{chunk-VHXBCEVF.ts → chunk-EUMINX7L.ts} +6 -6
- package/dist/chunks/chunk-FQOSHGJ7.ts +215 -0
- package/dist/chunks/chunk-FQOSHGJ7.ts.map +7 -0
- package/dist/chunks/chunk-GNH73BJ5.ts +153 -0
- package/dist/chunks/chunk-GNH73BJ5.ts.map +7 -0
- package/dist/chunks/{chunk-UQ3ALBIB.ts → chunk-GP5DU62N.ts} +8 -9
- package/dist/chunks/chunk-GP5DU62N.ts.map +7 -0
- package/dist/chunks/{chunk-5RZPINUQ.ts → chunk-GSNPASKB.ts} +2 -2
- package/dist/chunks/{chunk-QE7NZZWT.ts → chunk-IWZH5KYS.ts} +23 -7
- package/dist/chunks/chunk-IWZH5KYS.ts.map +7 -0
- package/dist/chunks/{chunk-5ZWQ33XL.ts → chunk-JJTARUSO.ts} +15 -14
- package/dist/chunks/chunk-JJTARUSO.ts.map +7 -0
- package/dist/chunks/{chunk-2DI6PDZV.ts → chunk-NLWS55B6.ts} +15 -2
- package/dist/chunks/chunk-NLWS55B6.ts.map +7 -0
- package/dist/chunks/{chunk-SDZCTCYQ.ts → chunk-OEWQVWLC.ts} +4 -4
- package/dist/chunks/{chunk-MYPSMJHJ.ts → chunk-OTZRCKYP.ts} +380 -510
- package/dist/chunks/chunk-OTZRCKYP.ts.map +7 -0
- package/dist/chunks/{chunk-WFKUKVCP.ts → chunk-OWBAZA6J.ts} +24 -12
- package/dist/chunks/chunk-OWBAZA6J.ts.map +7 -0
- package/dist/chunks/chunk-PRUEIIK7.ts +24 -0
- package/dist/chunks/chunk-PRUEIIK7.ts.map +7 -0
- package/dist/chunks/chunk-QGK445K7.ts +21 -0
- package/dist/chunks/chunk-QGK445K7.ts.map +7 -0
- package/dist/chunks/{chunk-3B4Z2SKV.ts → chunk-QO333NM4.ts} +49 -21
- package/dist/chunks/chunk-QO333NM4.ts.map +7 -0
- package/dist/chunks/{chunk-4SBTAVFL.ts → chunk-QSHMOL3I.ts} +22 -24
- package/dist/chunks/chunk-QSHMOL3I.ts.map +7 -0
- package/dist/chunks/chunk-S2FMH5FT.ts +97 -0
- package/dist/chunks/chunk-S2FMH5FT.ts.map +7 -0
- package/dist/chunks/{chunk-BVVP33U5.ts → chunk-SWRVXVFD.ts} +12 -9
- package/dist/chunks/chunk-SWRVXVFD.ts.map +7 -0
- package/dist/chunks/{chunk-ZX2Q6THB.ts → chunk-UBV24CG4.ts} +4 -5
- package/dist/chunks/chunk-UBV24CG4.ts.map +7 -0
- package/dist/chunks/chunk-UOHR7LRO.ts +70 -0
- package/dist/chunks/chunk-UOHR7LRO.ts.map +7 -0
- package/dist/chunks/{chunk-4QVPTIZB.ts → chunk-UPNVIUBN.ts} +3 -3
- package/dist/chunks/chunk-UZPMDLTL.ts +54 -0
- package/dist/chunks/chunk-UZPMDLTL.ts.map +7 -0
- package/dist/chunks/chunk-VJN7KU4J.ts +350 -0
- package/dist/chunks/chunk-VJN7KU4J.ts.map +7 -0
- package/dist/chunks/chunk-YHT4YTYG.ts +31 -0
- package/dist/chunks/chunk-YHT4YTYG.ts.map +7 -0
- package/dist/chunks/{chunk-V6VZ5TLG.ts → chunk-YK52VDXG.ts} +6 -5
- package/dist/chunks/chunk-YK52VDXG.ts.map +7 -0
- package/dist/chunks/config-KGIYTTXQ.ts +37 -0
- package/dist/chunks/{conflict-artifacts-BB2FZMIE.ts → conflict-artifacts-FXFIIBCB.ts} +8 -7
- package/dist/chunks/{conflict-review-4PLVLMRO.ts → conflict-review-6WIEQLXW.ts} +31 -24
- package/dist/chunks/{conflict-review-4PLVLMRO.ts.map → conflict-review-6WIEQLXW.ts.map} +1 -1
- package/dist/chunks/continuous-record-LFRVXQBD.ts +30 -0
- package/dist/chunks/continuous-sync-AWAAOXK2.ts +545 -0
- package/dist/chunks/continuous-sync-AWAAOXK2.ts.map +7 -0
- package/dist/chunks/{file-selection-WZX7HAY2.ts → file-selection-3JJYOVNR.ts} +5 -5
- package/dist/chunks/{git-backend-FD7AVSK6.ts → git-backend-KYDZ673X.ts} +28 -32
- package/dist/chunks/git-backend-KYDZ673X.ts.map +7 -0
- package/dist/chunks/{manager-result-dispatcher-6MQKFCWB.ts → manager-result-dispatcher-AGBBVDDS.ts} +10 -9
- package/dist/chunks/{manager-ui-IURS4WXY.ts → manager-ui-KRAW3NE2.ts} +464 -164
- package/dist/chunks/manager-ui-KRAW3NE2.ts.map +7 -0
- package/dist/chunks/{merge-baseline-store-EVQAAML6.ts → merge-baseline-store-RFCAH7KL.ts} +7 -5
- package/dist/chunks/{remote-selection-ui-6LJJ4IMQ.ts → remote-selection-ui-5725JDNC.ts} +9 -8
- package/dist/chunks/remote-selection-ui-5725JDNC.ts.map +7 -0
- package/dist/chunks/{s3-backend-AQGV6LFT.ts → s3-backend-Y7WSCLJI.ts} +38 -38
- package/dist/chunks/s3-backend-Y7WSCLJI.ts.map +7 -0
- package/dist/chunks/{setup-switch-KTUWL6DE.ts → setup-switch-E7PHKI6J.ts} +7 -6
- package/dist/chunks/setup-switch-E7PHKI6J.ts.map +7 -0
- package/dist/chunks/{setup-wizard-GSDPDFC4.ts → setup-wizard-65DROCIJ.ts} +14 -13
- package/dist/chunks/setup-wizard-65DROCIJ.ts.map +7 -0
- package/dist/chunks/{sync-inspection-K45QVLHB.ts → sync-inspection-XFJOAMJD.ts} +9 -8
- package/dist/chunks/sync-inspection-XFJOAMJD.ts.map +7 -0
- package/dist/chunks/{sync-operations-47OUX76C.ts → sync-operations-HDUDT5PD.ts} +188 -73
- package/dist/chunks/sync-operations-HDUDT5PD.ts.map +7 -0
- package/dist/chunks/{webdav-backend-TBILVEQK.ts → webdav-backend-6K26F6LT.ts} +39 -48
- package/dist/chunks/webdav-backend-6K26F6LT.ts.map +7 -0
- package/dist/index.ts +246 -131
- package/dist/index.ts.map +3 -3
- package/docs/agent-mode-verification.md +99 -0
- package/docs/continuous-sync-verification.md +87 -0
- package/docs/settings.md +131 -11
- package/docs/tui-contract.md +61 -0
- package/package.json +3 -2
- package/src/backends/git/git-backend.ts +1 -4
- package/src/backends/git/git-runner.ts +1 -5
- package/src/backends/s3/s3-backend.ts +3 -25
- package/src/backends/s3/s3-client.ts +14 -2
- package/src/backends/snapshot-pointer.ts +27 -0
- package/src/backends/webdav/webdav-backend.ts +3 -29
- package/src/backends/webdav/webdav-client.ts +11 -7
- package/src/commands/command-execution.ts +7 -3
- package/src/commands/command-handler.ts +15 -3
- package/src/commands/command-types.ts +10 -0
- package/src/commands/command.ts +4 -1
- package/src/settings/config.ts +20 -10
- package/src/settings/settings-store.ts +1 -34
- package/src/settings/settings-types.ts +10 -0
- package/src/settings/settings-validation.ts +4 -1
- package/src/snapshot/snapshot-codec.ts +1 -5
- package/src/state/lock.ts +13 -10
- package/src/state/merge-baseline-store.ts +19 -1
- package/src/state/state-directory.ts +8 -1
- package/src/sync/agent-candidate.ts +251 -0
- package/src/sync/agent-plan.ts +87 -0
- package/src/sync/agent-policy.ts +13 -0
- package/src/sync/agent-request.ts +17 -0
- package/src/sync/agent-runner.ts +188 -0
- package/src/sync/agent-store.ts +151 -0
- package/src/sync/agent-sync.ts +91 -0
- package/src/sync/apply-review.ts +63 -0
- package/src/sync/automatic-sync.ts +46 -33
- package/src/sync/continuous-errors.ts +85 -0
- package/src/sync/continuous-lease.ts +221 -0
- package/src/sync/continuous-record.ts +179 -0
- package/src/sync/continuous-storage.ts +55 -0
- package/src/sync/continuous-sync.ts +516 -0
- package/src/sync/continuous-watch.ts +59 -0
- package/src/sync/merged-sync.ts +268 -112
- package/src/sync/remote-snapshot.ts +2 -3
- package/src/sync/settings-merge.ts +19 -3
- package/src/sync/setup-switch.ts +1 -5
- package/src/sync/startup-check.ts +51 -29
- package/src/sync/startup-timings.ts +90 -0
- package/src/sync/sync-inspection.ts +16 -5
- package/src/sync/sync-mutations.ts +55 -28
- package/src/sync/sync-queries.ts +19 -3
- package/src/sync/text-merge.ts +3 -3
- package/src/sync-extension.ts +75 -19
- package/src/ui/agent-mode-setting.ts +91 -0
- package/src/ui/manager-state.ts +12 -6
- package/src/ui/manager-ui.ts +57 -7
- package/src/ui/merge-review.ts +3 -3
- package/src/ui/merged-sync-summary.ts +2 -18
- package/src/ui/remote-selection-ui.ts +5 -5
- package/src/ui/settings-frame.ts +55 -0
- package/src/ui/settings-ui.ts +223 -43
- package/src/ui/setup/s3-credentials-ui.ts +1 -5
- package/src/ui/setup/setup-name-ui.ts +2 -5
- package/src/ui/setup/setup-prompts.ts +4 -3
- package/src/ui/setup/setup-switcher.ts +2 -0
- package/src/ui/sync-behavior.ts +15 -0
- package/src/ui/sync-format.ts +69 -38
- package/src/ui/sync-setups-ui.ts +3 -5
- package/src/ui/transfer-changes.ts +33 -0
- package/src/ui/transfer-review.ts +27 -0
- package/dist/chunks/chunk-2DI6PDZV.ts.map +0 -7
- package/dist/chunks/chunk-3B4Z2SKV.ts.map +0 -7
- package/dist/chunks/chunk-4SBTAVFL.ts.map +0 -7
- package/dist/chunks/chunk-5ZWQ33XL.ts.map +0 -7
- package/dist/chunks/chunk-BVVP33U5.ts.map +0 -7
- package/dist/chunks/chunk-IJ6VV6FN.ts.map +0 -7
- package/dist/chunks/chunk-MYPSMJHJ.ts.map +0 -7
- package/dist/chunks/chunk-ORQRHEEO.ts +0 -362
- package/dist/chunks/chunk-ORQRHEEO.ts.map +0 -7
- package/dist/chunks/chunk-QE7NZZWT.ts.map +0 -7
- package/dist/chunks/chunk-UQ3ALBIB.ts.map +0 -7
- package/dist/chunks/chunk-V6VZ5TLG.ts.map +0 -7
- package/dist/chunks/chunk-WFKUKVCP.ts.map +0 -7
- package/dist/chunks/chunk-ZX2Q6THB.ts.map +0 -7
- package/dist/chunks/git-backend-FD7AVSK6.ts.map +0 -7
- package/dist/chunks/manager-ui-IURS4WXY.ts.map +0 -7
- package/dist/chunks/s3-backend-AQGV6LFT.ts.map +0 -7
- package/dist/chunks/setup-wizard-GSDPDFC4.ts.map +0 -7
- package/dist/chunks/sync-operations-47OUX76C.ts.map +0 -7
- package/dist/chunks/webdav-backend-TBILVEQK.ts.map +0 -7
- /package/dist/chunks/{conflict-artifacts-BB2FZMIE.ts.map → agent-candidate-3JN6DJKT.ts.map} +0 -0
- /package/dist/chunks/{chunk-CHSIAC4N.ts.map → chunk-B4QZBDBT.ts.map} +0 -0
- /package/dist/chunks/{chunk-CL7BZRRQ.ts.map → chunk-CRKTAPSL.ts.map} +0 -0
- /package/dist/chunks/{chunk-VHXBCEVF.ts.map → chunk-EUMINX7L.ts.map} +0 -0
- /package/dist/chunks/{chunk-5RZPINUQ.ts.map → chunk-GSNPASKB.ts.map} +0 -0
- /package/dist/chunks/{chunk-SDZCTCYQ.ts.map → chunk-OEWQVWLC.ts.map} +0 -0
- /package/dist/chunks/{chunk-4QVPTIZB.ts.map → chunk-UPNVIUBN.ts.map} +0 -0
- /package/dist/chunks/{manager-result-dispatcher-6MQKFCWB.ts.map → config-KGIYTTXQ.ts.map} +0 -0
- /package/dist/chunks/{merge-baseline-store-EVQAAML6.ts.map → conflict-artifacts-FXFIIBCB.ts.map} +0 -0
- /package/dist/chunks/{remote-selection-ui-6LJJ4IMQ.ts.map → continuous-record-LFRVXQBD.ts.map} +0 -0
- /package/dist/chunks/{file-selection-WZX7HAY2.ts.map → file-selection-3JJYOVNR.ts.map} +0 -0
- /package/dist/chunks/{setup-switch-KTUWL6DE.ts.map → manager-result-dispatcher-AGBBVDDS.ts.map} +0 -0
- /package/dist/chunks/{sync-inspection-K45QVLHB.ts.map → merge-baseline-store-RFCAH7KL.ts.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/backends/git/git-backend.ts", "../../src/backends/git/git-runner.ts", "../../src/backends/git/git-storage.ts"],
|
|
4
|
-
"sourcesContent": ["import { createHash, randomUUID } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { posixJoin } from \"../../paths.js\";\nimport type { Snapshot, SnapshotFile } from \"../../snapshot/snapshot-types.js\";\nimport { stateDir } from \"../../state/state-directory.js\";\nimport { syncErrorGuidance } from \"../../sync/sync-error-guidance.js\";\nimport type { ResolvedGitBackend } from \"../backend-types.js\";\nimport {\n type BackendDiagnostic,\n type ExpectedRemoteHead,\n type PublishSnapshotOptions,\n type PublishSnapshotResult,\n type RemoteHead,\n type RemoteHistoryEntry,\n type SyncBackend,\n SyncBackendConflictError,\n SyncBackendPublicationOutcomeUnknownError,\n} from \"../sync-backend.js\";\nimport {\n normalizeGitBranch,\n normalizeGitDirectory,\n normalizeGitRemote,\n normalizeGitRemoteIdentity,\n validateGitNamespace,\n} from \"./git-config.js\";\nimport { GitCommandError, readGitBlobs, runGit } from \"./git-runner.js\";\nimport {\n GIT_MANIFEST_VERSION,\n type GitManifest,\n MAX_GIT_MANIFEST_BYTES,\n MAX_GIT_TREE_OUTPUT_BYTES,\n type PreparedGitFile,\n parseGitTree,\n prepareGitSnapshot,\n requireGitManifest,\n validateGitPublicationTree,\n validateGitSnapshot,\n} from \"./git-storage.js\";\n\nconst COMMAND_TIMEOUT_MS = 30_000;\nconst POST_COMMIT_TIMEOUT_MS = 45_000;\nconst gitCacheMutationQueues = new Map<string, Promise<void>>();\n\nexport interface GitBackendOptions {\n cacheRoot?: string;\n allowLocalRemotes?: boolean;\n commandTimeoutMs?: number;\n postCommitTimeoutMs?: number;\n /** Deterministic fault injection used only by the local backend test suite. */\n afterPushForTest?: () => void | Promise<void>;\n afterLsRemoteForTest?: () => void | Promise<void>;\n afterPayloadWriteForTest?: () => void | Promise<void>;\n}\n\nexport class GitSyncBackend implements SyncBackend {\n readonly identity: string;\n readonly destination: string;\n readonly capability = \"lease-protected\" as const;\n private readonly cacheRoot: string;\n private readonly cacheDir: string;\n private readonly allowLocalRemotes: boolean;\n private readonly commandTimeoutMs: number;\n private readonly postCommitTimeoutMs: number;\n private readonly afterPushForTest?: () => void | Promise<void>;\n private readonly afterLsRemoteForTest?: () => void | Promise<void>;\n private readonly afterPayloadWriteForTest?: () => void | Promise<void>;\n private cacheReady?: Promise<void>;\n\n constructor(\n private readonly config: ResolvedGitBackend,\n options: GitBackendOptions = {},\n ) {\n assertGitDestination(config);\n this.allowLocalRemotes = options.allowLocalRemotes === true;\n if (!this.allowLocalRemotes) assertProductionRemote(config.profile.remote);\n this.identity = gitBackendIdentity(config);\n this.destination = gitDestination(config);\n this.cacheRoot = path.resolve(options.cacheRoot ?? path.join(stateDir(), \"git\"));\n this.cacheDir = path.join(this.cacheRoot, this.identity.slice(\"git:\".length), \"repository.git\");\n this.commandTimeoutMs = options.commandTimeoutMs ?? COMMAND_TIMEOUT_MS;\n this.postCommitTimeoutMs = options.postCommitTimeoutMs ?? POST_COMMIT_TIMEOUT_MS;\n this.afterPushForTest = options.afterPushForTest;\n this.afterLsRemoteForTest = options.afterLsRemoteForTest;\n this.afterPayloadWriteForTest = options.afterPayloadWriteForTest;\n }\n\n sameRevision(left: string, right: string) {\n return decodeRevision(left, this.identity) === decodeRevision(right, this.identity);\n }\n\n async readHead(signal?: AbortSignal): Promise<RemoteHead | undefined> {\n const sha = await this.fetchRemoteHead(signal);\n if (!sha) return undefined;\n const { manifest } = await this.readPublication(sha, signal);\n return remoteHead(sha, manifest, this.identity);\n }\n\n async readSnapshot(reference: string, signal?: AbortSignal): Promise<Snapshot> {\n const head = await this.fetchRemoteHead(signal);\n if (!head) throw new Error(`Git snapshot publication was not found: ${reference}`);\n const commit = await this.resolveSnapshotReference(reference, head, signal);\n try {\n await this.git([\"cat-file\", \"-e\", `${commit}^{commit}`], { signal });\n await this.git([\"merge-base\", \"--is-ancestor\", commit, head], { signal });\n } catch (error) {\n throw new Error(`Git snapshot publication was not found: ${reference}`, { cause: error });\n }\n const { manifest, payloadEntries } = await this.readPublication(commit, signal);\n let blobs: Buffer[];\n try {\n blobs = await readGitBlobs(\n payloadEntries.map((entry) => entry.object),\n {\n gitDir: this.cacheDir,\n signal,\n timeoutMs: this.commandTimeoutMs,\n allowFileProtocol: this.allowLocalRemotes,\n maxOutputBytes: manifest.files.reduce((total, file) => total + file.size, 0),\n },\n );\n } catch (error) {\n if (error instanceof Error && /exceeds/u.test(error.message)) {\n throw new Error(\"Git snapshot file content exceeds its manifest size.\", { cause: error });\n }\n throw this.redactedError(error);\n }\n throwIfAborted(signal);\n const files: SnapshotFile[] = manifest.files.map((file, index) => {\n const content = blobs[index];\n if (!content || content.byteLength !== file.size || sha256(content) !== file.sha256) {\n throw new Error(`Git snapshot file checksum or size mismatch: ${file.path}`);\n }\n return { path: file.path, contentBase64: content.toString(\"base64\"), sha256: file.sha256 };\n });\n const snapshot: Snapshot = {\n version: manifest.snapshotVersion,\n id: manifest.snapshotId,\n createdAt: manifest.createdAt,\n machine: manifest.machine,\n profile: manifest.profile,\n ...(manifest.snapshotSyncSessions === undefined ? {} : { syncSessions: manifest.snapshotSyncSessions }),\n ...(manifest.selection === undefined ? {} : { selection: manifest.selection }),\n ...(manifest.localFields === undefined ? {} : { localFields: manifest.localFields }),\n files,\n };\n validateGitSnapshot(snapshot, manifest, this.config.destination.namespace);\n return snapshot;\n }\n\n async publishSnapshot(\n snapshot: Snapshot,\n expected: ExpectedRemoteHead,\n options: PublishSnapshotOptions = {},\n ): Promise<PublishSnapshotResult> {\n throwIfAborted(options.signal);\n const files = prepareGitSnapshot(snapshot, this.config.destination.namespace);\n const observed = await this.fetchRemoteHead(options.signal);\n if (!matchesExpected(observed, expected, this.identity)) {\n throw new SyncBackendConflictError(\n \"Git remote changed while preparing publication. Run /sync status and retry.\",\n { currentHead: observed ? await this.headForSha(observed, options.signal) : undefined },\n );\n }\n throwIfAborted(options.signal);\n const manifest: GitManifest = {\n version: GIT_MANIFEST_VERSION,\n snapshotVersion: snapshot.version,\n snapshotId: snapshot.id,\n createdAt: snapshot.createdAt,\n machine: snapshot.machine,\n profile: snapshot.profile,\n syncSessions: snapshot.syncSessions === true || snapshot.files.some((file) => file.path.startsWith(\"sessions/\")),\n ...(snapshot.syncSessions === undefined ? {} : { snapshotSyncSessions: snapshot.syncSessions }),\n ...(snapshot.selection === undefined ? {} : { selection: snapshot.selection }),\n ...(snapshot.localFields === undefined ? {} : { localFields: snapshot.localFields }),\n files: files.map(({ path: filePath, sha256: fileSha, size }) => ({\n path: filePath,\n sha256: fileSha,\n size,\n })),\n };\n let candidate: string;\n try {\n candidate = await this.createCommit(snapshot, files, manifest, observed, options.signal);\n } catch (error) {\n throw this.redactedError(error);\n }\n throwIfAborted(options.signal);\n options.onCommit?.();\n\n const ref = this.remoteRef();\n const lease = `--force-with-lease=${ref}:${observed ?? \"\"}`;\n let pushError: unknown;\n try {\n await this.git([\"push\", \"--porcelain\", \"--no-verify\", lease, this.config.profile.remote, `${candidate}:${ref}`], {\n timeoutMs: this.postCommitTimeoutMs,\n });\n await this.afterPushForTest?.();\n } catch (error) {\n pushError = error;\n }\n\n let current: string | undefined;\n try {\n current = await this.fetchRemoteHead(AbortSignal.timeout(this.postCommitTimeoutMs));\n } catch (error) {\n throw new SyncBackendPublicationOutcomeUnknownError(\n `Git publication outcome is unknown: ${this.safeError(pushError ?? error)}`,\n { cause: pushError ?? error },\n );\n }\n if (current !== candidate) {\n if (pushError && current === observed) {\n throw new Error(`Git publication failed without updating the owned branch: ${this.safeError(pushError)}`, {\n cause: pushError,\n });\n }\n throw new SyncBackendConflictError(\n pushError\n ? `Git publication lease was rejected: ${this.safeError(pushError)}`\n : \"Git remote changed immediately after publication.\",\n {\n phase: \"after-commit\",\n currentHead: current ? await this.headForSha(current) : undefined,\n candidateMayHaveBeenActive: true,\n cause: pushError instanceof Error ? pushError : undefined,\n },\n );\n }\n const head = await this.headForSha(candidate);\n return { head, warnings: [] };\n }\n\n async listHistory(signal?: AbortSignal): Promise<RemoteHistoryEntry[]> {\n const sha = await this.fetchRemoteHead(signal);\n if (!sha) return [];\n const result = await this.git([\"rev-list\", \"--first-parent\", \"--reverse\", \"--max-count=100\", sha], { signal });\n const commits = result.stdout.toString(\"utf8\").trim().split(\"\\n\").filter(Boolean);\n const entries: RemoteHistoryEntry[] = [];\n for (const commit of commits) {\n const { manifest } = await this.readPublication(commit, signal);\n entries.push({\n snapshotRef: commit,\n snapshotId: manifest.snapshotId,\n createdAt: manifest.createdAt,\n machine: manifest.machine,\n syncSessions: manifest.syncSessions,\n });\n }\n return entries;\n }\n\n async diagnose(signal?: AbortSignal): Promise<BackendDiagnostic[]> {\n const diagnostics: BackendDiagnostic[] = [\n {\n key: \"git-scope\",\n level: \"info\",\n message: \"git check scope: read remote snapshots and inspect the local cache. Write access is not tested.\",\n },\n ];\n try {\n const version = await runGit([\"--version\"], {\n signal,\n timeoutMs: this.commandTimeoutMs,\n });\n const versionText = version.stdout.toString(\"utf8\").trim();\n const supported = isSupportedGitVersion(versionText);\n diagnostics.push({\n key: \"git-version\",\n level: supported ? \"info\" : \"error\",\n message: supported\n ? versionText\n : `${versionText || \"unknown Git version\"}; pi-sync requires Git 2.30 or newer`,\n });\n } catch (error) {\n return [\n {\n key: \"git-version\",\n level: \"error\",\n message: syncErrorGuidance(new Error(this.safeError(error))),\n },\n ];\n }\n try {\n const head = await this.readHead(signal);\n if (head) await this.readSnapshot(head.snapshotRef, signal);\n diagnostics.push({\n key: \"git-remote\",\n level: \"info\",\n message: head\n ? `git remote: reachable; owned branch ${this.config.destination.branch} is valid`\n : `git remote: reachable; owned branch ${this.config.destination.branch} is not created yet`,\n });\n diagnostics.push({\n key: \"git-cache\",\n level: \"info\",\n message: \"git cache: private bare repository is healthy\",\n });\n } catch (error) {\n diagnostics.push({\n key: \"git-remote\",\n level: \"error\",\n message: `git remote: ${syncErrorGuidance(new Error(this.safeError(error)))}`,\n });\n }\n return diagnostics;\n }\n\n private async resolveSnapshotReference(reference: string, head: string, signal?: AbortSignal) {\n if (isCommitSha(reference) || /^[0-9a-f]{64}$/u.test(reference)) {\n requireCommitSha(reference);\n return reference;\n }\n if (!reference || reference.length > 512 || !/^[A-Za-z0-9._-]+$/u.test(reference)) {\n throw new Error(\"Invalid Git publication reference.\");\n }\n const result = await this.git([\"rev-list\", \"--first-parent\", \"--max-count=100\", head], {\n signal,\n });\n const commits = result.stdout.toString(\"utf8\").trim().split(\"\\n\").filter(Boolean);\n const matches: string[] = [];\n for (const commit of commits) {\n const { manifest } = await this.readPublication(commit, signal);\n if (manifest.snapshotId === reference) matches.push(commit);\n }\n if (matches.length === 0) {\n throw new Error(`Git snapshot publication was not found: ${reference}`);\n }\n if (matches.length > 1) {\n throw new Error(`Git snapshot id is ambiguous; use a commit reference from /sync history: ${reference}`);\n }\n return matches[0] as string;\n }\n\n private async headForSha(sha: string, signal?: AbortSignal) {\n const { manifest } = await this.readPublication(sha, signal);\n return remoteHead(sha, manifest, this.identity);\n }\n\n private async fetchRemoteHead(signal?: AbortSignal) {\n await this.ensureCache(signal);\n const result = await this.git([\"ls-remote\", \"--refs\", this.config.profile.remote, this.remoteRef()], { signal });\n const line = result.stdout.toString(\"utf8\").trim();\n if (!line) return undefined;\n const [sha, ref, ...extra] = line.split(/\\s+/u);\n if (extra.length > 0 || ref !== this.remoteRef() || !sha) {\n throw new Error(\"Git remote returned a malformed owned-ref response.\");\n }\n requireCommitSha(sha);\n await this.afterLsRemoteForTest?.();\n return withGitCacheMutation(\n this.cacheDir,\n async () => {\n const localRef = `refs/pisync/fetch/${process.pid}-${randomUUID()}`;\n try {\n await this.git(\n [\"fetch\", \"--no-tags\", \"--force\", this.config.profile.remote, `${this.remoteRef()}:${localRef}`],\n { signal },\n );\n const fetched = (await this.git([\"rev-parse\", \"--verify\", localRef], { signal })).stdout\n .toString(\"utf8\")\n .trim();\n requireCommitSha(fetched);\n return fetched;\n } finally {\n await this.git([\"update-ref\", \"-d\", localRef], { timeoutMs: 5_000 }).catch(() => undefined);\n }\n },\n signal,\n );\n }\n\n private async readManifest(commit: string, signal?: AbortSignal): Promise<GitManifest> {\n requireCommitSha(commit);\n const bytes = await this.showFile(commit, this.manifestPath(), signal, MAX_GIT_MANIFEST_BYTES);\n let parsed: unknown;\n try {\n parsed = JSON.parse(bytes.toString(\"utf8\"));\n } catch (error) {\n throw new Error(\"Git publication manifest is malformed.\", { cause: error });\n }\n return requireGitManifest(parsed);\n }\n\n private showFile(commit: string, filePath: string, signal?: AbortSignal, maxOutputBytes?: number) {\n return this.git([\"show\", `${commit}:${filePath}`], { signal, maxOutputBytes }).then((result) => result.stdout);\n }\n\n private async createCommit(\n snapshot: Snapshot,\n files: PreparedGitFile[],\n manifest: GitManifest,\n parent: string | undefined,\n signal?: AbortSignal,\n ) {\n const manifestBytes = Buffer.from(`${JSON.stringify(manifest)}\\n`, \"utf8\");\n if (manifestBytes.byteLength > MAX_GIT_MANIFEST_BYTES) {\n throw new Error(`Git publication manifest exceeds the ${MAX_GIT_MANIFEST_BYTES}-byte limit.`);\n }\n await this.ensureCache(signal);\n const temporaryDirectory = await fs.mkdtemp(path.join(path.dirname(this.cacheDir), \".index-\"));\n const indexPath = path.join(temporaryDirectory, \"index\");\n const payloadDirectory = path.join(temporaryDirectory, \"payloads\");\n const env = { GIT_INDEX_FILE: indexPath };\n try {\n await fs.mkdir(payloadDirectory, { mode: 0o700 });\n const uniqueFiles = [...new Map(files.map((file) => [file.sha256, file])).values()].sort((left, right) =>\n left.sha256.localeCompare(right.sha256),\n );\n for (const file of uniqueFiles) {\n throwIfAborted(signal);\n await fs.writeFile(path.join(payloadDirectory, file.sha256), file.content, {\n flag: \"wx\",\n mode: 0o600,\n });\n }\n await this.afterPayloadWriteForTest?.();\n throwIfAborted(signal);\n const hashed = await this.git([\"hash-object\", \"-w\", \"--no-filters\", \"--stdin-paths\"], {\n cwd: payloadDirectory,\n input: uniqueFiles.map((file) => file.sha256).join(\"\\n\") + (uniqueFiles.length ? \"\\n\" : \"\"),\n signal,\n maxOutputBytes: Math.max(1024, uniqueFiles.length * 64),\n });\n const objectIds = hashed.stdout.toString(\"utf8\").trim().split(\"\\n\").filter(Boolean);\n if (objectIds.length !== uniqueFiles.length || objectIds.some((id) => !isCommitSha(id))) {\n throw new Error(\"Git hash-object returned a malformed payload response.\");\n }\n const objectsBySha256 = new Map(uniqueFiles.map((file, index) => [file.sha256, objectIds[index] as string]));\n const manifestBlob = (await this.git([\"hash-object\", \"-w\", \"--stdin\"], { input: manifestBytes, signal })).stdout\n .toString(\"utf8\")\n .trim();\n if (!isCommitSha(manifestBlob)) throw new Error(\"Git returned an invalid manifest blob id.\");\n await this.git([\"read-tree\", \"--empty\"], { env, signal });\n const indexLines = [\n `100644 ${manifestBlob}\\t${this.manifestPath()}`,\n ...files.map((file) => {\n const object = objectsBySha256.get(file.sha256);\n if (!object) throw new Error(\"Git payload object is missing after hashing.\");\n return `100644 ${object}\\t${this.filePath(file.path)}`;\n }),\n ];\n await this.git([\"update-index\", \"-z\", \"--index-info\"], {\n env,\n signal,\n input: Buffer.from(`${indexLines.join(\"\\0\")}\\0`, \"utf8\"),\n });\n const tree = (await this.git([\"write-tree\"], { env, signal })).stdout.toString(\"utf8\").trim();\n const date = Number.isNaN(Date.parse(snapshot.createdAt)) ? new Date().toISOString() : snapshot.createdAt;\n const commit = await this.git([\"commit-tree\", tree, ...(parent ? [\"-p\", parent] : []), \"-F\", \"-\"], {\n signal,\n input: `pi-sync snapshot ${snapshot.id}\\n`,\n env: {\n GIT_AUTHOR_NAME: \"pi-sync\",\n GIT_AUTHOR_EMAIL: \"pi-sync@localhost\",\n GIT_COMMITTER_NAME: \"pi-sync\",\n GIT_COMMITTER_EMAIL: \"pi-sync@localhost\",\n GIT_AUTHOR_DATE: date,\n GIT_COMMITTER_DATE: date,\n },\n });\n const sha = commit.stdout.toString(\"utf8\").trim();\n requireCommitSha(sha);\n return sha;\n } finally {\n await fs.rm(temporaryDirectory, { recursive: true, force: true });\n }\n }\n\n private ensureCache(signal?: AbortSignal) {\n if (!this.cacheReady) {\n const operation = withGitCacheMutation(this.cacheDir, () => this.initializeCache(signal), signal);\n const wrapped = operation.catch((error) => {\n if (this.cacheReady === wrapped) this.cacheReady = undefined;\n throw this.redactedError(error);\n });\n this.cacheReady = wrapped;\n }\n return this.cacheReady;\n }\n\n private async initializeCache(signal?: AbortSignal) {\n const version = await runGit([\"--version\"], {\n signal,\n timeoutMs: this.commandTimeoutMs,\n });\n const versionText = version.stdout.toString(\"utf8\").trim();\n if (!isSupportedGitVersion(versionText)) {\n throw new Error(`${versionText || \"Unknown Git version\"}; pi-sync requires Git 2.30 or newer.`);\n }\n const parent = path.dirname(this.cacheDir);\n const cacheParent = path.dirname(this.cacheRoot);\n await assertNotSymlink(cacheParent, \"Git cache parent\");\n await assertNotSymlink(this.cacheRoot, \"Git cache root\");\n await fs.mkdir(this.cacheRoot, { recursive: true, mode: 0o700 });\n await assertNotSymlink(cacheParent, \"Git cache parent\");\n await assertNotSymlink(this.cacheRoot, \"Git cache root\");\n await assertNotSymlink(parent, \"Git cache identity directory\");\n await fs.mkdir(parent, { recursive: true, mode: 0o700 });\n await assertNotSymlink(parent, \"Git cache identity directory\");\n let recreate = false;\n try {\n const stat = await fs.lstat(this.cacheDir);\n if (stat.isSymbolicLink()) throw new Error(\"Refusing symlinked Git cache.\");\n if (!stat.isDirectory()) recreate = true;\n else {\n try {\n recreate = !(await this.cacheUsesSha1(signal));\n } catch {\n throwIfAborted(signal);\n recreate = true;\n }\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n throwIfAborted(signal);\n if (recreate) await fs.rm(this.cacheDir, { recursive: true, force: true });\n try {\n await fs.access(this.cacheDir);\n } catch {\n try {\n await runGit([\"init\", \"--bare\", \"--object-format=sha1\", this.cacheDir], {\n signal,\n timeoutMs: this.commandTimeoutMs,\n allowFileProtocol: this.allowLocalRemotes,\n });\n } catch (initError) {\n const concurrent = await this.cacheUsesSha1(signal).catch(() => false);\n if (!concurrent) throw initError;\n }\n }\n if (process.platform !== \"win32\") await fs.chmod(parent, 0o700);\n }\n\n private async cacheUsesSha1(signal?: AbortSignal) {\n const result = await this.git([\"rev-parse\", \"--is-bare-repository\", \"--show-object-format\"], {\n signal,\n });\n return result.stdout.toString(\"utf8\").trim() === \"true\\nsha1\";\n }\n\n private git(\n args: string[],\n options: {\n cwd?: string;\n input?: Buffer | string;\n env?: NodeJS.ProcessEnv;\n signal?: AbortSignal;\n timeoutMs?: number;\n maxOutputBytes?: number;\n } = {},\n ) {\n return runGit(args, {\n gitDir: this.cacheDir,\n allowFileProtocol: this.allowLocalRemotes,\n timeoutMs: options.timeoutMs ?? this.commandTimeoutMs,\n ...options,\n }).catch((error) => {\n throw this.redactedError(error);\n });\n }\n\n private remoteRef() {\n return `refs/heads/${this.config.destination.branch}`;\n }\n\n private publicationPath() {\n return this.config.destination.directory === \"./\" ? \"\" : this.config.destination.directory;\n }\n\n private manifestPath() {\n return posixJoin(this.publicationPath(), \"manifest.json\");\n }\n\n private filePath(filePath: string) {\n return posixJoin(this.publicationPath(), \"files\", filePath);\n }\n\n private async readPublication(commit: string, signal?: AbortSignal) {\n const manifest = await this.readManifest(commit, signal);\n const entries = await this.readPublicationTree(commit, signal);\n const payloadEntries = validateGitPublicationTree(entries, manifest, this.manifestPath(), (filePath) =>\n this.filePath(filePath),\n );\n return { manifest, payloadEntries };\n }\n\n private async readPublicationTree(commit: string, signal?: AbortSignal) {\n const result = await this.git([\"ls-tree\", \"-r\", \"-z\", commit], {\n signal,\n maxOutputBytes: MAX_GIT_TREE_OUTPUT_BYTES,\n });\n return parseGitTree(result.stdout);\n }\n\n private redactedError(error: unknown) {\n if (error instanceof Error && error.name === \"AbortError\") return error;\n return new Error(this.safeError(error));\n }\n\n private safeError(error: unknown) {\n const raw =\n error instanceof GitCommandError\n ? error.stderr || error.message\n : error instanceof Error\n ? error.message\n : String(error);\n return redactGitError(raw, this.config.profile.remote, this.cacheDir);\n }\n}\n\nexport function gitBackendIdentity(config: ResolvedGitBackend) {\n let remoteIdentity: string;\n try {\n remoteIdentity = normalizeGitRemoteIdentity(config.profile.remote);\n } catch {\n remoteIdentity = config.profile.remote;\n }\n const canonical = JSON.stringify([remoteIdentity, config.destination.branch, config.destination.directory]);\n return `git:${sha256(Buffer.from(canonical))}`;\n}\n\nfunction gitDestination(config: ResolvedGitBackend) {\n let host = \"Git remote\";\n const remote = config.profile.remote;\n if (remote.includes(\"://\")) {\n try {\n host = new URL(remote).host;\n } catch {\n host = \"Git remote\";\n }\n } else {\n const match = /^(?:[^@]+@)?(?<host>\\[[^\\]]+\\]|[^:]+):/u.exec(remote);\n if (match?.groups?.host) host = match.groups.host;\n }\n return `${host} \u00B7 ${config.destination.branch}:${config.destination.directory}`;\n}\n\nfunction remoteHead(sha: string, manifest: GitManifest, identity: string): RemoteHead {\n return {\n snapshotRef: sha,\n snapshotId: manifest.snapshotId,\n revision: `${identity}:${sha}`,\n createdAt: manifest.createdAt,\n machine: manifest.machine,\n syncSessions: manifest.syncSessions,\n ...(manifest.selection === undefined ? {} : { selection: manifest.selection }),\n };\n}\n\nfunction matchesExpected(current: string | undefined, expected: ExpectedRemoteHead, identity: string) {\n if (expected.kind === \"missing\") return current === undefined;\n try {\n return current === decodeRevision(expected.revision, identity);\n } catch {\n return false;\n }\n}\n\nfunction decodeRevision(revision: string, identity: string) {\n const prefix = `${identity}:`;\n const sha = revision.startsWith(prefix) ? revision.slice(prefix.length) : \"\";\n if (!/^[0-9a-f]{40}$/u.test(sha)) throw new Error(\"Invalid Git remote revision.\");\n return sha;\n}\n\nfunction isCommitSha(value: string) {\n return /^[0-9a-f]{40}$/u.test(value);\n}\n\nfunction requireCommitSha(value: string) {\n if (/^[0-9a-f]{64}$/u.test(value)) {\n throw new Error(\"Unsupported Git SHA-256 repository; pi-sync currently requires SHA-1 refs.\");\n }\n if (!/^[0-9a-f]{40}$/u.test(value)) throw new Error(\"Invalid Git publication reference.\");\n}\n\nexport function isSupportedGitVersion(value: string) {\n const match = /git version (\\d+)\\.(\\d+)/u.exec(value);\n if (!match) return false;\n const major = Number(match[1]);\n const minor = Number(match[2]);\n return major > 2 || (major === 2 && minor >= 30);\n}\n\nfunction assertGitDestination(config: ResolvedGitBackend) {\n try {\n if (\n normalizeGitBranch(config.destination.branch) !== config.destination.branch ||\n normalizeGitDirectory(config.destination.directory) !== config.destination.directory\n ) {\n throw new Error(\"Git storage location is not normalized.\");\n }\n validateGitNamespace(config.destination.namespace);\n } catch (error) {\n throw new Error(\"Invalid Git storage location.\", { cause: error });\n }\n}\n\nfunction assertProductionRemote(remote: string) {\n let normalized: string | undefined;\n try {\n normalized = normalizeGitRemote(remote);\n } catch (error) {\n throw new Error(error instanceof Error ? error.message : \"Invalid Git remote.\", {\n cause: error,\n });\n }\n if (!normalized || normalized !== remote) throw new Error(\"Invalid or non-normalized Git remote.\");\n}\n\nasync function withGitCacheMutation<T>(cacheDir: string, run: () => Promise<T>, signal?: AbortSignal): Promise<T> {\n const previous = gitCacheMutationQueues.get(cacheDir) ?? Promise.resolve();\n let started = false;\n const operation = previous\n .catch(() => undefined)\n .then(() => {\n throwIfAborted(signal);\n started = true;\n return run();\n });\n const tail = operation.then(\n () => undefined,\n () => undefined,\n );\n gitCacheMutationQueues.set(cacheDir, tail);\n void tail.then(() => {\n if (gitCacheMutationQueues.get(cacheDir) === tail) gitCacheMutationQueues.delete(cacheDir);\n });\n if (!signal) return operation;\n throwIfAborted(signal);\n let rejectAbort: ((reason: unknown) => void) | undefined;\n const aborted = new Promise<never>((_resolve, reject) => {\n rejectAbort = reject;\n });\n const onAbort = () => rejectAbort?.(abortReason(signal));\n signal.addEventListener(\"abort\", onAbort, { once: true });\n if (signal.aborted) onAbort();\n try {\n return await Promise.race([operation, aborted]);\n } catch (error) {\n // A queued job can cancel immediately, but a running job owns a child/cache\n // mutation. Drain its bounded cleanup before releasing outer sync guards.\n if (started) await tail;\n throw error;\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n}\n\nasync function assertNotSymlink(target: string, label: string) {\n try {\n const stat = await fs.lstat(target);\n if (stat.isSymbolicLink()) throw new Error(`Refusing symlinked ${label}.`);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n}\n\nfunction redactGitError(value: string, remote: string, cacheDir: string) {\n return (\n value\n .replaceAll(remote, \"<git-remote>\")\n .replaceAll(cacheDir, \"<git-cache>\")\n .replace(/https:\\/\\/[^/@\\s]+@/gu, \"https://<credentials>@\")\n .replace(/\\b(password|token|authorization)=\\S+/giu, \"$1=<redacted>\")\n .replace(/\\bBearer\\s+\\S+/giu, \"Bearer <redacted>\")\n // biome-ignore lint/suspicious/noControlCharactersInRegex: sanitize untrusted process output.\n .replace(/[\\u0000-\\u001f\\u007f-\\u009f]/gu, \" \")\n .trim()\n .slice(0, 4096)\n );\n}\n\nfunction sha256(value: Buffer) {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction abortReason(signal: AbortSignal) {\n return signal.reason instanceof Error ? signal.reason : new DOMException(\"The operation was aborted\", \"AbortError\");\n}\n\nfunction throwIfAborted(signal?: AbortSignal) {\n if (signal?.aborted) throw abortReason(signal);\n}\n", "import { spawn } from \"node:child_process\";\nimport process from \"node:process\";\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_OUTPUT_LIMIT = 1024 * 1024;\n\nexport interface GitRunOptions {\n gitDir?: string;\n cwd?: string;\n input?: Buffer | string;\n env?: NodeJS.ProcessEnv;\n signal?: AbortSignal;\n timeoutMs?: number;\n maxOutputBytes?: number;\n allowFileProtocol?: boolean;\n}\n\nexport interface GitRunResult {\n stdout: Buffer;\n stderr: Buffer;\n}\n\nexport class GitCommandError extends Error {\n readonly code = \"GIT_COMMAND_FAILED\";\n constructor(\n message: string,\n readonly exitCode: number | null,\n readonly stderr: string,\n options?: ErrorOptions,\n ) {\n super(message, options);\n this.name = \"GitCommandError\";\n }\n}\n\nexport async function runGit(args: string[], options: GitRunOptions = {}): Promise<GitRunResult> {\n throwIfAborted(options.signal);\n const hooksPath = process.platform === \"win32\" ? \"NUL\" : \"/dev/null\";\n const protocolArgs = [\n \"-c\",\n `core.hooksPath=${hooksPath}`,\n \"-c\",\n \"gc.auto=0\",\n \"-c\",\n \"maintenance.auto=false\",\n \"-c\",\n \"protocol.allow=never\",\n \"-c\",\n \"protocol.https.allow=always\",\n \"-c\",\n \"protocol.ssh.allow=always\",\n ];\n if (options.allowFileProtocol) protocolArgs.push(\"-c\", \"protocol.file.allow=always\");\n const commandArgs = [...(options.gitDir ? [`--git-dir=${options.gitDir}`] : []), ...protocolArgs, ...args];\n const inheritedEnvironment = Object.fromEntries(\n Object.entries(process.env).filter(\n ([key]) =>\n !key.startsWith(\"GIT_\") &&\n key !== \"PAGER\" &&\n key !== \"EDITOR\" &&\n key !== \"VISUAL\" &&\n key !== \"SSH_ASKPASS\" &&\n key !== \"SSH_ASKPASS_REQUIRE\",\n ),\n );\n const allowedGitOverrides = new Set([\n \"GIT_INDEX_FILE\",\n \"GIT_AUTHOR_NAME\",\n \"GIT_AUTHOR_EMAIL\",\n \"GIT_AUTHOR_DATE\",\n \"GIT_COMMITTER_NAME\",\n \"GIT_COMMITTER_EMAIL\",\n \"GIT_COMMITTER_DATE\",\n ]);\n const suppliedEnvironment = Object.fromEntries(\n Object.entries(options.env ?? {}).filter(([key]) => !key.startsWith(\"GIT_\") || allowedGitOverrides.has(key)),\n );\n const env: NodeJS.ProcessEnv = {\n ...inheritedEnvironment,\n ...suppliedEnvironment,\n LC_ALL: \"C\",\n LANG: \"C\",\n GIT_CONFIG_NOSYSTEM: \"1\",\n GIT_TERMINAL_PROMPT: \"0\",\n GCM_INTERACTIVE: \"Never\",\n GIT_PAGER: \"cat\",\n PAGER: \"cat\",\n GIT_EDITOR: \"true\",\n EDITOR: \"true\",\n VISUAL: \"true\",\n GIT_ASKPASS: \"\",\n SSH_ASKPASS: \"\",\n SSH_ASKPASS_REQUIRE: \"never\",\n GIT_SSH_COMMAND: \"ssh -oBatchMode=yes\",\n };\n const child = spawn(\"git\", commandArgs, {\n cwd: options.cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n detached: process.platform !== \"win32\",\n windowsHide: true,\n });\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n let total = 0;\n let settled = false;\n let terminationError: Error | undefined;\n let escalationTimer: NodeJS.Timeout | undefined;\n const limit = options.maxOutputBytes ?? DEFAULT_OUTPUT_LIMIT;\n\n const terminate = (error: Error) => {\n if (settled || terminationError) return;\n terminationError = error;\n if (child.pid && process.platform !== \"win32\") {\n try {\n process.kill(-child.pid, \"SIGTERM\");\n } catch {\n child.kill(\"SIGTERM\");\n }\n } else {\n child.kill(\"SIGTERM\");\n if (child.pid && process.platform === \"win32\") {\n const killer = spawn(\"taskkill\", [\"/pid\", String(child.pid), \"/t\", \"/f\"], {\n stdio: \"ignore\",\n windowsHide: true,\n });\n killer.on(\"error\", () => undefined);\n killer.unref();\n }\n }\n escalationTimer = setTimeout(() => {\n if (settled) return;\n if (child.pid && process.platform !== \"win32\") {\n try {\n process.kill(-child.pid, \"SIGKILL\");\n } catch {\n child.kill(\"SIGKILL\");\n }\n } else {\n child.kill(\"SIGKILL\");\n }\n }, 2_000);\n };\n const collect = (target: Buffer[]) => (chunk: Buffer) => {\n total += chunk.byteLength;\n if (total > limit) {\n terminate(new Error(`Git output exceeds the ${limit}-byte limit.`));\n return;\n }\n target.push(Buffer.from(chunk));\n };\n child.stdout.on(\"data\", collect(stdout));\n child.stderr.on(\"data\", collect(stderr));\n child.stdin.on(\"error\", () => undefined);\n child.stdin.end(options.input);\n const onAbort = () =>\n terminate(\n options.signal?.reason instanceof Error\n ? options.signal.reason\n : new DOMException(\"The operation was aborted\", \"AbortError\"),\n );\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n const timer = setTimeout(\n () => terminate(new Error(`Git command timed out after ${options.timeoutMs ?? DEFAULT_TIMEOUT_MS}ms.`)),\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n\n let result: GitRunResult;\n try {\n result = await new Promise<GitRunResult>((resolve, reject) => {\n child.once(\"error\", reject);\n child.once(\"close\", (code) => {\n settled = true;\n if (escalationTimer) clearTimeout(escalationTimer);\n const stdoutBuffer = Buffer.concat(stdout);\n const stderrBuffer = Buffer.concat(stderr);\n if (terminationError) {\n reject(terminationError);\n return;\n }\n if (code !== 0) {\n const stderrText = stderrBuffer.toString(\"utf8\").trim();\n reject(new GitCommandError(stderrText || `Git exited with status ${code ?? \"unknown\"}.`, code, stderrText));\n return;\n }\n resolve({ stdout: stdoutBuffer, stderr: stderrBuffer });\n });\n });\n } finally {\n clearTimeout(timer);\n if (escalationTimer) clearTimeout(escalationTimer);\n options.signal?.removeEventListener(\"abort\", onAbort);\n }\n return result;\n}\n\nexport function parseGitBlobBatch(output: Buffer, expectedCount: number, maxContentBytes: number) {\n if (!Number.isSafeInteger(expectedCount) || expectedCount < 0) {\n throw new Error(\"Invalid Git batch object count.\");\n }\n if (!Number.isSafeInteger(maxContentBytes) || maxContentBytes < 0) {\n throw new Error(\"Invalid Git batch content limit.\");\n }\n const blobs: Buffer[] = [];\n let offset = 0;\n let contentBytes = 0;\n for (let index = 0; index < expectedCount; index += 1) {\n const headerEnd = output.indexOf(0x0a, offset);\n if (headerEnd < 0) throw new Error(\"Git cat-file batch response is truncated.\");\n const header = output.subarray(offset, headerEnd).toString(\"utf8\");\n if (header.endsWith(\" missing\")) throw new Error(\"Git cat-file batch object is missing.\");\n const match = /^(?<object>[0-9a-f]{40}) blob (?<size>0|[1-9][0-9]*)$/u.exec(header);\n if (!match?.groups) throw new Error(\"Git cat-file batch response is malformed.\");\n const size = Number(match.groups.size);\n if (!Number.isSafeInteger(size)) throw new Error(\"Git cat-file batch size is malformed.\");\n contentBytes += size;\n if (contentBytes > maxContentBytes) {\n throw new Error(`Git cat-file batch content exceeds the ${maxContentBytes}-byte limit.`);\n }\n const contentStart = headerEnd + 1;\n const contentEnd = contentStart + size;\n if (contentEnd >= output.length) throw new Error(\"Git cat-file batch response is truncated.\");\n if (output[contentEnd] !== 0x0a) {\n throw new Error(\"Git cat-file batch response is malformed.\");\n }\n blobs.push(Buffer.from(output.subarray(contentStart, contentEnd)));\n offset = contentEnd + 1;\n }\n if (offset !== output.length) throw new Error(\"Git cat-file batch response has trailing data.\");\n return blobs;\n}\n\nexport async function readGitBlobs(\n objects: string[],\n options: Omit<GitRunOptions, \"input\" | \"maxOutputBytes\"> & { maxOutputBytes: number },\n) {\n if (objects.length === 0) return [];\n if (!Number.isSafeInteger(options.maxOutputBytes) || options.maxOutputBytes < 0) {\n throw new Error(\"Invalid Git batch output limit.\");\n }\n if (objects.some((object) => !/^[0-9a-f]{40}$/u.test(object))) {\n throw new Error(\"Invalid Git blob object id.\");\n }\n const protocolOverhead = objects.length * 96;\n if (!Number.isSafeInteger(protocolOverhead + options.maxOutputBytes)) {\n throw new Error(\"Invalid Git batch output limit.\");\n }\n const result = await runGit([\"cat-file\", \"--batch\"], {\n ...options,\n input: `${objects.join(\"\\n\")}\\n`,\n maxOutputBytes: options.maxOutputBytes + protocolOverhead,\n });\n return parseGitBlobBatch(result.stdout, objects.length, options.maxOutputBytes);\n}\n\nfunction throwIfAborted(signal?: AbortSignal) {\n if (!signal?.aborted) return;\n throw signal.reason instanceof Error ? signal.reason : new DOMException(\"The operation was aborted\", \"AbortError\");\n}\n", "import { createHash } from \"node:crypto\";\nimport type { Snapshot, SnapshotSelection } from \"../../snapshot/snapshot-types.js\";\nimport { sameLocalFields, validatePortableSnapshot, validateSnapshotFieldPolicy } from \"../../sync/local-fields.js\";\nimport { portableSnapshotSelection, snapshotSelectionInclude } from \"../../sync/sync-policy.js\";\n\nexport const GIT_MANIFEST_VERSION = 2;\nexport const MAX_GIT_MANIFEST_BYTES = 1024 * 1024;\nexport const MAX_GIT_TREE_OUTPUT_BYTES = 16 * 1024 * 1024;\nexport const MAX_GIT_PAYLOAD_BYTES = 100 * 1024 * 1024;\nexport const MAX_GIT_SNAPSHOT_BYTES = 512 * 1024 * 1024;\n\nexport interface GitManifestFile {\n path: string;\n sha256: string;\n size: number;\n}\n\nexport interface GitManifest {\n version: number;\n snapshotVersion: number;\n snapshotId: string;\n createdAt: string;\n machine: string;\n profile: string;\n syncSessions: boolean;\n snapshotSyncSessions?: boolean;\n selection?: SnapshotSelection;\n localFields?: string[];\n files: GitManifestFile[];\n}\n\nexport interface PreparedGitFile extends GitManifestFile {\n content: Buffer;\n}\n\nexport interface GitTreeEntry {\n mode: string;\n type: string;\n object: string;\n path: string;\n}\n\nexport function isGitPayloadSizeAllowed(size: number) {\n return Number.isSafeInteger(size) && size >= 0 && size <= MAX_GIT_PAYLOAD_BYTES;\n}\n\nexport function requireGitManifest(value: unknown): GitManifest {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\"Git publication manifest is malformed.\");\n }\n const manifest = value as Partial<GitManifest>;\n if (manifest.version === 1) {\n throw new Error(\n \"Git publication uses the unsupported pre-release gzip format; recreate this pi-sync-owned test branch.\",\n );\n }\n if (\n manifest.version !== GIT_MANIFEST_VERSION ||\n (manifest.snapshotVersion !== 1 && manifest.snapshotVersion !== 2 && manifest.snapshotVersion !== 3) ||\n typeof manifest.snapshotId !== \"string\" ||\n manifest.snapshotId.length > 512 ||\n !/^[A-Za-z0-9._-]+$/u.test(manifest.snapshotId) ||\n typeof manifest.createdAt !== \"string\" ||\n manifest.createdAt.length > 64 ||\n hasControlCharacter(manifest.createdAt) ||\n Number.isNaN(Date.parse(manifest.createdAt)) ||\n typeof manifest.machine !== \"string\" ||\n manifest.machine.length > 256 ||\n hasControlCharacter(manifest.machine) ||\n typeof manifest.profile !== \"string\" ||\n manifest.profile.length === 0 ||\n manifest.profile.length > 256 ||\n hasControlCharacter(manifest.profile) ||\n typeof manifest.syncSessions !== \"boolean\" ||\n (manifest.snapshotSyncSessions !== undefined && typeof manifest.snapshotSyncSessions !== \"boolean\") ||\n !Array.isArray(manifest.files) ||\n !hasExactKeys(manifest as Record<string, unknown>, [\n \"version\",\n \"snapshotVersion\",\n \"snapshotId\",\n \"createdAt\",\n \"machine\",\n \"profile\",\n \"syncSessions\",\n ...(manifest.snapshotSyncSessions === undefined ? [] : [\"snapshotSyncSessions\"]),\n ...(manifest.selection === undefined ? [] : [\"selection\"]),\n ...(manifest.localFields === undefined ? [] : [\"localFields\"]),\n \"files\",\n ])\n ) {\n throw new Error(\"Git publication manifest is malformed.\");\n }\n validateSnapshotFieldPolicy({ version: manifest.snapshotVersion, localFields: manifest.localFields });\n if (manifest.selection !== undefined) portableSnapshotSelection(manifest.selection);\n let total = 0;\n const paths = new Set<string>();\n for (const rawFile of manifest.files) {\n if (!rawFile || typeof rawFile !== \"object\" || Array.isArray(rawFile)) {\n throw new Error(\"Git publication manifest file is malformed.\");\n }\n const file = rawFile as Partial<GitManifestFile>;\n if (\n !hasExactKeys(file as Record<string, unknown>, [\"path\", \"sha256\", \"size\"]) ||\n !isSafeSnapshotPath(file.path) ||\n typeof file.sha256 !== \"string\" ||\n !/^[0-9a-f]{64}$/u.test(file.sha256) ||\n typeof file.size !== \"number\" ||\n !isGitPayloadSizeAllowed(file.size) ||\n paths.has(file.path)\n ) {\n throw new Error(\"Git publication manifest file is malformed.\");\n }\n total += file.size;\n if (!Number.isSafeInteger(total) || total > MAX_GIT_SNAPSHOT_BYTES) {\n throw new Error(`Git snapshot content exceeds the ${MAX_GIT_SNAPSHOT_BYTES}-byte limit.`);\n }\n paths.add(file.path);\n }\n assertNoPathConflicts([...paths]);\n return manifest as GitManifest;\n}\n\nexport function validateGitSnapshot(snapshot: Snapshot, manifest: GitManifest, namespace: string) {\n const prepared = prepareGitSnapshot(snapshot, namespace);\n const syncSessions =\n snapshot.syncSessions === true || snapshot.files.some((file) => file.path.startsWith(\"sessions/\"));\n if (\n snapshot.version !== manifest.snapshotVersion ||\n !sameLocalFields(snapshot.localFields, manifest.localFields) ||\n snapshot.id !== manifest.snapshotId ||\n snapshot.createdAt !== manifest.createdAt ||\n snapshot.machine !== manifest.machine ||\n snapshot.profile !== manifest.profile ||\n snapshot.syncSessions !== manifest.snapshotSyncSessions ||\n syncSessions !== manifest.syncSessions ||\n !sameOptionalInclude(\n snapshotSelectionInclude(snapshot),\n manifest.selection === undefined ? undefined : portableSnapshotSelection(manifest.selection).include,\n ) ||\n prepared.length !== manifest.files.length ||\n prepared.some((file, index) => {\n const expected = manifest.files[index];\n return !expected || file.path !== expected.path || file.sha256 !== expected.sha256 || file.size !== expected.size;\n })\n ) {\n throw new Error(\"Git snapshot identity does not match its publication manifest.\");\n }\n}\n\nexport function prepareGitSnapshot(snapshot: Snapshot, namespace: string) {\n snapshotSelectionInclude(snapshot);\n validatePortableSnapshot(snapshot);\n if (\n typeof snapshot.id !== \"string\" ||\n !snapshot.id ||\n snapshot.id.length > 512 ||\n !/^[A-Za-z0-9._-]+$/u.test(snapshot.id) ||\n snapshot.profile !== namespace ||\n !Array.isArray(snapshot.files) ||\n typeof snapshot.createdAt !== \"string\" ||\n !snapshot.createdAt ||\n snapshot.createdAt.length > 64 ||\n hasControlCharacter(snapshot.createdAt) ||\n Number.isNaN(Date.parse(snapshot.createdAt)) ||\n typeof snapshot.machine !== \"string\" ||\n snapshot.machine.length > 256 ||\n hasControlCharacter(snapshot.machine)\n ) {\n throw new Error(\"Invalid Git snapshot publication.\");\n }\n const paths = new Set<string>();\n const prepared: PreparedGitFile[] = [];\n let total = 0;\n for (const file of snapshot.files) {\n if (\n !isSafeSnapshotPath(file.path) ||\n typeof file.contentBase64 !== \"string\" ||\n typeof file.sha256 !== \"string\" ||\n !/^[0-9a-f]{64}$/u.test(file.sha256) ||\n paths.has(file.path)\n ) {\n throw new Error(\"Invalid Git snapshot file.\");\n }\n const content = Buffer.from(file.contentBase64, \"base64\");\n if (content.toString(\"base64\") !== file.contentBase64 || sha256(content) !== file.sha256) {\n throw new Error(\"Git snapshot file checksum mismatch.\");\n }\n if (!isGitPayloadSizeAllowed(content.byteLength)) {\n throw new Error(\n `Git snapshot file exceeds GitHub's ${MAX_GIT_PAYLOAD_BYTES}-byte regular-Git limit: ${file.path}`,\n );\n }\n total += content.byteLength;\n if (!Number.isSafeInteger(total) || total > MAX_GIT_SNAPSHOT_BYTES) {\n throw new Error(`Git snapshot content exceeds the ${MAX_GIT_SNAPSHOT_BYTES}-byte limit.`);\n }\n paths.add(file.path);\n prepared.push({ path: file.path, sha256: file.sha256, size: content.byteLength, content });\n }\n assertNoPathConflicts([...paths]);\n return prepared;\n}\n\nexport function parseGitTree(output: Buffer): GitTreeEntry[] {\n if (output.byteLength === 0) return [];\n if (output.at(-1) !== 0) throw new Error(\"Git publication tree response is malformed.\");\n return output\n .subarray(0, -1)\n .toString(\"utf8\")\n .split(\"\\0\")\n .map((line) => {\n const match = /^(?<mode>[0-9]{6}) (?<type>blob|tree|commit) (?<object>[0-9a-f]{40})\\t(?<path>.+)$/u.exec(line);\n if (!match?.groups || hasControlCharacter(match.groups.path)) {\n throw new Error(\"Git publication tree response is malformed.\");\n }\n return {\n mode: match.groups.mode,\n type: match.groups.type,\n object: match.groups.object,\n path: match.groups.path,\n };\n });\n}\n\nexport function validateGitPublicationTree(\n entries: GitTreeEntry[],\n manifest: GitManifest,\n manifestPath: string,\n filePath: (path: string) => string,\n) {\n const byPath = new Map<string, GitTreeEntry>();\n for (const entry of entries) {\n if (byPath.has(entry.path)) throw new Error(\"Git publication tree contains duplicate paths.\");\n byPath.set(entry.path, entry);\n }\n const expectedPaths = [manifestPath, ...manifest.files.map((file) => filePath(file.path))];\n if (entries.length !== expectedPaths.length || expectedPaths.some((path) => !byPath.has(path))) {\n throw new Error(\"Git publication tree has missing or extra files.\");\n }\n for (const expectedPath of expectedPaths) {\n const entry = byPath.get(expectedPath);\n if (entry?.mode !== \"100644\" || entry.type !== \"blob\") {\n throw new Error(`Git publication tree contains a non-regular file: ${expectedPath}`);\n }\n }\n return manifest.files.map((file) => byPath.get(filePath(file.path)) as GitTreeEntry);\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\nfunction isSafeSnapshotPath(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n value.length > 0 &&\n value.length <= 4096 &&\n !value.startsWith(\"/\") &&\n !value.includes(\"\\\\\") &&\n !hasControlCharacter(value) &&\n value\n .split(\"/\")\n .every((segment) => segment && segment !== \".\" && segment !== \"..\" && segment.toLowerCase() !== \".git\")\n );\n}\n\nfunction hasExactKeys(value: Record<string, unknown>, expected: string[]) {\n const keys = Object.keys(value).sort();\n const expectedKeys = [...expected].sort();\n return keys.length === expectedKeys.length && keys.every((key, index) => key === expectedKeys[index]);\n}\n\nfunction assertNoPathConflicts(paths: string[]) {\n const sorted = [...paths].sort();\n for (let index = 1; index < sorted.length; index += 1) {\n const parent = sorted[index - 1];\n const child = sorted[index];\n if (parent && child?.startsWith(`${parent}/`)) {\n throw new Error(`Git snapshot file path conflict: ${parent} and ${child}`);\n }\n }\n}\n\nfunction sha256(value: Buffer) {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction hasControlCharacter(value: string) {\n // biome-ignore lint/suspicious/noControlCharactersInRegex: Reject untrusted terminal/ref controls.\n return /[\\u0000-\\u001f\\u007f-\\u009f]/u.test(value);\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["createHash", "process", "path", "throwIfAborted", "sha256", "createHash"]
|
|
7
|
-
}
|
|
@@ -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/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 ActionMenuItem, defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport { loadConfig } from \"../settings/config.js\";\nimport { operationBlocksChanges } from \"../state/operation-availability.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 { 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\";\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 | \"sync\"\n | \"switch\"\n | \"settings\"\n | \"pull\"\n | \"push\"\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 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 doctor: async () => {\n const result = await runCancellableOperation(ctx, \"Checking setup access\u2026\", \"doctor\", runRoute, {\n signal: sessionSignal,\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 await runMenu(ctx, 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 | \"pull\"\n | \"push\"\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 \"Pull from remote\u2026\": \"pull\",\n \"Push to remote\u2026\": \"push\",\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 ...(action === \"doctor\"\n ? { description: \"Check setup access; WebDAV also probes writes and repairs history.\" }\n : {}),\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 { 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 \"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 ? safeTerminalText(syncState.lastAppliedSnapshot)\n : syncState\n ? \"Never synced\"\n : \"Unavailable\";\n const canSwitch = (await countValidSyncSetups(configuredTargets, signal)) > 1;\n const mainActions: string[] = [...MAIN_MENU_ACTIONS];\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 `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 `Automatic transfer at startup: ${config.automaticTransfer ? \"On \u2014 upload/replace/delete at idle; no reload\" : \"Off\"}`,\n `Last applied: ${lastAppliedSnapshot}`,\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 ...(noSyncedContent\n ? [\"\", \"No included content is selected. Choose included content in Settings before syncing.\"]\n : []),\n \"\",\n \"What do you want to do?\",\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 { 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\nfunction throwIfAborted(signal?: AbortSignal) {\n if (!signal?.aborted) return;\n throw signal.reason instanceof Error ? signal.reason : new DOMException(\"The operation was aborted\", \"AbortError\");\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 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, 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 type { RunRoute } from \"./cancellable-operation.js\";\nimport { dispatchManagerResult } from \"./manager-result-dispatcher.js\";\nimport { showEditSyncSetupStorage, showSyncSetupManager } from \"./setup/setup-actions.js\";\nimport { AUTOMATIC_SYNC_DESCRIPTION } from \"./setup/setup-prompts.js\";\nimport { showStorageConnections } from \"./storage-connections-ui.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 | \"merge-settings\"\n | \"local-fields\"\n | \"content-policy\"\n | \"skip-secret-scan\"\n | \"show-status\"\n | \"on-switch\"\n | \"include\"\n | \"remote-include\"\n | \"storage-location\"\n | \"setups\"\n | \"connections\";\n const menu = defineMenu<Awaited<ReturnType<typeof loadConfig>>, \"settings\", Action, ExtensionCommandContext>({\n start: \"settings\",\n screens: {\n settings: ({ state }) => ({\n kind: \"settings\",\n title: \"Pi Sync Settings\",\n lines: [\n `Sync setup: ${safeTerminalText(state.setupName)} \u00B7 Storage connection: ${safeTerminalText(state.connectionName)}`,\n ],\n // Flat, searchable task ordering: Content, Destination, Automation, Merge, Other.\n // Kit has no heading rows; avoid focusable fake headings or a new component.\n items: [\n {\n id: \"include\",\n label: \"Included content\",\n description: `${state.include.length} selected path${state.include.length === 1 ? \"\" : \"s\"}. Choose which paths this setup syncs.`,\n currentValue: \"Open editor\",\n action: \"include\",\n },\n {\n id: \"remoteInclude\",\n label: \"Compare synced content\",\n description: \"Review this device and remote content lists before choosing either one.\",\n currentValue: \"Review\",\n action: \"remote-include\",\n },\n {\n id: \"localFields\",\n label: \"Machine-local settings fields\",\n description:\n \"Root field names omitted from future portable snapshots. Policy changes require 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: \"Destination: edit this setup's bucket, branch, or path; 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: \"Destination: add, switch, edit, or remove sync setups.\",\n currentValue: \"Open\",\n action: \"setups\",\n },\n {\n id: \"connections\",\n label: \"Manage storage connections\",\n description:\n \"Destination: manage shared server addresses and credentials; edits may affect multiple setups.\",\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: \"Automatic transfer at startup\",\n description:\n \"May upload, replace, or delete selected files once at idle startup in TUI/RPC. Requires a baseline and conditional/lease publication; never reloads resources. Turning off cancels pending work.\",\n currentValue: state.automaticTransfer ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"automatic-transfer\",\n },\n {\n id: \"onSwitch\",\n label: \"After switching setup (all setups)\",\n description: \"All setups: ask before a pull review, open it automatically, or switch without pulling.\",\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: \"Settings field merge (experimental)\",\n description:\n \"Combine independent global settings.json fields using a verified private ancestor; arrays and nested objects remain atomic. No reload.\",\n currentValue: state.mergeSettings ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"merge-settings\",\n },\n {\n id: \"contentPolicy\",\n label: \"Content / partial sync (experimental)\",\n description:\n \"Version-5 opt-in: bounded text and prefix-only sessions; partial progress keeps full withheld versions and old baseline hashes.\",\n currentValue: state.mergeContent\n ? state.partialSync\n ? \"Content & partial\"\n : \"Content only\"\n : state.partialSync\n ? \"Partial only\"\n : \"Off\",\n values: [\"Off\", \"Content only\", \"Content & partial\", \"Partial only\"],\n action: \"content-policy\",\n },\n {\n id: \"skipSecretScan\",\n label: \"Skip secret scan (all setups)\",\n description: \"All setups: allow pushes without checking managed local files for possible secrets.\",\n currentValue: state.skipSecretScan ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"skip-secret-scan\",\n },\n {\n id: \"showStatus\",\n label: \"Show status (all setups)\",\n description: \"All setups: show sync progress and attention in Pi status.\",\n currentValue: state.showStatus ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"show-status\",\n },\n ],\n }),\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 === \"Content only\" || value === \"Content & partial\";\n const partialSync = value === \"Partial only\" || value === \"Content & 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 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 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 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 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 \"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 \"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 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, 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 { 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 \"\",\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", "defineMenu", "runMenu", "defineMenu", "runMenu", "defineMenu", "runMenu", "defineMenu", "runMenu", "defineMenu", "runMenu", "disposition", "defineMenu", "runMenu"]
|
|
7
|
-
}
|