@narumitw/pi-sync 0.54.2 → 0.54.3
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 +19 -11
- package/dist/chunks/{chunk-ORQRHEEO.ts → chunk-26PMXY7E.ts} +3 -3
- package/dist/chunks/{chunk-SDZCTCYQ.ts → chunk-2FETCGGT.ts} +2 -2
- package/dist/chunks/{chunk-MYPSMJHJ.ts → chunk-35GM6XKM.ts} +275 -151
- package/dist/chunks/chunk-35GM6XKM.ts.map +7 -0
- package/dist/chunks/{chunk-V6VZ5TLG.ts → chunk-A3TFXY4O.ts} +2 -2
- package/dist/chunks/{chunk-5RZPINUQ.ts → chunk-AAZDBIBJ.ts} +2 -2
- package/dist/chunks/{chunk-5ZWQ33XL.ts → chunk-CAGJOKB7.ts} +5 -5
- package/dist/chunks/{chunk-QE7NZZWT.ts → chunk-E6ONFG57.ts} +15 -2
- package/dist/chunks/{chunk-QE7NZZWT.ts.map → chunk-E6ONFG57.ts.map} +2 -2
- package/dist/chunks/{chunk-IJ6VV6FN.ts → chunk-GC3QOL6J.ts} +2 -2
- package/dist/chunks/{chunk-VHXBCEVF.ts → chunk-HMXUKU43.ts} +3 -3
- package/dist/chunks/{chunk-4SBTAVFL.ts → chunk-I4JYVFUS.ts} +5 -6
- package/dist/chunks/chunk-I4JYVFUS.ts.map +7 -0
- package/dist/chunks/{chunk-2DI6PDZV.ts → chunk-ITFR6NNQ.ts} +14 -2
- package/dist/chunks/chunk-ITFR6NNQ.ts.map +7 -0
- package/dist/chunks/{chunk-3B4Z2SKV.ts → chunk-KATKRR3D.ts} +18 -11
- package/dist/chunks/chunk-KATKRR3D.ts.map +7 -0
- package/dist/chunks/{chunk-CL7BZRRQ.ts → chunk-KGE47GCZ.ts} +2 -2
- package/dist/chunks/{chunk-CHSIAC4N.ts → chunk-R35N4CL3.ts} +2 -2
- package/dist/chunks/chunk-UZPMDLTL.ts +54 -0
- package/dist/chunks/chunk-UZPMDLTL.ts.map +7 -0
- package/dist/chunks/{chunk-4QVPTIZB.ts → chunk-VCL7TZYW.ts} +2 -2
- package/dist/chunks/{chunk-WFKUKVCP.ts → chunk-XU2VXGQV.ts} +14 -8
- package/dist/chunks/chunk-XU2VXGQV.ts.map +7 -0
- package/dist/chunks/{chunk-UQ3ALBIB.ts → chunk-YTHQEW35.ts} +3 -3
- package/dist/chunks/{conflict-artifacts-BB2FZMIE.ts → conflict-artifacts-4CZFB7WI.ts} +3 -3
- package/dist/chunks/{conflict-review-4PLVLMRO.ts → conflict-review-ZOTOHL2E.ts} +11 -10
- package/dist/chunks/{conflict-review-4PLVLMRO.ts.map → conflict-review-ZOTOHL2E.ts.map} +1 -1
- package/dist/chunks/{file-selection-WZX7HAY2.ts → file-selection-UNHBVVON.ts} +3 -3
- package/dist/chunks/{manager-result-dispatcher-6MQKFCWB.ts → manager-result-dispatcher-HVRTPEVK.ts} +7 -7
- package/dist/chunks/{manager-ui-IURS4WXY.ts → manager-ui-ZIN4BUSF.ts} +297 -136
- package/dist/chunks/manager-ui-ZIN4BUSF.ts.map +7 -0
- package/dist/chunks/{merge-baseline-store-EVQAAML6.ts → merge-baseline-store-ICXVTCML.ts} +5 -3
- package/dist/chunks/{remote-selection-ui-6LJJ4IMQ.ts → remote-selection-ui-H6AEVA3Q.ts} +6 -6
- package/dist/chunks/{s3-backend-AQGV6LFT.ts → s3-backend-Y4P3O5B5.ts} +2 -2
- package/dist/chunks/{setup-switch-KTUWL6DE.ts → setup-switch-ZMW5C4M7.ts} +4 -4
- package/dist/chunks/{setup-wizard-GSDPDFC4.ts → setup-wizard-VW7F3JN4.ts} +5 -5
- package/dist/chunks/{sync-inspection-K45QVLHB.ts → sync-inspection-3EMS2J5B.ts} +5 -4
- package/dist/chunks/{sync-operations-47OUX76C.ts → sync-operations-2CWST333.ts} +140 -24
- package/dist/chunks/sync-operations-2CWST333.ts.map +7 -0
- package/dist/index.ts +103 -68
- package/dist/index.ts.map +2 -2
- package/docs/settings.md +47 -10
- package/docs/tui-contract.md +61 -0
- package/package.json +1 -1
- package/src/commands/command-execution.ts +2 -1
- package/src/commands/command-types.ts +4 -0
- package/src/commands/command.ts +3 -1
- package/src/settings/config.ts +13 -10
- package/src/settings/settings-store.ts +1 -0
- package/src/settings/settings-types.ts +2 -0
- package/src/settings/settings-validation.ts +3 -0
- package/src/state/merge-baseline-store.ts +18 -0
- package/src/sync/apply-review.ts +63 -0
- package/src/sync/automatic-sync.ts +45 -33
- package/src/sync/merged-sync.ts +202 -104
- package/src/sync/startup-check.ts +39 -21
- package/src/sync/startup-timings.ts +90 -0
- package/src/sync/sync-inspection.ts +8 -4
- package/src/sync/sync-mutations.ts +49 -11
- package/src/sync/sync-queries.ts +14 -3
- package/src/ui/manager-state.ts +10 -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/settings-frame.ts +55 -0
- package/src/ui/settings-ui.ts +141 -43
- package/src/ui/setup/setup-prompts.ts +4 -3
- package/src/ui/sync-behavior.ts +15 -0
- package/src/ui/sync-format.ts +69 -38
- 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-MYPSMJHJ.ts.map +0 -7
- package/dist/chunks/chunk-WFKUKVCP.ts.map +0 -7
- package/dist/chunks/manager-ui-IURS4WXY.ts.map +0 -7
- package/dist/chunks/sync-operations-47OUX76C.ts.map +0 -7
- /package/dist/chunks/{chunk-ORQRHEEO.ts.map → chunk-26PMXY7E.ts.map} +0 -0
- /package/dist/chunks/{chunk-SDZCTCYQ.ts.map → chunk-2FETCGGT.ts.map} +0 -0
- /package/dist/chunks/{chunk-V6VZ5TLG.ts.map → chunk-A3TFXY4O.ts.map} +0 -0
- /package/dist/chunks/{chunk-5RZPINUQ.ts.map → chunk-AAZDBIBJ.ts.map} +0 -0
- /package/dist/chunks/{chunk-5ZWQ33XL.ts.map → chunk-CAGJOKB7.ts.map} +0 -0
- /package/dist/chunks/{chunk-IJ6VV6FN.ts.map → chunk-GC3QOL6J.ts.map} +0 -0
- /package/dist/chunks/{chunk-VHXBCEVF.ts.map → chunk-HMXUKU43.ts.map} +0 -0
- /package/dist/chunks/{chunk-CL7BZRRQ.ts.map → chunk-KGE47GCZ.ts.map} +0 -0
- /package/dist/chunks/{chunk-CHSIAC4N.ts.map → chunk-R35N4CL3.ts.map} +0 -0
- /package/dist/chunks/{chunk-4QVPTIZB.ts.map → chunk-VCL7TZYW.ts.map} +0 -0
- /package/dist/chunks/{chunk-UQ3ALBIB.ts.map → chunk-YTHQEW35.ts.map} +0 -0
- /package/dist/chunks/{conflict-artifacts-BB2FZMIE.ts.map → conflict-artifacts-4CZFB7WI.ts.map} +0 -0
- /package/dist/chunks/{file-selection-WZX7HAY2.ts.map → file-selection-UNHBVVON.ts.map} +0 -0
- /package/dist/chunks/{manager-result-dispatcher-6MQKFCWB.ts.map → manager-result-dispatcher-HVRTPEVK.ts.map} +0 -0
- /package/dist/chunks/{merge-baseline-store-EVQAAML6.ts.map → merge-baseline-store-ICXVTCML.ts.map} +0 -0
- /package/dist/chunks/{remote-selection-ui-6LJJ4IMQ.ts.map → remote-selection-ui-H6AEVA3Q.ts.map} +0 -0
- /package/dist/chunks/{s3-backend-AQGV6LFT.ts.map → s3-backend-Y4P3O5B5.ts.map} +0 -0
- /package/dist/chunks/{setup-switch-KTUWL6DE.ts.map → setup-switch-ZMW5C4M7.ts.map} +0 -0
- /package/dist/chunks/{setup-wizard-GSDPDFC4.ts.map → setup-wizard-VW7F3JN4.ts.map} +0 -0
- /package/dist/chunks/{sync-inspection-K45QVLHB.ts.map → sync-inspection-3EMS2J5B.ts.map} +0 -0
|
@@ -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
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/sync/field-migration.ts", "../../src/sync/sync-mutations.ts", "../../src/sync/sync-queries.ts"],
|
|
4
|
-
"sourcesContent": ["import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport type { AnySyncConfig } from \"../settings/settings-types.js\";\nimport type { Snapshot } from \"../snapshot/snapshot-types.js\";\nimport type { SyncState } from \"../state/state-types.js\";\nimport { safeTerminalText } from \"../ui/terminal-text.js\";\nimport { sameLocalFields } from \"./local-fields.js\";\nimport { captureMutationOwner } from \"./sync-local.js\";\n\nexport async function confirmFieldMigration(\n ctx: ExtensionContext,\n config: AnySyncConfig,\n state: SyncState,\n remote: Snapshot | undefined,\n force: boolean,\n signal?: AbortSignal,\n) {\n if (remote?.localFields !== undefined && config.localFields === undefined)\n throw new Error(\n \"Portable snapshots require settings version 4 and explicit localFields rules on this machine; older policy must not replace local-only values.\",\n );\n const changed =\n (Boolean(state.lastAppliedSnapshot) && !sameLocalFields(state.localFields, config.localFields)) ||\n (remote !== undefined && !sameLocalFields(remote.localFields, config.localFields));\n if (!changed) return true;\n if (!force)\n throw new Error(\n \"Local-field policy changed; review an explicit push --force or pull --force migration. Old remote history is not erased.\",\n );\n const validate = captureMutationOwner(ctx, signal);\n if (!ctx.hasUI) throw new Error(\"Local-field migration requires observable TUI/RPC confirmation.\");\n validate();\n const confirmed = await ctx.ui.confirm(\n \"Migrate portable settings policy?\",\n `New machine-local fields: ${(config.localFields ?? []).map(safeTerminalText).join(\", \") || \"none\"}. Additions remove fields from future snapshots, not old history. Removals make local-only values portable again and a pull may replace them. The selected direction is authoritative; inspect /sync diff first. This confirmation is required even with --yes.`,\n { signal },\n );\n validate();\n return confirmed;\n}\n", "import type { ExtensionCommandContext, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { createSyncBackend, type SyncBackendFactory } from \"../backends/backend-factory.js\";\nimport {\n expectedRemoteHead,\n type PublishSnapshotResult,\n type RemoteHead,\n type SyncBackend,\n} from \"../backends/sync-backend.js\";\nimport type { CommandOptions } from \"../commands/command-types.js\";\nimport { loadConfig, syncCheckConfigFingerprint } from \"../settings/config.js\";\nimport type { AnySyncConfig } from \"../settings/settings-types.js\";\nimport { sessionDirForApply, snapshotOptionsForContext } from \"../snapshot/session-paths.js\";\nimport {\n createSnapshot,\n filterSnapshotForConfigPolicy,\n mergeRemotePreservedFiles,\n regenerateSnapshotIdentity,\n scanSnapshot,\n snapshotIncludesSessions,\n snapshotWithoutSessions,\n} from \"../snapshot/snapshot.js\";\nimport { applySnapshot } from \"../snapshot/snapshot-apply.js\";\nimport type { Snapshot } from \"../snapshot/snapshot-types.js\";\nimport { pruneMergeBaselines } from \"../state/merge-baseline-store.js\";\nimport type { SyncState } from \"../state/state-types.js\";\nimport { readStateForConfig, writeStateForConfig } from \"../state/sync-state-store.js\";\nimport {\n countPreservedRemoteFiles,\n formatPullSummary,\n formatPushSummary,\n formatRollbackSummary,\n} from \"../ui/sync-format.js\";\nimport { setSyncStatus } from \"../ui/sync-status.js\";\nimport { confirmFieldMigration } from \"./field-migration.js\";\nimport { overlayLocalFields, portableSnapshot, sameLocalFields, validatePortableSnapshot } from \"./local-fields.js\";\nimport { readMergeJournal, requireNoMergeJournal, retireMergeJournal } from \"./merge-journal.js\";\nimport { mergeSync } from \"./merged-sync.js\";\nimport { readRemoteSnapshot, readSnapshotForHead, requireCompatibleRemoteSelection } from \"./remote-snapshot.js\";\nimport { throwIfAborted } from \"./signals.js\";\nimport { createSyncDecision } from \"./sync-decision.js\";\nimport { errorMessage } from \"./sync-errors.js\";\n\nimport { backupLocal, captureMutationOwner, protectedSessionPaths } from \"./sync-local.js\";\nimport { inspectRemoteSelection } from \"./sync-policy.js\";\nimport {\n canPullRemoteSessionsOnFirstSync,\n canPullRemoteSettingsOnFirstSync,\n fileHashMap,\n hasLocalChanges,\n hasRemoteChanges,\n remoteChangedSinceState,\n sameHashes,\n shouldRefreshSyncedState,\n snapshotHashesMatchState,\n snapshotsMatch,\n syncPolicyChanged,\n} from \"./sync-state.js\";\n\nconst VERSION = 1;\nconst POST_LOCAL_COMMIT_TIMEOUT_MS = 30_000;\n\n/** Whole-direction acceptance must never forget withheld state without an explicit recovery choice. */\nfunction requireResolvedDirectionalProgress(state: SyncState, options: CommandOptions, allowForce = true) {\n if (state.unresolved?.length && (options.auto || !options.force || !allowForce))\n throw new Error(\n \"Unresolved partial conflicts remain. Review /sync conflicts or explicitly choose push --force or pull --force; automatic transfer and rollback cannot accept unresolved groups.\",\n );\n}\n\nexport class PublicationStatePersistenceError extends Error {\n readonly head: RemoteHead;\n readonly backupPath?: string;\n\n constructor(head: RemoteHead, cause: unknown, backupPath?: string) {\n super(\n `Remote publication ${head.snapshotId} is active, but local sync state could not be saved${backupPath ? `; local backup: ${backupPath}` : \"\"}: ${errorMessage(cause)}`,\n { cause },\n );\n this.name = \"PublicationStatePersistenceError\";\n this.head = head;\n this.backupPath = backupPath;\n }\n}\n\nexport class RollbackPublicationError extends Error {\n readonly backupPath: string;\n\n constructor(backupPath: string, cause: unknown) {\n super(`Rollback applied locally with backup ${backupPath}, but remote publication failed: ${errorMessage(cause)}`, {\n cause,\n });\n this.name = \"RollbackPublicationError\";\n this.backupPath = backupPath;\n }\n}\n\ninterface PushInput {\n config: AnySyncConfig;\n state: SyncState;\n local: Snapshot;\n backend?: SyncBackend;\n}\n\nexport async function push(\n ctx: ExtensionCommandContext | ExtensionContext,\n options: CommandOptions,\n input?: PushInput,\n factory: SyncBackendFactory = createSyncBackend,\n) {\n const validateMutation = captureMutationOwner(ctx, options.signal);\n const validateCommittedOwner = captureMutationOwner(ctx);\n const config = input?.config ?? (await loadConfig(options.setup));\n throwIfAborted(options.signal);\n await requireNoMergeJournal(config, options);\n const state = input?.state ?? (await readStateForConfig(config));\n validateMutation();\n requireResolvedDirectionalProgress(state, options);\n setSyncStatus(ctx, `pushing ${config.setupName}`);\n const backend = input?.backend ?? (await factory(config));\n throwIfAborted(options.signal);\n const localRaw =\n input?.local ?? (await createSnapshot(config.snapshotIdentity, snapshotOptionsForContext(ctx, config)));\n const local = portableSnapshot(localRaw, config.localFields);\n throwIfAborted(options.signal);\n\n let head = await backend.readHead(options.signal);\n let remoteForUpload = await readRemoteSnapshotForUpload(backend, config, head, state, options.signal);\n if (\n !options.force &&\n !remoteForUpload &&\n head?.selection &&\n inspectRemoteSelection(config.include, { selection: head.selection, files: [] }).kind === \"different\"\n ) {\n remoteForUpload = await readSnapshotForHead(backend, head, options.signal);\n }\n if (remoteForUpload && !options.force) {\n requireCompatibleRemoteSelection(config, remoteForUpload);\n }\n if (\n remoteChangedSinceState(head, state, config, (left, right) => backend.sameRevision(left, right)) &&\n !options.force\n ) {\n const remoteForConflict = remoteForUpload ? filterSnapshotForConfigPolicy(remoteForUpload, config) : undefined;\n if (!remoteForConflict || !snapshotHashesMatchState(remoteForConflict, state, config)) {\n throw createSyncDecision({\n kind: head ? \"remote-or-policy-changed\" : \"remote-empty\",\n config,\n state,\n local,\n remote: remoteForConflict,\n localChanged: hasLocalChanges(local, state, config),\n remoteChanged: true,\n directMessage: \"Remote or sync policy changed since last sync. Run /sync pull first or /sync push --force.\",\n });\n }\n }\n\n if (!remoteForUpload && head && config.localFields !== undefined)\n remoteForUpload = await readSnapshotForHead(backend, head, options.signal);\n if (!(await confirmFieldMigration(ctx, config, state, remoteForUpload, options.force, options.signal))) {\n setSyncStatus(ctx, undefined);\n return \"cancelled\" as const;\n }\n const configIdentity = syncCheckConfigFingerprint(config);\n let upload = await snapshotForUpload(backend, config, local, head, remoteForUpload, options.signal);\n if (!config.skipSecretScan) {\n const secrets = scanSnapshot(local);\n if (secrets.length > 0) {\n throw new Error(`Refusing to push possible secrets:\\n${secrets.map((s) => `- ${s}`).join(\"\\n\")}`);\n }\n }\n\n if (!(await confirmPush(ctx, options, config, backend, local, upload, head, remoteForUpload))) {\n return \"cancelled\" as const;\n }\n\n if (options.force) {\n const refreshedHead = await backend.readHead(options.signal);\n if (!sameRemoteHead(backend, head, refreshedHead)) {\n head = refreshedHead;\n remoteForUpload = head ? await readSnapshotForHead(backend, head, options.signal) : undefined;\n validateMutation();\n if (!(await confirmFieldMigration(ctx, config, state, remoteForUpload, options.force, options.signal))) {\n setSyncStatus(ctx, undefined);\n return \"cancelled\" as const;\n }\n validateMutation();\n upload = await snapshotForUpload(backend, config, local, head, remoteForUpload, options.signal);\n if (\n !(await confirmPush(\n ctx,\n options,\n config,\n backend,\n local,\n upload,\n head,\n remoteForUpload,\n \"Remote changed during review. Push the refreshed plan?\",\n ))\n ) {\n return \"cancelled\" as const;\n }\n }\n }\n\n validateMutation();\n if (configIdentity !== syncCheckConfigFingerprint(await loadConfig(options.setup)))\n throw new Error(\"Settings changed during push review.\");\n validateMutation();\n if (config.localFields !== undefined || (await readMergeJournal(config))) {\n const current = await createSnapshot(config.snapshotIdentity, snapshotOptionsForContext(ctx, config));\n if (!sameHashes(fileHashMap(current), fileHashMap(localRaw)))\n throw new Error(\"Local content changed during recovery review; retry from current bytes.\");\n }\n requireResolvedDirectionalProgress(await readStateForConfig(config), options);\n validateMutation();\n const result = await backend.publishSnapshot(upload, expectedRemoteHead(head), {\n signal: options.signal,\n onCommit: options.onCommit,\n });\n try {\n await writeStateForConfig(\n config,\n {\n version: VERSION,\n profile: config.snapshotIdentity,\n lastAppliedSnapshot: result.head.snapshotId,\n lastRemoteRevision: result.head.revision,\n lastFileHashes: fileHashMap(local),\n include: [...config.include],\n ...(config.localFields !== undefined ? { localFields: config.localFields } : {}),\n },\n local,\n validateCommittedOwner,\n );\n } catch (error) {\n throw new PublicationStatePersistenceError(result.head, error);\n }\n await retireMergeJournal(config);\n await pruneMergeBaselines(config, await readStateForConfig(config), validateCommittedOwner);\n validateCommittedOwner();\n if (options.signal?.aborted) return;\n setSyncStatus(ctx, undefined);\n if (!options.silent) {\n ctx.ui.notify(\n [\n `Pushed ${upload.files.length} files from sync setup \u201C${config.setupName}\u201D as ${result.head.snapshotId}.`,\n ...result.warnings,\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n result.warnings.length > 0 ? \"warning\" : \"info\",\n );\n }\n return \"applied\" as const;\n}\n\nexport async function pull(\n ctx: ExtensionCommandContext | ExtensionContext,\n options: CommandOptions,\n factory: SyncBackendFactory = createSyncBackend,\n) {\n const validateMutation = captureMutationOwner(ctx, options.signal);\n const validateCommittedOwner = captureMutationOwner(ctx);\n const config = await loadConfig(options.setup);\n throwIfAborted(options.signal);\n await requireNoMergeJournal(config, options);\n setSyncStatus(ctx, `pulling ${config.setupName}`);\n const backend = await factory(config);\n const state = await readStateForConfig(config);\n validateMutation();\n requireResolvedDirectionalProgress(state, options);\n const local = await createSnapshot(config.snapshotIdentity, snapshotOptionsForContext(ctx, config));\n throwIfAborted(options.signal);\n const { head, snapshot: remote } = await readRemoteSnapshot(backend, config, options.signal);\n throwIfAborted(options.signal);\n const localChanged = hasLocalChanges(local, state, config);\n if (!remote) {\n throw createSyncDecision({\n kind: \"remote-empty\",\n config,\n state,\n local,\n localChanged,\n remoteChanged: false,\n directMessage: \"Remote is empty. Run /sync push from a configured machine first.\",\n });\n }\n\n if (!sameLocalFields(config.localFields, remote.localFields)) {\n setSyncStatus(ctx, undefined);\n throw new Error(\n \"Pull requires the configured local-field policy to match the remote. To change the remote policy, review push --force from the authoritative machine first, then pull using matching rules; old history is not erased.\",\n );\n }\n if (!(await confirmFieldMigration(ctx, config, state, remote, options.force, options.signal))) {\n setSyncStatus(ctx, undefined);\n return \"cancelled\" as const;\n }\n const configIdentity = syncCheckConfigFingerprint(config);\n const logical = portableSnapshot(remote, config.localFields);\n const physical = overlayLocalFields(logical, local, config.localFields);\n const remoteChanged = hasRemoteChanges(remote, state, config, protectedSessionPaths(ctx));\n if (localChanged && remoteChanged && state.lastAppliedSnapshot && !options.force) {\n throw createSyncDecision({\n kind: \"both-changed\",\n config,\n state,\n local,\n remote,\n localChanged,\n remoteChanged,\n directMessage:\n \"Both local and remote changed since last sync. Run /sync diff, then choose /sync pull --force or /sync push --force.\",\n });\n }\n\n if (\n !options.yes &&\n !(await ctx.ui.confirm(\n snapshotIncludesSessions(remote) ? \"Pull pi settings and sessions?\" : \"Pull pi settings?\",\n formatPullSummary(config, backend.destination, local, physical, protectedSessionPaths(ctx).size),\n ))\n ) {\n setSyncStatus(ctx, undefined);\n ctx.ui.notify(\"Pull cancelled.\", \"info\");\n return \"cancelled\" as const;\n }\n\n throwIfAborted(options.signal);\n const recoveringMerge = Boolean(await readMergeJournal(config));\n const requireFreshRecovery = async () => {\n validateMutation();\n const currentHead = await backend.readHead(options.signal);\n validateMutation();\n const current = await createSnapshot(config.snapshotIdentity, snapshotOptionsForContext(ctx, config));\n validateMutation();\n if (!sameHashes(fileHashMap(current), fileHashMap(local)) || !sameRemoteHead(backend, head, currentHead)) {\n throw new Error(\"Local or remote content changed during recovery review; retry from a fresh diff.\");\n }\n };\n if (recoveringMerge) await requireFreshRecovery();\n if (configIdentity !== syncCheckConfigFingerprint(await loadConfig(options.setup)))\n throw new Error(\"Settings changed during pull review.\");\n validateMutation();\n const refreshed = await createSnapshot(config.snapshotIdentity, snapshotOptionsForContext(ctx, config));\n if (!sameHashes(fileHashMap(local), fileHashMap(refreshed)))\n throw new Error(\"Local bytes changed during pull review.\");\n if (!sameRemoteHead(backend, head, await backend.readHead(options.signal)))\n throw new Error(\"Remote changed during pull review.\");\n validateMutation();\n const backup = await backupLocal(config.snapshotIdentity, snapshotOptionsForContext(ctx, config), options.signal);\n const applySessionDir = await sessionDirForApply(ctx, physical);\n if (recoveringMerge) await requireFreshRecovery();\n requireResolvedDirectionalProgress(await readStateForConfig(config), options);\n validateMutation();\n options.onCommit?.();\n const lastFileHashes = await applySnapshot(physical, protectedSessionPaths(ctx), {\n include: config.include,\n sessionDir: applySessionDir,\n signal: options.signal,\n validateMutation,\n expectedFileHashes: config.localFields?.length\n ? { \"settings.json\": fileHashMap(local)[\"settings.json\"] ?? null }\n : undefined,\n });\n // Local installation is complete; user cancellation must not leave the baseline stale.\n validateCommittedOwner();\n await writeStateForConfig(\n config,\n {\n version: VERSION,\n profile: config.snapshotIdentity,\n lastAppliedSnapshot: remote.id,\n lastRemoteRevision: head?.revision,\n lastFileHashes: config.localFields?.length\n ? { ...lastFileHashes, \"settings.json\": fileHashMap(logical)[\"settings.json\"] }\n : lastFileHashes,\n include: [...config.include],\n ...(config.localFields !== undefined ? { localFields: config.localFields } : {}),\n },\n logical,\n validateCommittedOwner,\n );\n await retireMergeJournal(config);\n await pruneMergeBaselines(config, await readStateForConfig(config), validateCommittedOwner);\n validateCommittedOwner();\n if (options.signal?.aborted) return \"applied\" as const;\n setSyncStatus(ctx, undefined);\n if (!options.silent) {\n ctx.ui.notify(`Pulled ${remote.files.length} files from ${remote.id}. Backup: ${backup}`, \"info\");\n } else if (options.auto && config.include.includes(\"sessions\") && snapshotIncludesSessions(remote)) {\n ctx.ui.notify(\n \"Pulled Pi sessions after startup selected the current session. Restart Pi or resume a pulled session to use newly synced conversations.\",\n \"warning\",\n );\n }\n if (options.reload) await maybeReload(ctx, options.signal, validateMutation);\n return \"applied\" as const;\n}\n\nexport async function syncBoth(\n ctx: ExtensionCommandContext | ExtensionContext,\n options: CommandOptions,\n factory: SyncBackendFactory = createSyncBackend,\n) {\n const validateMutation = captureMutationOwner(ctx, options.signal);\n const config = await loadConfig(options.setup);\n throwIfAborted(options.signal);\n if (config.include.length > 0 && options.auto && config.automaticTransfer) return mergeSync(ctx, options, factory);\n if (!options.auto && config.include.length > 0 && (await readMergeJournal(config)))\n return mergeSync(ctx, options, factory);\n const state = await readStateForConfig(config);\n throwIfAborted(options.signal);\n if (!options.auto && config.include.length > 0 && state.lastAppliedSnapshot) return mergeSync(ctx, options, factory);\n const backend = await factory(config);\n const local = await createSnapshot(config.snapshotIdentity, snapshotOptionsForContext(ctx, config));\n throwIfAborted(options.signal);\n if (config.include.length === 0) {\n if (!options.silent) {\n ctx.ui.notify(\n `Sync setup \u201C${config.setupName}\u201D includes no files. Choose included content in /sync Settings before syncing.`,\n \"warning\",\n );\n }\n return;\n }\n const { head, snapshot: remote } = await readRemoteSnapshot(backend, config, options.signal);\n throwIfAborted(options.signal);\n const localChanged = hasLocalChanges(local, state, config);\n const remoteChanged = remote ? hasRemoteChanges(remote, state, config, protectedSessionPaths(ctx)) : false;\n const firstSync = !state.lastAppliedSnapshot;\n if (options.auto) throw new Error(\"Automatic transfer is not authorized by the current settings.\");\n\n const portableLocal = portableSnapshot(local, config.localFields);\n const acceptMatchingState = async (snapshot: Snapshot) => {\n requireCompatibleRemoteSelection(config, snapshot);\n const accepted = portableSnapshot(snapshot, config.localFields);\n if (state.lastAppliedSnapshot && !sameLocalFields(state.localFields, config.localFields))\n throw new Error(\"Local-field rules changed; review and confirm a directional migration first.\");\n await writeStateForConfig(\n config,\n {\n version: VERSION,\n profile: config.snapshotIdentity,\n lastAppliedSnapshot: snapshot.id,\n lastRemoteRevision: head?.revision,\n lastFileHashes: fileHashMap(accepted),\n include: [...config.include],\n ...(config.localFields !== undefined ? { localFields: config.localFields } : {}),\n },\n accepted,\n validateMutation,\n );\n await pruneMergeBaselines(config, await readStateForConfig(config), validateMutation);\n validateMutation();\n };\n if (firstSync && remote && remote.files.length > 0 && local.files.length > 0) {\n requireCompatibleRemoteSelection(config, remote);\n const portableRemote = portableSnapshot(remote, config.localFields);\n if (!canPullRemoteSettingsOnFirstSync(portableLocal, portableRemote)) {\n throw createSyncDecision({\n kind: \"first-sync-settings-diverged\",\n config,\n state,\n local,\n remote,\n localChanged: true,\n remoteChanged: true,\n directMessage:\n \"Remote settings exist and this machine has different local Pi settings. Run /sync diff, then manually choose /sync pull or /sync push.\",\n });\n }\n if (!sameHashes(fileHashMap(portableLocal), fileHashMap(portableRemote))) {\n if (!canPullRemoteSessionsOnFirstSync(portableLocal, portableRemote)) {\n throw createSyncDecision({\n kind: \"first-sync-sessions-diverged\",\n config,\n state,\n local,\n remote,\n localChanged: true,\n remoteChanged: true,\n directMessage:\n \"Remote settings match, but local and remote Pi sessions differ. Run /sync diff, then manually choose /sync pull or /sync push.\",\n });\n }\n await pull(ctx, options, factory);\n return;\n }\n await acceptMatchingState(remote);\n if (!options.silent) ctx.ui.notify(\"pi-sync state initialized; local settings already match remote.\", \"info\");\n return;\n }\n if (\n localChanged &&\n remoteChanged &&\n remote &&\n snapshotsMatch(portableLocal, portableSnapshot(remote, remote.localFields))\n ) {\n requireCompatibleRemoteSelection(config, remote);\n await acceptMatchingState(remote);\n if (!options.silent) ctx.ui.notify(\"pi-sync is already up to date.\", \"info\");\n return;\n }\n if (localChanged && remoteChanged && state.lastAppliedSnapshot) {\n throw createSyncDecision({\n kind: \"both-changed\",\n config,\n state,\n local,\n remote,\n localChanged,\n remoteChanged,\n directMessage: \"Both local and remote changed. Run /sync diff and resolve with push --force or pull --force.\",\n });\n }\n if (remoteChanged) {\n await pull(ctx, options, factory);\n return;\n }\n if (localChanged || !remote) {\n await push(ctx, options, undefined, factory);\n return;\n }\n if (shouldRefreshSyncedState(remote, head, state, config, (left, right) => backend.sameRevision(left, right))) {\n await acceptMatchingState(remote);\n }\n if (!options.silent) ctx.ui.notify(\"pi-sync is already up to date.\", \"info\");\n}\n\nexport async function rollback(\n ctx: ExtensionCommandContext,\n options: CommandOptions,\n factory: SyncBackendFactory = createSyncBackend,\n expectedSelection?: { backendIdentity: string; setup?: string },\n) {\n const validateMutation = captureMutationOwner(ctx, options.signal);\n const validateCommittedOwner = captureMutationOwner(ctx);\n const target = options.args[0];\n if (!target) throw new Error(\"Usage: /sync rollback <snapshot-id> [--yes]\");\n\n const config = await loadConfig(options.setup);\n throwIfAborted(options.signal);\n const backend = await factory(config);\n if (\n expectedSelection &&\n (backend.identity !== expectedSelection.backendIdentity || config.setupName !== expectedSelection.setup)\n ) {\n throw new Error(\"Sync setup or storage location changed while history was open; reopen history and retry.\");\n }\n // --force is only a rollback compatibility flag, not a reviewed merge-recovery direction.\n await requireNoMergeJournal(config);\n const state = await readStateForConfig(config);\n validateMutation();\n requireResolvedDirectionalProgress(state, options, false);\n const decoded = await backend.readSnapshot(target, options.signal);\n validatePortableSnapshot(decoded);\n if (!sameLocalFields(decoded.localFields, config.localFields))\n throw new Error(\n \"Rollback requires the historical snapshot local-field policy to match the configured rules. Review push --force from current local bytes to migrate policy first; choose matching history afterward.\",\n );\n const selected = filterSnapshotForConfigPolicy(\n config.include.includes(\"sessions\") ? decoded : snapshotWithoutSessions(decoded),\n config,\n );\n const remote = portableSnapshot(regenerateSnapshotIdentity(selected), config.localFields);\n const local = await createSnapshot(config.snapshotIdentity, snapshotOptionsForContext(ctx, config));\n const expectedHead = await backend.readHead(options.signal);\n const currentRemote = expectedHead ? await readSnapshotForHead(backend, expectedHead, options.signal) : undefined;\n validateMutation();\n if (!(await confirmFieldMigration(ctx, config, state, currentRemote, true, options.signal))) return;\n validateMutation();\n const physical = overlayLocalFields(remote, local, config.localFields);\n\n if (!options.yes) {\n const confirmed = await ctx.ui.confirm(\n snapshotIncludesSessions(remote) ? \"Rollback pi settings and sessions?\" : \"Rollback pi settings?\",\n formatRollbackSummary(config, backend.destination, local, physical, target, protectedSessionPaths(ctx).size),\n { signal: options.signal },\n );\n validateMutation();\n if (!confirmed) {\n ctx.ui.notify(\"Rollback cancelled.\", \"info\");\n return;\n }\n }\n\n validateMutation();\n const currentLocal = await createSnapshot(config.snapshotIdentity, snapshotOptionsForContext(ctx, config));\n if (!sameHashes(fileHashMap(currentLocal), fileHashMap(local)))\n throw new Error(\"Local bytes changed during rollback review.\");\n if (syncCheckConfigFingerprint(config) !== syncCheckConfigFingerprint(await loadConfig(options.setup)))\n throw new Error(\"Settings changed during rollback review.\");\n if (!sameRemoteHead(backend, expectedHead, await backend.readHead(options.signal)))\n throw new Error(\"Remote changed during rollback review.\");\n validateMutation();\n throwIfAborted(options.signal);\n const backup = await backupLocal(config.snapshotIdentity, snapshotOptionsForContext(ctx, config), options.signal);\n const applySessionDir = await sessionDirForApply(ctx, remote);\n requireResolvedDirectionalProgress(await readStateForConfig(config), options, false);\n validateMutation();\n options.onCommit?.();\n const lastFileHashes = await applySnapshot(physical, protectedSessionPaths(ctx), {\n include: config.include,\n sessionDir: applySessionDir,\n signal: options.signal,\n validateMutation,\n expectedFileHashes: config.localFields?.length\n ? { \"settings.json\": fileHashMap(local)[\"settings.json\"] ?? null }\n : undefined,\n });\n // The local transaction is retired; finish publication despite caller cancellation.\n validateCommittedOwner();\n let result: PublishSnapshotResult;\n try {\n const completionSignal = AbortSignal.timeout(POST_LOCAL_COMMIT_TIMEOUT_MS);\n const upload = await snapshotForUpload(backend, config, remote, expectedHead, currentRemote, completionSignal);\n validateCommittedOwner();\n result = await backend.publishSnapshot(upload, expectedRemoteHead(expectedHead), {\n signal: completionSignal,\n });\n } catch (error) {\n throw new RollbackPublicationError(backup, error);\n }\n try {\n await writeStateForConfig(\n config,\n {\n version: VERSION,\n profile: config.snapshotIdentity,\n lastAppliedSnapshot: result.head.snapshotId,\n lastRemoteRevision: result.head.revision,\n lastFileHashes: config.localFields?.length\n ? { ...lastFileHashes, \"settings.json\": fileHashMap(remote)[\"settings.json\"] }\n : lastFileHashes,\n include: [...config.include],\n ...(config.localFields !== undefined ? { localFields: config.localFields } : {}),\n },\n remote,\n validateCommittedOwner,\n );\n } catch (error) {\n throw new PublicationStatePersistenceError(result.head, error, backup);\n }\n await retireMergeJournal(config);\n await pruneMergeBaselines(config, await readStateForConfig(config), validateCommittedOwner);\n validateCommittedOwner();\n if (options.signal?.aborted) return;\n ctx.ui.notify(\n [\n `Rolled back sync setup \u201C${config.setupName}\u201D to ${target}; latest: ${result.head.snapshotId}. Backup: ${backup}`,\n ...result.warnings,\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n result.warnings.length > 0 ? \"warning\" : \"info\",\n );\n await maybeReload(ctx, options.signal, validateMutation);\n}\n\nasync function maybeReload(\n ctx: ExtensionCommandContext | ExtensionContext,\n signal?: AbortSignal,\n validateMutation = captureMutationOwner(ctx, signal),\n) {\n if (signal?.aborted || !(\"reload\" in ctx)) return;\n validateMutation();\n if (\n ctx.hasUI &&\n (await ctx.ui.confirm(\n \"Reload Pi resources now?\",\n \"This reloads extensions, skills, prompts, themes, and context files.\",\n ))\n ) {\n if (signal?.aborted) return;\n validateMutation();\n await ctx.reload();\n }\n}\n\nasync function readRemoteSnapshotForUpload(\n backend: SyncBackend,\n config: AnySyncConfig,\n head: RemoteHead | undefined,\n state: SyncState,\n signal?: AbortSignal,\n) {\n if (\n !head ||\n (head.snapshotId === state.lastAppliedSnapshot &&\n !syncPolicyChanged(state, config) &&\n (!state.lastRemoteRevision || backend.sameRevision(head.revision, state.lastRemoteRevision)))\n ) {\n return undefined;\n }\n return readSnapshotForHead(backend, head, signal);\n}\n\nasync function snapshotForUpload(\n backend: SyncBackend,\n config: AnySyncConfig,\n local: Snapshot,\n head: RemoteHead | undefined,\n remote?: Snapshot,\n signal?: AbortSignal,\n) {\n if (!head) return local;\n const snapshot = remote ?? (await readSnapshotForHead(backend, head, signal));\n return mergeRemotePreservedFiles(local, snapshot, config);\n}\n\nasync function confirmPush(\n ctx: ExtensionCommandContext | ExtensionContext,\n options: CommandOptions,\n config: AnySyncConfig,\n backend: SyncBackend,\n local: Snapshot,\n upload: Snapshot,\n head: RemoteHead | undefined,\n remote: Snapshot | undefined,\n title = snapshotIncludesSessions(upload) ? \"Push pi settings and sessions?\" : \"Push pi settings?\",\n) {\n throwIfAborted(options.signal);\n if (options.yes) return true;\n const confirmed = await ctx.ui.confirm(\n title,\n formatPushSummary(config, backend.destination, upload, head, countPreservedRemoteFiles(local, upload), remote),\n );\n throwIfAborted(options.signal);\n if (confirmed) return true;\n setSyncStatus(ctx, undefined);\n ctx.ui.notify(\"Push cancelled.\", \"info\");\n return false;\n}\n\nfunction sameRemoteHead(backend: SyncBackend, left: RemoteHead | undefined, right: RemoteHead | undefined) {\n if (!left || !right) return left === right;\n return backend.sameRevision(left.revision, right.revision);\n}\n\nexport { backupLocal } from \"./sync-local.js\";\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { createSyncBackend, type SyncBackendFactory } from \"../backends/backend-factory.js\";\nimport type { SyncBackend } from \"../backends/sync-backend.js\";\nimport type { CommandOptions } from \"../commands/command-types.js\";\nimport { loadConfig, syncSessionsWarnings } from \"../settings/config.js\";\nimport { snapshotOptionsForContext } from \"../snapshot/session-paths.js\";\nimport { createSnapshot, scanSnapshot } from \"../snapshot/snapshot.js\";\nimport type { SnapshotOptions } from \"../snapshot/snapshot-types.js\";\nimport { inspectLock, isLockGuardHeld, isStaleLock, withLock } from \"../state/lock.js\";\nimport { formatDiff, formatSnapshotOnlyDiff, publicationCapabilityDescription } from \"../ui/sync-format.js\";\nimport { setSyncStatus } from \"../ui/sync-status.js\";\nimport { safeTerminalText } from \"../ui/terminal-text.js\";\nimport { portableSnapshot } from \"./local-fields.js\";\nimport { formatRemoteSelectionStatus, readRemoteSnapshot } from \"./remote-snapshot.js\";\nimport { throwIfAborted } from \"./signals.js\";\nimport { errorMessage } from \"./sync-errors.js\";\nimport { inspectSync } from \"./sync-inspection.js\";\nimport { rollback } from \"./sync-mutations.js\";\n\nconst DEFAULT_PROFILE = \"default\";\n\nexport async function status(\n ctx: ExtensionCommandContext,\n options: CommandOptions,\n factory: SyncBackendFactory = createSyncBackend,\n) {\n const config = await loadConfig(options.setup);\n throwIfAborted(options.signal);\n setSyncStatus(ctx, `checking ${config.setupName}`);\n const { head, selectionState, localChanged, remoteChanged, localFiles, destination, capability } = await inspectSync(\n config,\n snapshotOptionsForContext(ctx, config),\n options.signal,\n factory,\n );\n throwIfAborted(options.signal);\n\n const remoteText = head ? `remote: ${head.snapshotId} from ${head.machine} at ${head.createdAt}` : \"remote: empty\";\n const warnings = syncSessionsWarnings(config);\n setSyncStatus(ctx, undefined);\n ctx.ui.notify(\n [\n `sync setup: ${config.setupName}`,\n `storage connection: ${config.connectionName}`,\n `storage location: ${safeTerminalText(destination)}`,\n `publication safety: ${publicationCapabilityDescription(capability)}`,\n `included content: ${config.include.join(\", \") || \"none\"}`,\n `sessions: ${config.include.includes(\"sessions\") ? \"included\" : \"excluded\"}`,\n remoteText,\n formatRemoteSelectionStatus(selectionState),\n `local files: ${localFiles}`,\n `local changed since last sync: ${localChanged ? \"yes\" : \"no\"}`,\n `remote changed since last sync: ${remoteChanged ? \"yes\" : \"no\"}`,\n ...warnings,\n ].join(\"\\n\"),\n localChanged || remoteChanged || selectionState?.kind === \"different\" || warnings.length > 0 ? \"warning\" : \"info\",\n );\n}\n\nexport async function diff(\n ctx: ExtensionCommandContext,\n options: CommandOptions,\n factory: SyncBackendFactory = createSyncBackend,\n) {\n const config = await loadConfig(options.setup);\n throwIfAborted(options.signal);\n setSyncStatus(ctx, `checking ${config.setupName}`);\n const backend = await factory(config);\n const local = portableSnapshot(\n await createSnapshot(config.snapshotIdentity, snapshotOptionsForContext(ctx, config)),\n config.localFields,\n );\n throwIfAborted(options.signal);\n const { snapshot: remote, selectionState } = await readRemoteSnapshot(backend, config, options.signal, {\n allowSelectionDifference: true,\n });\n throwIfAborted(options.signal);\n setSyncStatus(ctx, undefined);\n\n const warnings = syncSessionsWarnings(config);\n const header = [\n `sync setup: ${config.setupName}`,\n `storage connection: ${config.connectionName}`,\n `storage location: ${safeTerminalText(backend.destination)}`,\n `included content: ${config.include.join(\", \") || \"none\"}`,\n `sessions: ${config.include.includes(\"sessions\") ? \"included\" : \"excluded\"}`,\n formatRemoteSelectionStatus(selectionState),\n ...warnings,\n ].join(\"\\n\");\n const level = warnings.length > 0 || selectionState?.kind === \"different\" ? \"warning\" : \"info\";\n if (!remote) {\n ctx.ui.notify(`${header}\\n\\n${formatSnapshotOnlyDiff(\"Remote is empty. Local push would upload\", local)}`, level);\n return;\n }\n\n ctx.ui.notify(`${header}\\n\\n${formatDiff(local, portableSnapshot(remote, remote.localFields))}`, level);\n}\n\nexport async function doctor(\n ctx: ExtensionCommandContext,\n options: CommandOptions,\n factory: SyncBackendFactory = createSyncBackend,\n) {\n const messages: string[] = [];\n let level: \"info\" | \"warning\" = \"info\";\n let snapshotOptions: SnapshotOptions = {};\n let profile = DEFAULT_PROFILE;\n let backend: SyncBackend | undefined;\n let backendSummary: string[] = [];\n\n try {\n const config = await loadConfig(options.setup);\n throwIfAborted(options.signal);\n backend = await factory(config);\n profile = config.snapshotIdentity;\n snapshotOptions = snapshotOptionsForContext(ctx, config);\n messages.push(\n `config: ok (sync setup ${config.setupName})`,\n `included content: ${config.include.join(\", \") || \"none\"}`,\n `sessions: ${config.include.includes(\"sessions\") ? \"included\" : \"excluded\"}`,\n );\n backendSummary = [\n `storage location: ${safeTerminalText(backend.destination)}`,\n `publication safety: ${publicationCapabilityDescription(backend.capability)}`,\n ];\n const warnings = syncSessionsWarnings(config);\n if (warnings.length > 0) {\n level = \"warning\";\n messages.push(...warnings);\n }\n } catch (error) {\n throwIfAborted(options.signal);\n level = \"warning\";\n messages.push(`config: ${errorMessage(error)}`);\n }\n\n const local = await createSnapshot(profile, snapshotOptions);\n throwIfAborted(options.signal);\n const secrets = scanSnapshot(local);\n if (secrets.length > 0) {\n level = \"warning\";\n messages.push(\"secret scan: possible secrets found:\");\n messages.push(...secrets.map((secret) => `- ${secret}`));\n } else {\n messages.push(`secret scan: ok (${local.files.length} files checked)`);\n }\n\n const lock = await inspectLock();\n throwIfAborted(options.signal);\n if (lock.status === \"valid\" && isStaleLock(lock.lock)) {\n level = \"warning\";\n messages.push(`lock: stale (pid ${lock.lock.pid}); run /sync unlock --stale after verifying no sync is running`);\n } else if (lock.status === \"valid\") {\n messages.push(`lock: held by pid ${lock.lock.pid} since ${lock.lock.startedAt}`);\n } else if (lock.status === \"unreadable\") {\n level = \"warning\";\n messages.push(\"lock: unreadable; use /sync unlock --stale only after verifying no sync is running\");\n } else if (await isLockGuardHeld()) {\n throwIfAborted(options.signal);\n level = \"warning\";\n messages.push(\"lock: guard active while metadata is missing or still being initialized\");\n } else {\n messages.push(\"lock: free\");\n }\n\n if (backend) {\n messages.push(...backendSummary);\n const diagnostics = await backend.diagnose(options.signal);\n throwIfAborted(options.signal);\n for (const diagnostic of diagnostics) {\n messages.push(diagnostic.message);\n if (diagnostic.level !== \"info\") level = \"warning\";\n }\n }\n ctx.ui.notify(messages.join(\"\\n\"), level);\n}\n\nexport async function history(\n ctx: ExtensionCommandContext,\n options: CommandOptions,\n factory: SyncBackendFactory = createSyncBackend,\n) {\n const config = await loadConfig(options.setup);\n throwIfAborted(options.signal);\n const backend = await factory(config);\n const snapshots = (await backend.listHistory(options.signal)).slice(-20).reverse();\n throwIfAborted(options.signal);\n if (snapshots.length === 0) {\n ctx.ui.notify(\"No remote pi-sync history found.\", \"info\");\n return;\n }\n\n const currentSnapshot = snapshots[0]?.snapshotId;\n if (ctx.mode === \"tui\") {\n const labels = snapshots.map(\n (item, index) =>\n `${index + 1}. ${item.createdAt} \u00B7 ${safeTerminalText(item.machine)} \u00B7 ${item.snapshotId}${item.snapshotId === currentSnapshot ? \" (current)\" : \"\"}${item.syncSessions ? \" \u00B7 sessions\" : \"\"}`,\n );\n const selected = await ctx.ui.select(\n `History for sync setup \u201C${safeTerminalText(config.setupName)}\u201D\\n\\nChoose a snapshot to preview rollback.`,\n [...labels, \"Back\"],\n { signal: options.signal },\n );\n if (!selected || selected === \"Back\") return;\n throwIfAborted(options.signal);\n const index = labels.indexOf(selected);\n const snapshot = snapshots[index];\n if (!snapshot) return;\n await withLock(\"rollback\", () =>\n rollback(ctx, { ...options, args: [snapshot.snapshotRef], yes: false }, factory, {\n backendIdentity: backend.identity,\n setup: config.setupName,\n }),\n );\n return;\n }\n ctx.ui.notify(\n snapshots.map((item) => `${item.snapshotRef} ${item.createdAt} ${safeTerminalText(item.machine)}`).join(\"\\n\"),\n \"info\",\n );\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,eAAsB,sBACpB,KACA,QACA,OACA,QACA,OACA,QACA;AACA,MAAI,QAAQ,gBAAgB,UAAa,OAAO,gBAAgB;AAC9D,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,QAAM,UACH,QAAQ,MAAM,mBAAmB,KAAK,CAAC,gBAAgB,MAAM,aAAa,OAAO,WAAW,KAC5F,WAAW,UAAa,CAAC,gBAAgB,OAAO,aAAa,OAAO,WAAW;AAClF,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,CAAC;AACH,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,QAAM,WAAW,qBAAqB,KAAK,MAAM;AACjD,MAAI,CAAC,IAAI,MAAO,OAAM,IAAI,MAAM,iEAAiE;AACjG,WAAS;AACT,QAAM,YAAY,MAAM,IAAI,GAAG;AAAA,IAC7B;AAAA,IACA,8BAA8B,OAAO,eAAe,CAAC,GAAG,IAAI,gBAAgB,EAAE,KAAK,IAAI,KAAK,MAAM;AAAA,IAClG,EAAE,OAAO;AAAA,EACX;AACA,WAAS;AACT,SAAO;AACT;;;ACoBA,IAAM,UAAU;AAChB,IAAM,+BAA+B;AAGrC,SAAS,mCAAmC,OAAkB,SAAyB,aAAa,MAAM;AACxG,MAAI,MAAM,YAAY,WAAW,QAAQ,QAAQ,CAAC,QAAQ,SAAS,CAAC;AAClE,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACJ;AAEO,IAAM,mCAAN,cAA+C,MAAM;AAAA,EACjD;AAAA,EACA;AAAA,EAET,YAAY,MAAkB,OAAgB,YAAqB;AACjE;AAAA,MACE,sBAAsB,KAAK,UAAU,sDAAsD,aAAa,mBAAmB,UAAU,KAAK,EAAE,KAAK,aAAa,KAAK,CAAC;AAAA,MACpK,EAAE,MAAM;AAAA,IACV;AACA,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,aAAa;AAAA,EACpB;AACF;AAEO,IAAM,2BAAN,cAAuC,MAAM;AAAA,EACzC;AAAA,EAET,YAAY,YAAoB,OAAgB;AAC9C,UAAM,wCAAwC,UAAU,oCAAoC,aAAa,KAAK,CAAC,IAAI;AAAA,MACjH;AAAA,IACF,CAAC;AACD,SAAK,OAAO;AACZ,SAAK,aAAa;AAAA,EACpB;AACF;AASA,eAAsB,KACpB,KACA,SACA,OACA,UAA8B,mBAC9B;AACA,QAAM,mBAAmB,qBAAqB,KAAK,QAAQ,MAAM;AACjE,QAAM,yBAAyB,qBAAqB,GAAG;AACvD,QAAM,SAAS,OAAO,UAAW,MAAM,WAAW,QAAQ,KAAK;AAC/D,iBAAe,QAAQ,MAAM;AAC7B,QAAM,sBAAsB,QAAQ,OAAO;AAC3C,QAAM,QAAQ,OAAO,SAAU,MAAM,mBAAmB,MAAM;AAC9D,mBAAiB;AACjB,qCAAmC,OAAO,OAAO;AACjD,gBAAc,KAAK,WAAW,OAAO,SAAS,EAAE;AAChD,QAAM,UAAU,OAAO,WAAY,MAAM,QAAQ,MAAM;AACvD,iBAAe,QAAQ,MAAM;AAC7B,QAAM,WACJ,OAAO,SAAU,MAAM,eAAe,OAAO,kBAAkB,0BAA0B,KAAK,MAAM,CAAC;AACvG,QAAM,QAAQ,iBAAiB,UAAU,OAAO,WAAW;AAC3D,iBAAe,QAAQ,MAAM;AAE7B,MAAI,OAAO,MAAM,QAAQ,SAAS,QAAQ,MAAM;AAChD,MAAI,kBAAkB,MAAM,4BAA4B,SAAS,QAAQ,MAAM,OAAO,QAAQ,MAAM;AACpG,MACE,CAAC,QAAQ,SACT,CAAC,mBACD,MAAM,aACN,uBAAuB,OAAO,SAAS,EAAE,WAAW,KAAK,WAAW,OAAO,CAAC,EAAE,CAAC,EAAE,SAAS,aAC1F;AACA,sBAAkB,MAAM,oBAAoB,SAAS,MAAM,QAAQ,MAAM;AAAA,EAC3E;AACA,MAAI,mBAAmB,CAAC,QAAQ,OAAO;AACrC,qCAAiC,QAAQ,eAAe;AAAA,EAC1D;AACA,MACE,wBAAwB,MAAM,OAAO,QAAQ,CAAC,MAAM,UAAU,QAAQ,aAAa,MAAM,KAAK,CAAC,KAC/F,CAAC,QAAQ,OACT;AACA,UAAM,oBAAoB,kBAAkB,8BAA8B,iBAAiB,MAAM,IAAI;AACrG,QAAI,CAAC,qBAAqB,CAAC,yBAAyB,mBAAmB,OAAO,MAAM,GAAG;AACrF,YAAM,mBAAmB;AAAA,QACvB,MAAM,OAAO,6BAA6B;AAAA,QAC1C;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,cAAc,gBAAgB,OAAO,OAAO,MAAM;AAAA,QAClD,eAAe;AAAA,QACf,eAAe;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,CAAC,mBAAmB,QAAQ,OAAO,gBAAgB;AACrD,sBAAkB,MAAM,oBAAoB,SAAS,MAAM,QAAQ,MAAM;AAC3E,MAAI,CAAE,MAAM,sBAAsB,KAAK,QAAQ,OAAO,iBAAiB,QAAQ,OAAO,QAAQ,MAAM,GAAI;AACtG,kBAAc,KAAK,MAAS;AAC5B,WAAO;AAAA,EACT;AACA,QAAM,iBAAiB,2BAA2B,MAAM;AACxD,MAAI,SAAS,MAAM,kBAAkB,SAAS,QAAQ,OAAO,MAAM,iBAAiB,QAAQ,MAAM;AAClG,MAAI,CAAC,OAAO,gBAAgB;AAC1B,UAAM,UAAU,aAAa,KAAK;AAClC,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,IAAI,MAAM;AAAA,EAAuC,QAAQ,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,IAClG;AAAA,EACF;AAEA,MAAI,CAAE,MAAM,YAAY,KAAK,SAAS,QAAQ,SAAS,OAAO,QAAQ,MAAM,eAAe,GAAI;AAC7F,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,OAAO;AACjB,UAAM,gBAAgB,MAAM,QAAQ,SAAS,QAAQ,MAAM;AAC3D,QAAI,CAAC,eAAe,SAAS,MAAM,aAAa,GAAG;AACjD,aAAO;AACP,wBAAkB,OAAO,MAAM,oBAAoB,SAAS,MAAM,QAAQ,MAAM,IAAI;AACpF,uBAAiB;AACjB,UAAI,CAAE,MAAM,sBAAsB,KAAK,QAAQ,OAAO,iBAAiB,QAAQ,OAAO,QAAQ,MAAM,GAAI;AACtG,sBAAc,KAAK,MAAS;AAC5B,eAAO;AAAA,MACT;AACA,uBAAiB;AACjB,eAAS,MAAM,kBAAkB,SAAS,QAAQ,OAAO,MAAM,iBAAiB,QAAQ,MAAM;AAC9F,UACE,CAAE,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,GACA;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,mBAAiB;AACjB,MAAI,mBAAmB,2BAA2B,MAAM,WAAW,QAAQ,KAAK,CAAC;AAC/E,UAAM,IAAI,MAAM,sCAAsC;AACxD,mBAAiB;AACjB,MAAI,OAAO,gBAAgB,UAAc,MAAM,iBAAiB,MAAM,GAAI;AACxE,UAAM,UAAU,MAAM,eAAe,OAAO,kBAAkB,0BAA0B,KAAK,MAAM,CAAC;AACpG,QAAI,CAAC,WAAW,YAAY,OAAO,GAAG,YAAY,QAAQ,CAAC;AACzD,YAAM,IAAI,MAAM,yEAAyE;AAAA,EAC7F;AACA,qCAAmC,MAAM,mBAAmB,MAAM,GAAG,OAAO;AAC5E,mBAAiB;AACjB,QAAM,SAAS,MAAM,QAAQ,gBAAgB,QAAQ,mBAAmB,IAAI,GAAG;AAAA,IAC7E,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,EACpB,CAAC;AACD,MAAI;AACF,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,SAAS,OAAO;AAAA,QAChB,qBAAqB,OAAO,KAAK;AAAA,QACjC,oBAAoB,OAAO,KAAK;AAAA,QAChC,gBAAgB,YAAY,KAAK;AAAA,QACjC,SAAS,CAAC,GAAG,OAAO,OAAO;AAAA,QAC3B,GAAI,OAAO,gBAAgB,SAAY,EAAE,aAAa,OAAO,YAAY,IAAI,CAAC;AAAA,MAChF;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,IAAI,iCAAiC,OAAO,MAAM,KAAK;AAAA,EAC/D;AACA,QAAM,mBAAmB,MAAM;AAC/B,QAAM,oBAAoB,QAAQ,MAAM,mBAAmB,MAAM,GAAG,sBAAsB;AAC1F,yBAAuB;AACvB,MAAI,QAAQ,QAAQ,QAAS;AAC7B,gBAAc,KAAK,MAAS;AAC5B,MAAI,CAAC,QAAQ,QAAQ;AACnB,QAAI,GAAG;AAAA,MACL;AAAA,QACE,UAAU,OAAO,MAAM,MAAM,gCAA2B,OAAO,SAAS,aAAQ,OAAO,KAAK,UAAU;AAAA,QACtG,GAAG,OAAO;AAAA,MACZ,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,MACZ,OAAO,SAAS,SAAS,IAAI,YAAY;AAAA,IAC3C;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,KACpB,KACA,SACA,UAA8B,mBAC9B;AACA,QAAM,mBAAmB,qBAAqB,KAAK,QAAQ,MAAM;AACjE,QAAM,yBAAyB,qBAAqB,GAAG;AACvD,QAAM,SAAS,MAAM,WAAW,QAAQ,KAAK;AAC7C,iBAAe,QAAQ,MAAM;AAC7B,QAAM,sBAAsB,QAAQ,OAAO;AAC3C,gBAAc,KAAK,WAAW,OAAO,SAAS,EAAE;AAChD,QAAM,UAAU,MAAM,QAAQ,MAAM;AACpC,QAAM,QAAQ,MAAM,mBAAmB,MAAM;AAC7C,mBAAiB;AACjB,qCAAmC,OAAO,OAAO;AACjD,QAAM,QAAQ,MAAM,eAAe,OAAO,kBAAkB,0BAA0B,KAAK,MAAM,CAAC;AAClG,iBAAe,QAAQ,MAAM;AAC7B,QAAM,EAAE,MAAM,UAAU,OAAO,IAAI,MAAM,mBAAmB,SAAS,QAAQ,QAAQ,MAAM;AAC3F,iBAAe,QAAQ,MAAM;AAC7B,QAAM,eAAe,gBAAgB,OAAO,OAAO,MAAM;AACzD,MAAI,CAAC,QAAQ;AACX,UAAM,mBAAmB;AAAA,MACvB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf,eAAe;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,gBAAgB,OAAO,aAAa,OAAO,WAAW,GAAG;AAC5D,kBAAc,KAAK,MAAS;AAC5B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAE,MAAM,sBAAsB,KAAK,QAAQ,OAAO,QAAQ,QAAQ,OAAO,QAAQ,MAAM,GAAI;AAC7F,kBAAc,KAAK,MAAS;AAC5B,WAAO;AAAA,EACT;AACA,QAAM,iBAAiB,2BAA2B,MAAM;AACxD,QAAM,UAAU,iBAAiB,QAAQ,OAAO,WAAW;AAC3D,QAAM,WAAW,mBAAmB,SAAS,OAAO,OAAO,WAAW;AACtE,QAAM,gBAAgB,iBAAiB,QAAQ,OAAO,QAAQ,sBAAsB,GAAG,CAAC;AACxF,MAAI,gBAAgB,iBAAiB,MAAM,uBAAuB,CAAC,QAAQ,OAAO;AAChF,UAAM,mBAAmB;AAAA,MACvB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,eACE;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,MACE,CAAC,QAAQ,OACT,CAAE,MAAM,IAAI,GAAG;AAAA,IACb,yBAAyB,MAAM,IAAI,mCAAmC;AAAA,IACtE,kBAAkB,QAAQ,QAAQ,aAAa,OAAO,UAAU,sBAAsB,GAAG,EAAE,IAAI;AAAA,EACjG,GACA;AACA,kBAAc,KAAK,MAAS;AAC5B,QAAI,GAAG,OAAO,mBAAmB,MAAM;AACvC,WAAO;AAAA,EACT;AAEA,iBAAe,QAAQ,MAAM;AAC7B,QAAM,kBAAkB,QAAQ,MAAM,iBAAiB,MAAM,CAAC;AAC9D,QAAM,uBAAuB,YAAY;AACvC,qBAAiB;AACjB,UAAM,cAAc,MAAM,QAAQ,SAAS,QAAQ,MAAM;AACzD,qBAAiB;AACjB,UAAM,UAAU,MAAM,eAAe,OAAO,kBAAkB,0BAA0B,KAAK,MAAM,CAAC;AACpG,qBAAiB;AACjB,QAAI,CAAC,WAAW,YAAY,OAAO,GAAG,YAAY,KAAK,CAAC,KAAK,CAAC,eAAe,SAAS,MAAM,WAAW,GAAG;AACxG,YAAM,IAAI,MAAM,kFAAkF;AAAA,IACpG;AAAA,EACF;AACA,MAAI,gBAAiB,OAAM,qBAAqB;AAChD,MAAI,mBAAmB,2BAA2B,MAAM,WAAW,QAAQ,KAAK,CAAC;AAC/E,UAAM,IAAI,MAAM,sCAAsC;AACxD,mBAAiB;AACjB,QAAM,YAAY,MAAM,eAAe,OAAO,kBAAkB,0BAA0B,KAAK,MAAM,CAAC;AACtG,MAAI,CAAC,WAAW,YAAY,KAAK,GAAG,YAAY,SAAS,CAAC;AACxD,UAAM,IAAI,MAAM,yCAAyC;AAC3D,MAAI,CAAC,eAAe,SAAS,MAAM,MAAM,QAAQ,SAAS,QAAQ,MAAM,CAAC;AACvE,UAAM,IAAI,MAAM,oCAAoC;AACtD,mBAAiB;AACjB,QAAM,SAAS,MAAM,YAAY,OAAO,kBAAkB,0BAA0B,KAAK,MAAM,GAAG,QAAQ,MAAM;AAChH,QAAM,kBAAkB,MAAM,mBAAmB,KAAK,QAAQ;AAC9D,MAAI,gBAAiB,OAAM,qBAAqB;AAChD,qCAAmC,MAAM,mBAAmB,MAAM,GAAG,OAAO;AAC5E,mBAAiB;AACjB,UAAQ,WAAW;AACnB,QAAM,iBAAiB,MAAM,cAAc,UAAU,sBAAsB,GAAG,GAAG;AAAA,IAC/E,SAAS,OAAO;AAAA,IAChB,YAAY;AAAA,IACZ,QAAQ,QAAQ;AAAA,IAChB;AAAA,IACA,oBAAoB,OAAO,aAAa,SACpC,EAAE,iBAAiB,YAAY,KAAK,EAAE,eAAe,KAAK,KAAK,IAC/D;AAAA,EACN,CAAC;AAED,yBAAuB;AACvB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,SAAS,OAAO;AAAA,MAChB,qBAAqB,OAAO;AAAA,MAC5B,oBAAoB,MAAM;AAAA,MAC1B,gBAAgB,OAAO,aAAa,SAChC,EAAE,GAAG,gBAAgB,iBAAiB,YAAY,OAAO,EAAE,eAAe,EAAE,IAC5E;AAAA,MACJ,SAAS,CAAC,GAAG,OAAO,OAAO;AAAA,MAC3B,GAAI,OAAO,gBAAgB,SAAY,EAAE,aAAa,OAAO,YAAY,IAAI,CAAC;AAAA,IAChF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,mBAAmB,MAAM;AAC/B,QAAM,oBAAoB,QAAQ,MAAM,mBAAmB,MAAM,GAAG,sBAAsB;AAC1F,yBAAuB;AACvB,MAAI,QAAQ,QAAQ,QAAS,QAAO;AACpC,gBAAc,KAAK,MAAS;AAC5B,MAAI,CAAC,QAAQ,QAAQ;AACnB,QAAI,GAAG,OAAO,UAAU,OAAO,MAAM,MAAM,eAAe,OAAO,EAAE,aAAa,MAAM,IAAI,MAAM;AAAA,EAClG,WAAW,QAAQ,QAAQ,OAAO,QAAQ,SAAS,UAAU,KAAK,yBAAyB,MAAM,GAAG;AAClG,QAAI,GAAG;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,QAAQ,OAAQ,OAAM,YAAY,KAAK,QAAQ,QAAQ,gBAAgB;AAC3E,SAAO;AACT;AAEA,eAAsB,SACpB,KACA,SACA,UAA8B,mBAC9B;AACA,QAAM,mBAAmB,qBAAqB,KAAK,QAAQ,MAAM;AACjE,QAAM,SAAS,MAAM,WAAW,QAAQ,KAAK;AAC7C,iBAAe,QAAQ,MAAM;AAC7B,MAAI,OAAO,QAAQ,SAAS,KAAK,QAAQ,QAAQ,OAAO,kBAAmB,QAAO,UAAU,KAAK,SAAS,OAAO;AACjH,MAAI,CAAC,QAAQ,QAAQ,OAAO,QAAQ,SAAS,KAAM,MAAM,iBAAiB,MAAM;AAC9E,WAAO,UAAU,KAAK,SAAS,OAAO;AACxC,QAAM,QAAQ,MAAM,mBAAmB,MAAM;AAC7C,iBAAe,QAAQ,MAAM;AAC7B,MAAI,CAAC,QAAQ,QAAQ,OAAO,QAAQ,SAAS,KAAK,MAAM,oBAAqB,QAAO,UAAU,KAAK,SAAS,OAAO;AACnH,QAAM,UAAU,MAAM,QAAQ,MAAM;AACpC,QAAM,QAAQ,MAAM,eAAe,OAAO,kBAAkB,0BAA0B,KAAK,MAAM,CAAC;AAClG,iBAAe,QAAQ,MAAM;AAC7B,MAAI,OAAO,QAAQ,WAAW,GAAG;AAC/B,QAAI,CAAC,QAAQ,QAAQ;AACnB,UAAI,GAAG;AAAA,QACL,oBAAe,OAAO,SAAS;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AACA;AAAA,EACF;AACA,QAAM,EAAE,MAAM,UAAU,OAAO,IAAI,MAAM,mBAAmB,SAAS,QAAQ,QAAQ,MAAM;AAC3F,iBAAe,QAAQ,MAAM;AAC7B,QAAM,eAAe,gBAAgB,OAAO,OAAO,MAAM;AACzD,QAAM,gBAAgB,SAAS,iBAAiB,QAAQ,OAAO,QAAQ,sBAAsB,GAAG,CAAC,IAAI;AACrG,QAAM,YAAY,CAAC,MAAM;AACzB,MAAI,QAAQ,KAAM,OAAM,IAAI,MAAM,+DAA+D;AAEjG,QAAM,gBAAgB,iBAAiB,OAAO,OAAO,WAAW;AAChE,QAAM,sBAAsB,OAAO,aAAuB;AACxD,qCAAiC,QAAQ,QAAQ;AACjD,UAAM,WAAW,iBAAiB,UAAU,OAAO,WAAW;AAC9D,QAAI,MAAM,uBAAuB,CAAC,gBAAgB,MAAM,aAAa,OAAO,WAAW;AACrF,YAAM,IAAI,MAAM,8EAA8E;AAChG,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,SAAS,OAAO;AAAA,QAChB,qBAAqB,SAAS;AAAA,QAC9B,oBAAoB,MAAM;AAAA,QAC1B,gBAAgB,YAAY,QAAQ;AAAA,QACpC,SAAS,CAAC,GAAG,OAAO,OAAO;AAAA,QAC3B,GAAI,OAAO,gBAAgB,SAAY,EAAE,aAAa,OAAO,YAAY,IAAI,CAAC;AAAA,MAChF;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,oBAAoB,QAAQ,MAAM,mBAAmB,MAAM,GAAG,gBAAgB;AACpF,qBAAiB;AAAA,EACnB;AACA,MAAI,aAAa,UAAU,OAAO,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,GAAG;AAC5E,qCAAiC,QAAQ,MAAM;AAC/C,UAAM,iBAAiB,iBAAiB,QAAQ,OAAO,WAAW;AAClE,QAAI,CAAC,iCAAiC,eAAe,cAAc,GAAG;AACpE,YAAM,mBAAmB;AAAA,QACvB,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc;AAAA,QACd,eAAe;AAAA,QACf,eACE;AAAA,MACJ,CAAC;AAAA,IACH;AACA,QAAI,CAAC,WAAW,YAAY,aAAa,GAAG,YAAY,cAAc,CAAC,GAAG;AACxE,UAAI,CAAC,iCAAiC,eAAe,cAAc,GAAG;AACpE,cAAM,mBAAmB;AAAA,UACvB,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,cAAc;AAAA,UACd,eAAe;AAAA,UACf,eACE;AAAA,QACJ,CAAC;AAAA,MACH;AACA,YAAM,KAAK,KAAK,SAAS,OAAO;AAChC;AAAA,IACF;AACA,UAAM,oBAAoB,MAAM;AAChC,QAAI,CAAC,QAAQ,OAAQ,KAAI,GAAG,OAAO,mEAAmE,MAAM;AAC5G;AAAA,EACF;AACA,MACE,gBACA,iBACA,UACA,eAAe,eAAe,iBAAiB,QAAQ,OAAO,WAAW,CAAC,GAC1E;AACA,qCAAiC,QAAQ,MAAM;AAC/C,UAAM,oBAAoB,MAAM;AAChC,QAAI,CAAC,QAAQ,OAAQ,KAAI,GAAG,OAAO,kCAAkC,MAAM;AAC3E;AAAA,EACF;AACA,MAAI,gBAAgB,iBAAiB,MAAM,qBAAqB;AAC9D,UAAM,mBAAmB;AAAA,MACvB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe;AAAA,IACjB,CAAC;AAAA,EACH;AACA,MAAI,eAAe;AACjB,UAAM,KAAK,KAAK,SAAS,OAAO;AAChC;AAAA,EACF;AACA,MAAI,gBAAgB,CAAC,QAAQ;AAC3B,UAAM,KAAK,KAAK,SAAS,QAAW,OAAO;AAC3C;AAAA,EACF;AACA,MAAI,yBAAyB,QAAQ,MAAM,OAAO,QAAQ,CAAC,MAAM,UAAU,QAAQ,aAAa,MAAM,KAAK,CAAC,GAAG;AAC7G,UAAM,oBAAoB,MAAM;AAAA,EAClC;AACA,MAAI,CAAC,QAAQ,OAAQ,KAAI,GAAG,OAAO,kCAAkC,MAAM;AAC7E;AAEA,eAAsB,SACpB,KACA,SACA,UAA8B,mBAC9B,mBACA;AACA,QAAM,mBAAmB,qBAAqB,KAAK,QAAQ,MAAM;AACjE,QAAM,yBAAyB,qBAAqB,GAAG;AACvD,QAAM,SAAS,QAAQ,KAAK,CAAC;AAC7B,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,6CAA6C;AAE1E,QAAM,SAAS,MAAM,WAAW,QAAQ,KAAK;AAC7C,iBAAe,QAAQ,MAAM;AAC7B,QAAM,UAAU,MAAM,QAAQ,MAAM;AACpC,MACE,sBACC,QAAQ,aAAa,kBAAkB,mBAAmB,OAAO,cAAc,kBAAkB,QAClG;AACA,UAAM,IAAI,MAAM,0FAA0F;AAAA,EAC5G;AAEA,QAAM,sBAAsB,MAAM;AAClC,QAAM,QAAQ,MAAM,mBAAmB,MAAM;AAC7C,mBAAiB;AACjB,qCAAmC,OAAO,SAAS,KAAK;AACxD,QAAM,UAAU,MAAM,QAAQ,aAAa,QAAQ,QAAQ,MAAM;AACjE,2BAAyB,OAAO;AAChC,MAAI,CAAC,gBAAgB,QAAQ,aAAa,OAAO,WAAW;AAC1D,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,QAAM,WAAW;AAAA,IACf,OAAO,QAAQ,SAAS,UAAU,IAAI,UAAU,wBAAwB,OAAO;AAAA,IAC/E;AAAA,EACF;AACA,QAAM,SAAS,iBAAiB,2BAA2B,QAAQ,GAAG,OAAO,WAAW;AACxF,QAAM,QAAQ,MAAM,eAAe,OAAO,kBAAkB,0BAA0B,KAAK,MAAM,CAAC;AAClG,QAAM,eAAe,MAAM,QAAQ,SAAS,QAAQ,MAAM;AAC1D,QAAM,gBAAgB,eAAe,MAAM,oBAAoB,SAAS,cAAc,QAAQ,MAAM,IAAI;AACxG,mBAAiB;AACjB,MAAI,CAAE,MAAM,sBAAsB,KAAK,QAAQ,OAAO,eAAe,MAAM,QAAQ,MAAM,EAAI;AAC7F,mBAAiB;AACjB,QAAM,WAAW,mBAAmB,QAAQ,OAAO,OAAO,WAAW;AAErE,MAAI,CAAC,QAAQ,KAAK;AAChB,UAAM,YAAY,MAAM,IAAI,GAAG;AAAA,MAC7B,yBAAyB,MAAM,IAAI,uCAAuC;AAAA,MAC1E,sBAAsB,QAAQ,QAAQ,aAAa,OAAO,UAAU,QAAQ,sBAAsB,GAAG,EAAE,IAAI;AAAA,MAC3G,EAAE,QAAQ,QAAQ,OAAO;AAAA,IAC3B;AACA,qBAAiB;AACjB,QAAI,CAAC,WAAW;AACd,UAAI,GAAG,OAAO,uBAAuB,MAAM;AAC3C;AAAA,IACF;AAAA,EACF;AAEA,mBAAiB;AACjB,QAAM,eAAe,MAAM,eAAe,OAAO,kBAAkB,0BAA0B,KAAK,MAAM,CAAC;AACzG,MAAI,CAAC,WAAW,YAAY,YAAY,GAAG,YAAY,KAAK,CAAC;AAC3D,UAAM,IAAI,MAAM,6CAA6C;AAC/D,MAAI,2BAA2B,MAAM,MAAM,2BAA2B,MAAM,WAAW,QAAQ,KAAK,CAAC;AACnG,UAAM,IAAI,MAAM,0CAA0C;AAC5D,MAAI,CAAC,eAAe,SAAS,cAAc,MAAM,QAAQ,SAAS,QAAQ,MAAM,CAAC;AAC/E,UAAM,IAAI,MAAM,wCAAwC;AAC1D,mBAAiB;AACjB,iBAAe,QAAQ,MAAM;AAC7B,QAAM,SAAS,MAAM,YAAY,OAAO,kBAAkB,0BAA0B,KAAK,MAAM,GAAG,QAAQ,MAAM;AAChH,QAAM,kBAAkB,MAAM,mBAAmB,KAAK,MAAM;AAC5D,qCAAmC,MAAM,mBAAmB,MAAM,GAAG,SAAS,KAAK;AACnF,mBAAiB;AACjB,UAAQ,WAAW;AACnB,QAAM,iBAAiB,MAAM,cAAc,UAAU,sBAAsB,GAAG,GAAG;AAAA,IAC/E,SAAS,OAAO;AAAA,IAChB,YAAY;AAAA,IACZ,QAAQ,QAAQ;AAAA,IAChB;AAAA,IACA,oBAAoB,OAAO,aAAa,SACpC,EAAE,iBAAiB,YAAY,KAAK,EAAE,eAAe,KAAK,KAAK,IAC/D;AAAA,EACN,CAAC;AAED,yBAAuB;AACvB,MAAI;AACJ,MAAI;AACF,UAAM,mBAAmB,YAAY,QAAQ,4BAA4B;AACzE,UAAM,SAAS,MAAM,kBAAkB,SAAS,QAAQ,QAAQ,cAAc,eAAe,gBAAgB;AAC7G,2BAAuB;AACvB,aAAS,MAAM,QAAQ,gBAAgB,QAAQ,mBAAmB,YAAY,GAAG;AAAA,MAC/E,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,SAAS,OAAO;AACd,UAAM,IAAI,yBAAyB,QAAQ,KAAK;AAAA,EAClD;AACA,MAAI;AACF,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,SAAS,OAAO;AAAA,QAChB,qBAAqB,OAAO,KAAK;AAAA,QACjC,oBAAoB,OAAO,KAAK;AAAA,QAChC,gBAAgB,OAAO,aAAa,SAChC,EAAE,GAAG,gBAAgB,iBAAiB,YAAY,MAAM,EAAE,eAAe,EAAE,IAC3E;AAAA,QACJ,SAAS,CAAC,GAAG,OAAO,OAAO;AAAA,QAC3B,GAAI,OAAO,gBAAgB,SAAY,EAAE,aAAa,OAAO,YAAY,IAAI,CAAC;AAAA,MAChF;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,IAAI,iCAAiC,OAAO,MAAM,OAAO,MAAM;AAAA,EACvE;AACA,QAAM,mBAAmB,MAAM;AAC/B,QAAM,oBAAoB,QAAQ,MAAM,mBAAmB,MAAM,GAAG,sBAAsB;AAC1F,yBAAuB;AACvB,MAAI,QAAQ,QAAQ,QAAS;AAC7B,MAAI,GAAG;AAAA,IACL;AAAA,MACE,gCAA2B,OAAO,SAAS,aAAQ,MAAM,aAAa,OAAO,KAAK,UAAU,aAAa,MAAM;AAAA,MAC/G,GAAG,OAAO;AAAA,IACZ,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,IACZ,OAAO,SAAS,SAAS,IAAI,YAAY;AAAA,EAC3C;AACA,QAAM,YAAY,KAAK,QAAQ,QAAQ,gBAAgB;AACzD;AAEA,eAAe,YACb,KACA,QACA,mBAAmB,qBAAqB,KAAK,MAAM,GACnD;AACA,MAAI,QAAQ,WAAW,EAAE,YAAY,KAAM;AAC3C,mBAAiB;AACjB,MACE,IAAI,SACH,MAAM,IAAI,GAAG;AAAA,IACZ;AAAA,IACA;AAAA,EACF,GACA;AACA,QAAI,QAAQ,QAAS;AACrB,qBAAiB;AACjB,UAAM,IAAI,OAAO;AAAA,EACnB;AACF;AAEA,eAAe,4BACb,SACA,QACA,MACA,OACA,QACA;AACA,MACE,CAAC,QACA,KAAK,eAAe,MAAM,uBACzB,CAAC,kBAAkB,OAAO,MAAM,MAC/B,CAAC,MAAM,sBAAsB,QAAQ,aAAa,KAAK,UAAU,MAAM,kBAAkB,IAC5F;AACA,WAAO;AAAA,EACT;AACA,SAAO,oBAAoB,SAAS,MAAM,MAAM;AAClD;AAEA,eAAe,kBACb,SACA,QACA,OACA,MACA,QACA,QACA;AACA,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,WAAW,UAAW,MAAM,oBAAoB,SAAS,MAAM,MAAM;AAC3E,SAAO,0BAA0B,OAAO,UAAU,MAAM;AAC1D;AAEA,eAAe,YACb,KACA,SACA,QACA,SACA,OACA,QACA,MACA,QACA,QAAQ,yBAAyB,MAAM,IAAI,mCAAmC,qBAC9E;AACA,iBAAe,QAAQ,MAAM;AAC7B,MAAI,QAAQ,IAAK,QAAO;AACxB,QAAM,YAAY,MAAM,IAAI,GAAG;AAAA,IAC7B;AAAA,IACA,kBAAkB,QAAQ,QAAQ,aAAa,QAAQ,MAAM,0BAA0B,OAAO,MAAM,GAAG,MAAM;AAAA,EAC/G;AACA,iBAAe,QAAQ,MAAM;AAC7B,MAAI,UAAW,QAAO;AACtB,gBAAc,KAAK,MAAS;AAC5B,MAAI,GAAG,OAAO,mBAAmB,MAAM;AACvC,SAAO;AACT;AAEA,SAAS,eAAe,SAAsB,MAA8B,OAA+B;AACzG,MAAI,CAAC,QAAQ,CAAC,MAAO,QAAO,SAAS;AACrC,SAAO,QAAQ,aAAa,KAAK,UAAU,MAAM,QAAQ;AAC3D;;;ACjtBA,IAAM,kBAAkB;AAExB,eAAsB,OACpB,KACA,SACA,UAA8B,mBAC9B;AACA,QAAM,SAAS,MAAM,WAAW,QAAQ,KAAK;AAC7C,iBAAe,QAAQ,MAAM;AAC7B,gBAAc,KAAK,YAAY,OAAO,SAAS,EAAE;AACjD,QAAM,EAAE,MAAM,gBAAgB,cAAc,eAAe,YAAY,aAAa,WAAW,IAAI,MAAM;AAAA,IACvG;AAAA,IACA,0BAA0B,KAAK,MAAM;AAAA,IACrC,QAAQ;AAAA,IACR;AAAA,EACF;AACA,iBAAe,QAAQ,MAAM;AAE7B,QAAM,aAAa,OAAO,WAAW,KAAK,UAAU,SAAS,KAAK,OAAO,OAAO,KAAK,SAAS,KAAK;AACnG,QAAM,WAAW,qBAAqB,MAAM;AAC5C,gBAAc,KAAK,MAAS;AAC5B,MAAI,GAAG;AAAA,IACL;AAAA,MACE,eAAe,OAAO,SAAS;AAAA,MAC/B,uBAAuB,OAAO,cAAc;AAAA,MAC5C,qBAAqB,iBAAiB,WAAW,CAAC;AAAA,MAClD,uBAAuB,iCAAiC,UAAU,CAAC;AAAA,MACnE,qBAAqB,OAAO,QAAQ,KAAK,IAAI,KAAK,MAAM;AAAA,MACxD,aAAa,OAAO,QAAQ,SAAS,UAAU,IAAI,aAAa,UAAU;AAAA,MAC1E;AAAA,MACA,4BAA4B,cAAc;AAAA,MAC1C,gBAAgB,UAAU;AAAA,MAC1B,kCAAkC,eAAe,QAAQ,IAAI;AAAA,MAC7D,mCAAmC,gBAAgB,QAAQ,IAAI;AAAA,MAC/D,GAAG;AAAA,IACL,EAAE,KAAK,IAAI;AAAA,IACX,gBAAgB,iBAAiB,gBAAgB,SAAS,eAAe,SAAS,SAAS,IAAI,YAAY;AAAA,EAC7G;AACF;AAEA,eAAsB,KACpB,KACA,SACA,UAA8B,mBAC9B;AACA,QAAM,SAAS,MAAM,WAAW,QAAQ,KAAK;AAC7C,iBAAe,QAAQ,MAAM;AAC7B,gBAAc,KAAK,YAAY,OAAO,SAAS,EAAE;AACjD,QAAM,UAAU,MAAM,QAAQ,MAAM;AACpC,QAAM,QAAQ;AAAA,IACZ,MAAM,eAAe,OAAO,kBAAkB,0BAA0B,KAAK,MAAM,CAAC;AAAA,IACpF,OAAO;AAAA,EACT;AACA,iBAAe,QAAQ,MAAM;AAC7B,QAAM,EAAE,UAAU,QAAQ,eAAe,IAAI,MAAM,mBAAmB,SAAS,QAAQ,QAAQ,QAAQ;AAAA,IACrG,0BAA0B;AAAA,EAC5B,CAAC;AACD,iBAAe,QAAQ,MAAM;AAC7B,gBAAc,KAAK,MAAS;AAE5B,QAAM,WAAW,qBAAqB,MAAM;AAC5C,QAAM,SAAS;AAAA,IACb,eAAe,OAAO,SAAS;AAAA,IAC/B,uBAAuB,OAAO,cAAc;AAAA,IAC5C,qBAAqB,iBAAiB,QAAQ,WAAW,CAAC;AAAA,IAC1D,qBAAqB,OAAO,QAAQ,KAAK,IAAI,KAAK,MAAM;AAAA,IACxD,aAAa,OAAO,QAAQ,SAAS,UAAU,IAAI,aAAa,UAAU;AAAA,IAC1E,4BAA4B,cAAc;AAAA,IAC1C,GAAG;AAAA,EACL,EAAE,KAAK,IAAI;AACX,QAAM,QAAQ,SAAS,SAAS,KAAK,gBAAgB,SAAS,cAAc,YAAY;AACxF,MAAI,CAAC,QAAQ;AACX,QAAI,GAAG,OAAO,GAAG,MAAM;AAAA;AAAA,EAAO,uBAAuB,4CAA4C,KAAK,CAAC,IAAI,KAAK;AAChH;AAAA,EACF;AAEA,MAAI,GAAG,OAAO,GAAG,MAAM;AAAA;AAAA,EAAO,WAAW,OAAO,iBAAiB,QAAQ,OAAO,WAAW,CAAC,CAAC,IAAI,KAAK;AACxG;AAEA,eAAsB,OACpB,KACA,SACA,UAA8B,mBAC9B;AACA,QAAM,WAAqB,CAAC;AAC5B,MAAI,QAA4B;AAChC,MAAI,kBAAmC,CAAC;AACxC,MAAI,UAAU;AACd,MAAI;AACJ,MAAI,iBAA2B,CAAC;AAEhC,MAAI;AACF,UAAM,SAAS,MAAM,WAAW,QAAQ,KAAK;AAC7C,mBAAe,QAAQ,MAAM;AAC7B,cAAU,MAAM,QAAQ,MAAM;AAC9B,cAAU,OAAO;AACjB,sBAAkB,0BAA0B,KAAK,MAAM;AACvD,aAAS;AAAA,MACP,0BAA0B,OAAO,SAAS;AAAA,MAC1C,qBAAqB,OAAO,QAAQ,KAAK,IAAI,KAAK,MAAM;AAAA,MACxD,aAAa,OAAO,QAAQ,SAAS,UAAU,IAAI,aAAa,UAAU;AAAA,IAC5E;AACA,qBAAiB;AAAA,MACf,qBAAqB,iBAAiB,QAAQ,WAAW,CAAC;AAAA,MAC1D,uBAAuB,iCAAiC,QAAQ,UAAU,CAAC;AAAA,IAC7E;AACA,UAAM,WAAW,qBAAqB,MAAM;AAC5C,QAAI,SAAS,SAAS,GAAG;AACvB,cAAQ;AACR,eAAS,KAAK,GAAG,QAAQ;AAAA,IAC3B;AAAA,EACF,SAAS,OAAO;AACd,mBAAe,QAAQ,MAAM;AAC7B,YAAQ;AACR,aAAS,KAAK,WAAW,aAAa,KAAK,CAAC,EAAE;AAAA,EAChD;AAEA,QAAM,QAAQ,MAAM,eAAe,SAAS,eAAe;AAC3D,iBAAe,QAAQ,MAAM;AAC7B,QAAM,UAAU,aAAa,KAAK;AAClC,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ;AACR,aAAS,KAAK,sCAAsC;AACpD,aAAS,KAAK,GAAG,QAAQ,IAAI,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;AAAA,EACzD,OAAO;AACL,aAAS,KAAK,oBAAoB,MAAM,MAAM,MAAM,iBAAiB;AAAA,EACvE;AAEA,QAAM,OAAO,MAAM,YAAY;AAC/B,iBAAe,QAAQ,MAAM;AAC7B,MAAI,KAAK,WAAW,WAAW,YAAY,KAAK,IAAI,GAAG;AACrD,YAAQ;AACR,aAAS,KAAK,oBAAoB,KAAK,KAAK,GAAG,gEAAgE;AAAA,EACjH,WAAW,KAAK,WAAW,SAAS;AAClC,aAAS,KAAK,qBAAqB,KAAK,KAAK,GAAG,UAAU,KAAK,KAAK,SAAS,EAAE;AAAA,EACjF,WAAW,KAAK,WAAW,cAAc;AACvC,YAAQ;AACR,aAAS,KAAK,oFAAoF;AAAA,EACpG,WAAW,MAAM,gBAAgB,GAAG;AAClC,mBAAe,QAAQ,MAAM;AAC7B,YAAQ;AACR,aAAS,KAAK,yEAAyE;AAAA,EACzF,OAAO;AACL,aAAS,KAAK,YAAY;AAAA,EAC5B;AAEA,MAAI,SAAS;AACX,aAAS,KAAK,GAAG,cAAc;AAC/B,UAAM,cAAc,MAAM,QAAQ,SAAS,QAAQ,MAAM;AACzD,mBAAe,QAAQ,MAAM;AAC7B,eAAW,cAAc,aAAa;AACpC,eAAS,KAAK,WAAW,OAAO;AAChC,UAAI,WAAW,UAAU,OAAQ,SAAQ;AAAA,IAC3C;AAAA,EACF;AACA,MAAI,GAAG,OAAO,SAAS,KAAK,IAAI,GAAG,KAAK;AAC1C;AAEA,eAAsB,QACpB,KACA,SACA,UAA8B,mBAC9B;AACA,QAAM,SAAS,MAAM,WAAW,QAAQ,KAAK;AAC7C,iBAAe,QAAQ,MAAM;AAC7B,QAAM,UAAU,MAAM,QAAQ,MAAM;AACpC,QAAM,aAAa,MAAM,QAAQ,YAAY,QAAQ,MAAM,GAAG,MAAM,GAAG,EAAE,QAAQ;AACjF,iBAAe,QAAQ,MAAM;AAC7B,MAAI,UAAU,WAAW,GAAG;AAC1B,QAAI,GAAG,OAAO,oCAAoC,MAAM;AACxD;AAAA,EACF;AAEA,QAAM,kBAAkB,UAAU,CAAC,GAAG;AACtC,MAAI,IAAI,SAAS,OAAO;AACtB,UAAM,SAAS,UAAU;AAAA,MACvB,CAAC,MAAMA,WACL,GAAGA,SAAQ,CAAC,KAAK,KAAK,SAAS,SAAM,iBAAiB,KAAK,OAAO,CAAC,SAAM,KAAK,UAAU,GAAG,KAAK,eAAe,kBAAkB,eAAe,EAAE,GAAG,KAAK,eAAe,mBAAgB,EAAE;AAAA,IAC/L;AACA,UAAM,WAAW,MAAM,IAAI,GAAG;AAAA,MAC5B,gCAA2B,iBAAiB,OAAO,SAAS,CAAC;AAAA;AAAA;AAAA,MAC7D,CAAC,GAAG,QAAQ,MAAM;AAAA,MAClB,EAAE,QAAQ,QAAQ,OAAO;AAAA,IAC3B;AACA,QAAI,CAAC,YAAY,aAAa,OAAQ;AACtC,mBAAe,QAAQ,MAAM;AAC7B,UAAM,QAAQ,OAAO,QAAQ,QAAQ;AACrC,UAAM,WAAW,UAAU,KAAK;AAChC,QAAI,CAAC,SAAU;AACf,UAAM;AAAA,MAAS;AAAA,MAAY,MACzB,SAAS,KAAK,EAAE,GAAG,SAAS,MAAM,CAAC,SAAS,WAAW,GAAG,KAAK,MAAM,GAAG,SAAS;AAAA,QAC/E,iBAAiB,QAAQ;AAAA,QACzB,OAAO,OAAO;AAAA,MAChB,CAAC;AAAA,IACH;AACA;AAAA,EACF;AACA,MAAI,GAAG;AAAA,IACL,UAAU,IAAI,CAAC,SAAS,GAAG,KAAK,WAAW,IAAI,KAAK,SAAS,IAAI,iBAAiB,KAAK,OAAO,CAAC,EAAE,EAAE,KAAK,IAAI;AAAA,IAC5G;AAAA,EACF;AACF;",
|
|
6
|
-
"names": ["index"]
|
|
7
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/chunks/{conflict-artifacts-BB2FZMIE.ts.map → conflict-artifacts-4CZFB7WI.ts.map}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/chunks/{merge-baseline-store-EVQAAML6.ts.map → merge-baseline-store-ICXVTCML.ts.map}
RENAMED
|
File without changes
|
/package/dist/chunks/{remote-selection-ui-6LJJ4IMQ.ts.map → remote-selection-ui-H6AEVA3Q.ts.map}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|