@narumitw/pi-sync 0.57.2 → 0.57.5

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.
Files changed (89) hide show
  1. package/README.md +5 -1
  2. package/dist/chunks/{agent-plan-K3CRYVXV.ts → agent-plan-3L7CRFDM.ts} +28 -11
  3. package/dist/chunks/agent-plan-3L7CRFDM.ts.map +7 -0
  4. package/dist/chunks/agent-refusal-retry-AH7TXOQT.ts +69 -0
  5. package/dist/chunks/agent-refusal-retry-AH7TXOQT.ts.map +7 -0
  6. package/dist/chunks/{agent-runner-E2JU2VZ6.ts → agent-runner-WMSCKSCB.ts} +7 -5
  7. package/dist/chunks/agent-runner-WMSCKSCB.ts.map +7 -0
  8. package/dist/chunks/{agent-store-A3F6IYWZ.ts → agent-store-55CZOCPX.ts} +25 -3
  9. package/dist/chunks/agent-store-55CZOCPX.ts.map +7 -0
  10. package/dist/chunks/{chunk-QGK445K7.ts → chunk-3ST7RSYN.ts} +1 -1
  11. package/dist/chunks/chunk-3ST7RSYN.ts.map +7 -0
  12. package/dist/chunks/{chunk-OWBAZA6J.ts → chunk-DT6TOCIG.ts} +2 -2
  13. package/dist/chunks/{chunk-JJTARUSO.ts → chunk-JCH3VXIO.ts} +3 -2
  14. package/dist/chunks/{chunk-JJTARUSO.ts.map → chunk-JCH3VXIO.ts.map} +2 -2
  15. package/dist/chunks/{chunk-OEWQVWLC.ts → chunk-ORGBI36T.ts} +4 -4
  16. package/dist/chunks/{chunk-EUMINX7L.ts → chunk-P7DD5PWZ.ts} +2 -2
  17. package/dist/chunks/{chunk-VJN7KU4J.ts → chunk-PG7NMFP2.ts} +83 -18
  18. package/dist/chunks/chunk-PG7NMFP2.ts.map +7 -0
  19. package/dist/chunks/{chunk-T3NC77TU.ts → chunk-R75IHAOJ.ts} +45 -18
  20. package/dist/chunks/chunk-R75IHAOJ.ts.map +7 -0
  21. package/dist/chunks/{chunk-4TQWFLOQ.ts → chunk-U3XRI2HF.ts} +28 -197
  22. package/dist/chunks/chunk-U3XRI2HF.ts.map +7 -0
  23. package/dist/chunks/chunk-WD6FJHCK.ts +140 -0
  24. package/dist/chunks/chunk-WD6FJHCK.ts.map +7 -0
  25. package/dist/chunks/{conflict-review-ZCGWFKEK.ts → conflict-review-T7GSOKNG.ts} +9 -8
  26. package/dist/chunks/{conflict-review-ZCGWFKEK.ts.map → conflict-review-T7GSOKNG.ts.map} +1 -1
  27. package/dist/chunks/{continuous-record-LFRVXQBD.ts → continuous-record-SQJ47CXN.ts} +3 -3
  28. package/dist/chunks/{continuous-sync-LAIMSW7D.ts → continuous-sync-U4HIKPQK.ts} +9 -9
  29. package/dist/chunks/{continuous-sync-LAIMSW7D.ts.map → continuous-sync-U4HIKPQK.ts.map} +2 -2
  30. package/dist/chunks/{git-backend-KYDZ673X.ts → git-backend-NYKSG5X6.ts} +4 -4
  31. package/dist/chunks/{manager-result-dispatcher-AGBBVDDS.ts → manager-result-dispatcher-HOCM2GDA.ts} +4 -4
  32. package/dist/chunks/{manager-ui-PSA2L6CE.ts → manager-ui-FXXO6TW4.ts} +54 -17
  33. package/dist/chunks/manager-ui-FXXO6TW4.ts.map +7 -0
  34. package/dist/chunks/{remote-selection-ui-5725JDNC.ts → remote-selection-ui-YFPGYGNE.ts} +3 -3
  35. package/dist/chunks/{s3-backend-Y7WSCLJI.ts → s3-backend-F7PR5FB3.ts} +4 -4
  36. package/dist/chunks/{setup-wizard-SOYOJQKP.ts → setup-wizard-OVHZYXNW.ts} +2 -2
  37. package/dist/chunks/{sync-inspection-XFJOAMJD.ts → sync-inspection-5MY2HI4P.ts} +3 -3
  38. package/dist/chunks/{sync-operations-W5HFFMTP.ts → sync-operations-GNPS6BLY.ts} +29 -17
  39. package/dist/chunks/sync-operations-GNPS6BLY.ts.map +7 -0
  40. package/dist/chunks/{webdav-backend-6K26F6LT.ts → webdav-backend-TGFUH3SF.ts} +4 -4
  41. package/dist/index.ts +28 -23
  42. package/dist/index.ts.map +2 -2
  43. package/docs/agent-continuous-hardening.md +79 -0
  44. package/docs/agent-mode-verification.md +2 -0
  45. package/docs/agent-quality-verification.md +41 -0
  46. package/docs/continuous-sync-verification.md +2 -0
  47. package/package.json +4 -4
  48. package/skills/configure-pi-sync/references/configuration.md +21 -5
  49. package/src/commands/command-execution.ts +7 -2
  50. package/src/commands/command-handler.ts +3 -1
  51. package/src/commands/command-types.ts +3 -1
  52. package/src/sync/agent-plan.ts +26 -9
  53. package/src/sync/agent-refusal-retry.ts +54 -0
  54. package/src/sync/agent-request.ts +3 -1
  55. package/src/sync/agent-runner.ts +8 -6
  56. package/src/sync/agent-store.ts +32 -1
  57. package/src/sync/agent-sync.ts +63 -13
  58. package/src/sync/continuous-lease.ts +2 -7
  59. package/src/sync/continuous-record.ts +95 -13
  60. package/src/sync/continuous-storage.ts +12 -3
  61. package/src/sync/continuous-sync.ts +2 -1
  62. package/src/sync/merged-sync.ts +37 -9
  63. package/src/sync/sync-mutations.ts +11 -0
  64. package/src/ui/cancellable-operation.ts +2 -0
  65. package/src/ui/manager-state.ts +1 -0
  66. package/src/ui/manager-ui.ts +59 -14
  67. package/src/ui/secret-input.ts +29 -211
  68. package/dist/chunks/agent-plan-K3CRYVXV.ts.map +0 -7
  69. package/dist/chunks/agent-runner-E2JU2VZ6.ts.map +0 -7
  70. package/dist/chunks/agent-store-A3F6IYWZ.ts.map +0 -7
  71. package/dist/chunks/chunk-4TQWFLOQ.ts.map +0 -7
  72. package/dist/chunks/chunk-QGK445K7.ts.map +0 -7
  73. package/dist/chunks/chunk-QOC47PBC.ts +0 -97
  74. package/dist/chunks/chunk-QOC47PBC.ts.map +0 -7
  75. package/dist/chunks/chunk-T3NC77TU.ts.map +0 -7
  76. package/dist/chunks/chunk-VJN7KU4J.ts.map +0 -7
  77. package/dist/chunks/manager-ui-PSA2L6CE.ts.map +0 -7
  78. package/dist/chunks/sync-operations-W5HFFMTP.ts.map +0 -7
  79. /package/dist/chunks/{chunk-OWBAZA6J.ts.map → chunk-DT6TOCIG.ts.map} +0 -0
  80. /package/dist/chunks/{chunk-OEWQVWLC.ts.map → chunk-ORGBI36T.ts.map} +0 -0
  81. /package/dist/chunks/{chunk-EUMINX7L.ts.map → chunk-P7DD5PWZ.ts.map} +0 -0
  82. /package/dist/chunks/{continuous-record-LFRVXQBD.ts.map → continuous-record-SQJ47CXN.ts.map} +0 -0
  83. /package/dist/chunks/{git-backend-KYDZ673X.ts.map → git-backend-NYKSG5X6.ts.map} +0 -0
  84. /package/dist/chunks/{manager-result-dispatcher-AGBBVDDS.ts.map → manager-result-dispatcher-HOCM2GDA.ts.map} +0 -0
  85. /package/dist/chunks/{remote-selection-ui-5725JDNC.ts.map → remote-selection-ui-YFPGYGNE.ts.map} +0 -0
  86. /package/dist/chunks/{s3-backend-Y7WSCLJI.ts.map → s3-backend-F7PR5FB3.ts.map} +0 -0
  87. /package/dist/chunks/{setup-wizard-SOYOJQKP.ts.map → setup-wizard-OVHZYXNW.ts.map} +0 -0
  88. /package/dist/chunks/{sync-inspection-XFJOAMJD.ts.map → sync-inspection-5MY2HI4P.ts.map} +0 -0
  89. /package/dist/chunks/{webdav-backend-6K26F6LT.ts.map → webdav-backend-TGFUH3SF.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/agent-mode-setting.ts", "../../src/ui/settings-frame.ts", "../../src/ui/storage-connections-ui.ts", "../../src/ui/setup/setup-switcher.ts", "../../src/ui/setup/setup-actions.ts"],
4
- "sourcesContent": ["import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { type ActionMenuItem, defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport { loadConfig, syncCheckConfigFingerprint } from \"../settings/config.js\";\nimport { operationBlocksChanges } from \"../state/operation-availability.js\";\nimport { captureMutationOwner } from \"../sync/sync-local.js\";\nimport { type RunRoute, runCancellableOperation } from \"./cancellable-operation.js\";\nimport {\n attentionMainMenuItems,\n blockedSyncMenuItem,\n type SyncManagerAttentionOptions,\n showManagerAttention,\n} from \"./manager-attention.js\";\nimport { recoverSyncAccess } from \"./manager-recovery.js\";\nimport { dispatchManagerResult } from \"./manager-result-dispatcher.js\";\nimport { backendStorageDescription, describeManagerState } from \"./manager-state.js\";\nimport { showSyncSettings } from \"./settings-ui.js\";\nimport { showSyncSetupManager } from \"./setup/setup-actions.js\";\nimport { showSetupSwitcher } from \"./setup/setup-switcher.js\";\nimport { showStorageConnections } from \"./storage-connections-ui.js\";\nimport { observationMatchesConfig } from \"./sync-attention.js\";\nimport { safeTerminalText } from \"./terminal-text.js\";\n\nexport async function showSyncManager(\n ctx: ExtensionCommandContext,\n runRoute: RunRoute,\n sessionSignal?: AbortSignal,\n options: SyncManagerAttentionOptions = {},\n): Promise<void> {\n if (!ctx.hasUI) {\n await runRoute(\"help\");\n return;\n }\n type Screen = \"main\";\n type Action =\n | \"review-attention\"\n | \"sync\"\n | \"switch\"\n | \"settings\"\n | \"pull\"\n | \"push\"\n | \"diff\"\n | \"status\"\n | \"setups\"\n | \"connections\"\n | \"history\"\n | \"conflicts\"\n | \"doctor\"\n | \"recover\"\n | \"refresh\"\n | \"help\"\n | \"init\";\n interface State {\n manager: Awaited<ReturnType<typeof describeManagerState>>;\n }\n const menu = defineMenu<State, Screen, Action, ExtensionCommandContext>({\n start: \"main\",\n screens: {\n main: ({ state }) => {\n const attentionItems = attentionMainMenuItems(state.manager);\n const managerItems = state.manager.actions.map(\n (label) => blockedSyncMenuItem(label, state.manager) ?? syncMainMenuItem(label),\n );\n const operationFirst = state.manager.operation !== undefined && state.manager.operation.kind !== \"free\";\n return {\n kind: \"actions\",\n title: \"Manage sync\",\n // Frequent transfers stay visible; status is advisory and Help remains a direct route.\n lines: [\n ...state.manager.title.split(\"\\n\").slice(1),\n \"Help: /sync help \u00B7 Fresh status: /sync status \u00B7 Differences: /sync diff\",\n ],\n items: operationFirst ? [...managerItems, ...attentionItems] : [...attentionItems, ...managerItems],\n hint: \"close\",\n };\n },\n },\n actions: {\n \"review-attention\": async () => {\n const attention = options.getAttention?.();\n if (!attention) {\n const observation = options.getObservation?.();\n if (!observation) return { kind: \"stay\" };\n // A head-only observation is not an authoritative decision. Load a fresh\n // snapshot only after the user activates the existing review flow.\n const { showRemoteSelectionReview } = await import(\"./remote-selection-ui.js\");\n if (sessionSignal?.aborted) return { kind: \"close\" };\n const config = await loadConfig();\n if (sessionSignal?.aborted) return { kind: \"close\" };\n if (options.getObservation?.() !== observation || !observationMatchesConfig(observation, config)) {\n options.onObservationInvalidated?.();\n return { kind: \"stay\" };\n }\n // Keep the check-time hint on cancellation or failure. Route commits and\n // the manager's config/baseline reconciliation own invalidation.\n const result = await showRemoteSelectionReview(ctx, observation.setupName, sessionSignal, undefined, {\n origin: \"sync\",\n runRoute,\n onSelectionResolved: () => {\n if (!sessionSignal?.aborted && options.getObservation?.() === observation)\n options.onObservationInvalidated?.();\n },\n });\n if (sessionSignal?.aborted) return { kind: \"close\" };\n if (result.kind === \"route-result\") {\n return dispatchManagerResult(ctx, result.result, result.route, runRoute, sessionSignal);\n }\n return { kind: result.kind === \"closed\" || result.kind === \"stale\" ? \"close\" : \"stay\" };\n }\n const disposition = await showManagerAttention(ctx, attention, runRoute, sessionSignal, () =>\n options.onSelectionResolved?.(attention),\n );\n return { kind: disposition };\n },\n sync: async () => {\n const pendingAttention = options.getAttention?.();\n if (pendingAttention) {\n const activeConfig = await loadConfig();\n if (sessionSignal?.aborted) return { kind: \"close\" };\n if (pendingAttention.decision.setupName === activeConfig.setupName) {\n ctx.ui.notify(\"Review synced content before starting Sync now.\", \"warning\");\n return { kind: \"stay\" };\n }\n }\n const result = await runCancellableOperation(ctx, \"Checking current sync setup\u2026\", \"sync\", runRoute, {\n commitAware: true,\n signal: sessionSignal,\n });\n const disposition = await dispatchManagerResult(ctx, result, \"sync\", runRoute, sessionSignal);\n return disposition.kind === \"close\" ? { kind: \"close\" } : { kind: \"stay\" };\n },\n switch: async () => {\n const result = await showSetupSwitcher(ctx, runRoute, undefined, sessionSignal);\n return result === \"pull-attempted\" || result === \"closed\" ? { kind: \"close\" } : { kind: \"stay\" };\n },\n settings: async () => {\n const result = await showSyncSettings(ctx, runRoute, sessionSignal);\n return { kind: result === \"exit\" ? \"close\" : \"stay\" };\n },\n pull: async () => {\n const result = await runCancellableOperation(ctx, \"Checking remote changes\u2026\", \"pull\", runRoute, {\n commitAware: true,\n cancelledMessage: \"Pull check cancelled; no local files were changed.\",\n signal: sessionSignal,\n });\n const disposition = await dispatchManagerResult(ctx, result, \"pull\", runRoute, sessionSignal);\n return disposition.kind === \"close\" ? { kind: \"close\" } : { kind: \"stay\" };\n },\n push: async () => {\n const result = await runCancellableOperation(ctx, \"Preparing push preview\u2026\", \"push\", runRoute, {\n commitAware: true,\n cancelledMessage: \"Push preparation cancelled; no remote files were changed.\",\n signal: sessionSignal,\n });\n const disposition = await dispatchManagerResult(ctx, result, \"push\", runRoute, sessionSignal);\n return disposition.kind === \"close\" ? { kind: \"close\" } : { kind: \"stay\" };\n },\n setups: async () => {\n const result = await showSyncSetupManager(ctx, runRoute, sessionSignal);\n return result === \"exit\" ? { kind: \"close\" } : { kind: \"stay\" };\n },\n connections: async () => {\n await showStorageConnections(ctx, sessionSignal);\n return { kind: \"stay\" };\n },\n history: async () => {\n const result = await runCancellableOperation(ctx, \"Loading sync history\u2026\", \"history\", runRoute, {\n signal: sessionSignal,\n commitAware: true,\n cancelAcrossDialogs: true,\n cancelledMessage: \"History review cancelled; no files were changed.\",\n });\n return { kind: result.kind === \"closed\" ? \"close\" : \"stay\" };\n },\n diff: async () => {\n const result = await runCancellableOperation(ctx, \"Comparing local and remote\u2026\", \"diff\", runRoute, {\n signal: sessionSignal,\n });\n return { kind: result.kind === \"closed\" ? \"close\" : \"stay\" };\n },\n status: async () => {\n const result = await runCancellableOperation(ctx, \"Checking remote status\u2026\", \"status\", runRoute, {\n signal: sessionSignal,\n });\n return { kind: result.kind === \"closed\" ? \"close\" : \"stay\" };\n },\n doctor: async ({ signal: actionSignal }) => {\n const signal = sessionSignal ? AbortSignal.any([sessionSignal, actionSignal]) : actionSignal;\n const validate = captureMutationOwner(ctx, signal);\n const config = await loadConfig();\n validate();\n const confirmed = await ctx.ui.confirm(\n \"Run diagnostics?\",\n `Setup: ${safeTerminalText(config.setupName)}\\nStorage: ${backendStorageDescription(config)}\\nS3/R2 reads the latest pointer without writing. Git reads remote snapshots and checks its cache. WebDAV probes conditional writes and cleanup, and can repair a missing history entry. Possible-secret checks still run. This is not the read-only Check remote status action.`,\n { signal },\n );\n if (signal.aborted) return { kind: \"close\" };\n validate();\n if (!confirmed) return { kind: \"stay\" };\n const latest = await loadConfig();\n validate();\n if (syncCheckConfigFingerprint(config) !== syncCheckConfigFingerprint(latest)) {\n ctx.ui.notify(\"Setup changed during diagnostics review; reopen Diagnostics.\", \"warning\");\n return { kind: \"stay\" };\n }\n const result = await runCancellableOperation(ctx, \"Checking setup access\u2026\", \"doctor\", runRoute, {\n signal,\n target: config.setupName,\n });\n return { kind: result.kind === \"closed\" ? \"close\" : \"stay\" };\n },\n recover: async ({ state, signal: actionSignal }) => {\n const result = await recoverSyncAccess(ctx, state.manager, runRoute, sessionSignal, actionSignal);\n return { kind: result === \"close\" ? \"close\" : \"stay\" };\n },\n refresh: async () => ({ kind: \"stay\" }),\n help: async () => {\n await runRoute(\"help\");\n return { kind: \"close\" };\n },\n init: async () => {\n await runRoute(\"init\");\n return { kind: \"stay\" };\n },\n conflicts: async () => {\n const result = await runCancellableOperation(ctx, \"Reviewing private conflicts\u2026\", \"conflicts\", runRoute, {\n commitAware: true,\n signal: sessionSignal,\n });\n const disposition = await dispatchManagerResult(ctx, result, \"sync\", runRoute, sessionSignal);\n return disposition.kind === \"close\" ? { kind: \"close\" } : { kind: \"stay\" };\n },\n },\n });\n 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 | \"diff\"\n | \"status\"\n | \"switch\"\n | \"settings\"\n | \"setups\"\n | \"connections\"\n | \"history\"\n | \"conflicts\"\n | \"doctor\"\n | \"recover\"\n | \"refresh\"\n | \"help\"\n | \"init\"\n> {\n const actions = {\n \"Sync now\": \"sync\",\n \"Pull from remote\u2026\": \"pull\",\n \"Push to remote\u2026\": \"push\",\n \"View differences\": \"diff\",\n \"Check remote status\": \"status\",\n \"Switch sync setup\": \"switch\",\n Settings: \"settings\",\n History: \"history\",\n Diagnostics: \"doctor\",\n \"Review unresolved conflicts\": \"conflicts\",\n \"Restore sync access\u2026 (recommended)\": \"recover\",\n \"Refresh operation status\": \"refresh\",\n \"Sync setups\u2026\": \"setups\",\n \"Storage connections\u2026\": \"connections\",\n Help: \"help\",\n \"Set up sync\": \"init\",\n \"Use existing settings\": \"init\",\n } as const;\n const action = actions[label as keyof typeof actions];\n if (!action) throw new Error(`Unknown sync manager action: ${label}`);\n return {\n id: action,\n label,\n action,\n description:\n action === \"doctor\"\n ? \"Manage: review backend checks before running.\"\n : action === \"settings\" || action === \"history\" || action === \"switch\"\n ? \"Manage\"\n : action === \"sync\"\n ? \"Transfer: choose a safe direction or review conflicts.\"\n : action === \"pull\"\n ? \"Transfer: remote \u2192 local; review writes and removals.\"\n : action === \"push\"\n ? \"Transfer: local \u2192 remote active snapshot; review publication.\"\n : action === \"status\" || action === \"diff\"\n ? \"Inspect: read current local and remote state without transferring files.\"\n : undefined,\n };\n}\n", "import { errorMessage } from \"../sync/sync-errors.js\";\nimport { inspectLock, isLockGuardHeld, isStaleLock, type LockInspection } from \"./lock.js\";\nimport type { LockFile } from \"./state-types.js\";\n\nexport type OperationAvailability =\n | { kind: \"free\" }\n | { kind: \"live\"; lock: LockFile }\n | { kind: \"busy\"; lock?: LockFile; metadata: LockInspection[\"status\"] }\n | { kind: \"recoverable-stale\"; lock: LockFile }\n | { kind: \"recoverable-unreadable\" }\n | { kind: \"inspection-error\"; message: string };\n\ninterface OperationInspectionDependencies {\n inspectMetadata(): Promise<LockInspection>;\n inspectGuard(): Promise<boolean>;\n}\n\nconst DEFAULT_INSPECTION_DEPENDENCIES: OperationInspectionDependencies = {\n inspectMetadata: inspectLock,\n inspectGuard: isLockGuardHeld,\n};\n\nexport async function inspectOperationAvailability(\n dependencies: OperationInspectionDependencies = DEFAULT_INSPECTION_DEPENDENCIES,\n): Promise<OperationAvailability> {\n try {\n const metadata = await dependencies.inspectMetadata();\n const guardHeld = await dependencies.inspectGuard();\n return classifyOperationAvailability(metadata, guardHeld);\n } catch (error) {\n return { kind: \"inspection-error\", message: errorMessage(error) };\n }\n}\n\nexport function classifyOperationAvailability(metadata: LockInspection, guardHeld: boolean): OperationAvailability {\n if (metadata.status === \"valid\" && !isStaleLock(metadata.lock)) {\n return { kind: \"live\", lock: metadata.lock };\n }\n if (guardHeld) {\n return {\n kind: \"busy\",\n metadata: metadata.status,\n ...(metadata.status === \"valid\" ? { lock: metadata.lock } : {}),\n };\n }\n if (metadata.status === \"valid\") {\n return { kind: \"recoverable-stale\", lock: metadata.lock };\n }\n if (metadata.status === \"unreadable\") return { kind: \"recoverable-unreadable\" };\n return { kind: \"free\" };\n}\n\nexport function operationBlocksChanges(availability: OperationAvailability) {\n return availability.kind !== \"free\";\n}\n\nexport function operationCanRecover(availability: OperationAvailability) {\n return availability.kind === \"recoverable-stale\" || availability.kind === \"recoverable-unreadable\";\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport type { ActionMenuItem } from \"@narumitw/pi-tui-kit\";\nimport type { StartupObservation } from \"../sync/sync-inspection.js\";\nimport type { RunRoute } from \"./cancellable-operation.js\";\nimport { dispatchManagerResult } from \"./manager-result-dispatcher.js\";\nimport type { ManagerDescription } from \"./manager-state.js\";\nimport type { SyncAttentionState } from \"./sync-attention.js\";\n\nexport interface SyncManagerAttentionOptions {\n getObservation?: () => StartupObservation | undefined;\n onObservationInvalidated?: () => void;\n getAttention?: () => SyncAttentionState | undefined;\n onSelectionResolved?: (expected: SyncAttentionState) => void;\n}\n\nexport function attentionMainMenuItems(manager: ManagerDescription): ActionMenuItem<\"main\", \"review-attention\">[] {\n if (!manager.attention && manager.observation?.inspection.selectionState?.kind !== \"different\") return [];\n const disabled = manager.attentionReviewDisabled === true;\n return [\n {\n id: \"review-attention\",\n label: \"Review synced content (recommended)\",\n action: \"review-attention\",\n ...(disabled\n ? {\n disabled: true,\n disabledReason: \"Finish or recover the active operation first.\",\n }\n : {}),\n },\n ];\n}\n\nexport function blockedSyncMenuItem(\n label: string,\n manager: ManagerDescription,\n): ActionMenuItem<\"main\", \"sync\"> | undefined {\n if (label !== \"Sync now\" || !manager.attentionBlocksSync) return undefined;\n return {\n id: \"sync\",\n label,\n description: \"Review first.\",\n action: \"sync\",\n disabled: true,\n disabledReason: \"Review synced content first.\",\n };\n}\n\nexport async function showManagerAttention(\n ctx: ExtensionCommandContext,\n attention: SyncAttentionState,\n runRoute: RunRoute,\n signal: AbortSignal | undefined,\n onSelectionResolved: (() => void) | undefined,\n): Promise<\"close\" | \"stay\"> {\n const { showRemoteSelectionReview } = await import(\"./remote-selection-ui.js\");\n if (signal?.aborted) return \"close\";\n const review = await showRemoteSelectionReview(ctx, attention.decision.setupName, signal, undefined, {\n decision: attention.decision,\n origin: attention.origin,\n runRoute,\n onSelectionResolved,\n });\n if (review.kind === \"route-result\") {\n const disposition = await dispatchManagerResult(ctx, review.result, review.route, runRoute, signal, {\n onSelectionResolved,\n });\n return disposition.kind;\n }\n return review.kind === \"closed\" || review.kind === \"stale\" ? \"close\" : \"stay\";\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { runConfirmation } from \"@narumitw/pi-tui-kit\";\nimport { inspectOperationAvailability, operationCanRecover } from \"../state/operation-availability.js\";\nimport { errorMessage } from \"../sync/sync-errors.js\";\nimport type { RunRoute } from \"./cancellable-operation.js\";\nimport type { ManagerDescription } from \"./manager-state.js\";\nimport { safeTerminalText } from \"./terminal-text.js\";\n\nexport type RecoveryDisposition = \"restored\" | \"stay\" | \"close\";\n\nexport async function recoverSyncAccess(\n ctx: ExtensionCommandContext,\n manager: ManagerDescription,\n runRoute: RunRoute,\n sessionSignal: AbortSignal | undefined,\n actionSignal: AbortSignal,\n): Promise<RecoveryDisposition> {\n const operation = manager.operation;\n if (!operation || !operationCanRecover(operation)) {\n ctx.ui.notify(\"Operation status changed. Refresh the manager before retrying recovery.\", \"warning\");\n return \"stay\";\n }\n const signal = sessionSignal ? AbortSignal.any([sessionSignal, actionSignal]) : actionSignal;\n if (signal.aborted) return \"close\";\n const unreadable = operation.kind === \"recoverable-unreadable\";\n const details = unreadable\n ? \"Pi-sync cannot verify who owns the unreadable lock. Close other Pi sessions that may be syncing before continuing.\"\n : `The recorded ${safeTerminalText(operation.lock.command)} operation (pid ${operation.lock.pid}) appears to have stopped. Close other Pi sessions that may still be syncing before continuing.`;\n const confirmation = await runConfirmation(ctx, {\n title: \"Restore sync access?\",\n message: [\n details,\n \"\",\n \"This removes only the local operation lock.\",\n \"It does not change settings, local files, sync state, or remote data.\",\n ].join(\"\\n\"),\n confirmLabel: \"Remove local lock and continue\",\n cancelLabel: \"Cancel\",\n signal,\n isCurrent: () => !signal.aborted,\n onError: (_currentCtx, error) => {\n ctx.ui.notify(`Recovery confirmation failed: ${safeTerminalText(errorMessage(error))}`, \"error\");\n },\n });\n if (confirmation.kind === \"stale\") return \"close\";\n if (confirmation.kind === \"closed\") {\n if (confirmation.reason === \"close\") return \"close\";\n if (!signal.aborted) {\n ctx.ui.notify(\"Recovery cancelled; the local operation lock was not changed.\", \"info\");\n }\n return \"stay\";\n }\n if (confirmation.kind !== \"confirmed\") return \"stay\";\n if (signal.aborted) return \"close\";\n await runRoute(unreadable ? \"unlock --stale\" : \"unlock\", signal);\n if (signal.aborted) return \"close\";\n const latest = await inspectOperationAvailability();\n if (signal.aborted) return \"close\";\n return latest.kind === \"free\" ? \"restored\" : \"stay\";\n}\n", "import { truncateToWidth } from \"@earendil-works/pi-tui\";\nimport { loadConfig } from \"../settings/config.js\";\nimport { activeLocalConfigPath } from \"../settings/config-file.js\";\nimport { readLocalConfigObject } from \"../settings/settings-store.js\";\nimport type { AnySyncConfig } from \"../settings/settings-types.js\";\nimport { isCloudflareR2Endpoint, ownRecord } from \"../settings/settings-validation.js\";\nimport {\n inspectOperationAvailability,\n type OperationAvailability,\n operationBlocksChanges,\n operationCanRecover,\n} from \"../state/operation-availability.js\";\nimport { readStateForConfig, syncStateFingerprint } from \"../state/sync-state-store.js\";\nimport { errorMessage } from \"../sync/sync-errors.js\";\nimport type { StartupObservation } from \"../sync/sync-inspection.js\";\nimport { compareSyncInclude, syncIncludeSelection } from \"../sync/sync-policy.js\";\nimport { automaticSyncSummary } from \"./automatic-sync-summary.js\";\nimport {\n observationMatchesConfig,\n observationSummary,\n type SyncAttentionState,\n syncAttentionMatchesConfig,\n} from \"./sync-attention.js\";\nimport { startupTransferSummary } from \"./sync-behavior.js\";\nimport { countValidSyncSetups } from \"./sync-setups-ui.js\";\nimport { safeTerminalText } from \"./terminal-text.js\";\n\nexport const MAIN_MENU_ACTIONS = [\n \"Sync now\",\n \"Pull from remote\u2026\",\n \"Push to remote\u2026\",\n \"View differences\",\n \"Check remote status\",\n \"Settings\",\n \"History\",\n \"Diagnostics\",\n] as const;\n\nexport interface ManagerDescription {\n title: string;\n actions: string[];\n operation?: OperationAvailability;\n attention?: SyncAttentionState;\n observation?: StartupObservation;\n attentionBlocksSync?: boolean;\n attentionReviewDisabled?: boolean;\n}\n\nexport async function describeManagerState(\n signal?: AbortSignal,\n attention?: SyncAttentionState,\n inspectOperation: () => Promise<OperationAvailability> = inspectOperationAvailability,\n observation?: StartupObservation,\n): Promise<ManagerDescription> {\n let raw: Record<string, unknown> | undefined;\n try {\n raw = await readLocalConfigObject();\n } catch (error) {\n return {\n title: [\n \"Manage sync\",\n \"\",\n \"Settings file needs repair. Automatic sync and settings writes are paused.\",\n `Error: ${safeTerminalText(errorMessage(error))}`,\n `File: ${safeTerminalText(await activeLocalConfigPath())}`,\n \"\",\n \"Repair the JSON file, then reopen /sync.\",\n ].join(\"\\n\"),\n actions: [\"Help\"],\n };\n }\n if (!raw) {\n return {\n title: [\"Manage sync\", \"\", \"Not set up.\", \"\", \"What do you want to do?\"].join(\"\\n\"),\n actions: [\"Set up sync\", \"Help\"],\n };\n }\n const configuredTargets = ownRecord(raw.syncSetups);\n if (\n (raw.version === 3 || raw.version === 4 || raw.version === 5) &&\n configuredTargets &&\n Object.keys(configuredTargets).length === 0\n ) {\n return {\n title: [\n \"Manage sync\",\n \"\",\n \"No sync setups are configured.\",\n \"Add a sync setup using an existing storage connection.\",\n \"\",\n \"What do you want to do?\",\n ].join(\"\\n\"),\n actions: [\"Sync setups\u2026\", \"Storage connections\u2026\", \"Help\"],\n };\n }\n try {\n const config = await loadConfig();\n const operation = await inspectOperation();\n const changesBlocked = operationBlocksChanges(operation);\n const selection = syncIncludeSelection(config.include);\n let currentAttention: SyncAttentionState | undefined;\n if (attention) {\n try {\n const attentionConfig =\n attention.decision.setupName === config.setupName ? config : await loadConfig(attention.decision.setupName);\n if (syncAttentionMatchesConfig(attention, attentionConfig)) currentAttention = attention;\n } catch {\n currentAttention = undefined;\n }\n if (signal?.aborted) throw signal.reason;\n }\n const attentionComparison = currentAttention\n ? compareSyncInclude(currentAttention.decision.localInclude, currentAttention.decision.remoteInclude)\n : undefined;\n const noSyncedContent = config.include.length === 0;\n const syncState = changesBlocked ? undefined : await readStateForConfig(config).catch(() => undefined);\n const currentObservation =\n observation &&\n observationMatchesConfig(observation, config) &&\n syncState &&\n syncStateFingerprint(syncState) === observation.inspection.stateIdentity\n ? observation\n : undefined;\n const lastAppliedSnapshot = changesBlocked\n ? \"Unavailable while operations are locked\"\n : syncState?.lastAppliedSnapshot\n ? `${truncateToWidth(safeTerminalText(syncState.lastAppliedSnapshot), 20, \"\u2026\")} (application time unavailable; full ID in History)`\n : syncState\n ? \"Never synced\"\n : \"Unavailable\";\n const canSwitch = (await countValidSyncSetups(configuredTargets, signal)) > 1;\n const mainActions: string[] = [...MAIN_MENU_ACTIONS];\n if (canSwitch) mainActions.push(\"Switch sync setup\");\n if (syncState?.unresolved?.length) mainActions.unshift(\"Review unresolved conflicts\");\n const ordinaryTitle = [\n \"Manage sync\",\n \"\",\n `Current sync setup: ${safeTerminalText(config.setupName)}`,\n `Storage: ${backendStorageDescription(config)}`,\n \"CURRENT STATE\",\n ...(syncState?.unresolved?.length\n ? [\n `Unresolved: ${syncState.unresolved.length} dependency groups \u00B7 choose Review unresolved conflicts`,\n `Last observed: ${safeTerminalText(syncState.lastObservedSnapshot ?? \"unknown\")}`,\n ]\n : []),\n ...(currentAttention\n ? [\n currentAttention.decision.setupName === config.setupName\n ? \"Sync status: Review needed\"\n : `Sync status: Review needed for setup ${safeTerminalText(currentAttention.decision.setupName)}`,\n attentionComparison?.remoteOnly.length === 0 && attentionComparison.localOnly.length === 0\n ? \"Only the synced-content order differs.\"\n : `Remote-only paths: ${attentionComparison?.remoteOnly.length ?? 0} \u00B7 Device-only paths: ${attentionComparison?.localOnly.length ?? 0}`,\n \"Nothing has been changed.\",\n ]\n : currentObservation\n ? [\n `Startup check (${safeTerminalText(currentObservation.checkedAt)}): ${observationSummary(currentObservation)}`,\n \"Check-time observation only; synchronization rechecks current content.\",\n ]\n : [\"Remote status: Not checked\"]),\n `Included: ${selection.builtIns.length} built-in group${selection.builtIns.length === 1 ? \"\" : \"s\"} \u00B7 ${selection.custom.length} extra path${selection.custom.length === 1 ? \"\" : \"s\"} \u00B7 Sessions ${selection.sessions ? \"on\" : \"off\"}`,\n `Automatic sync: ${automaticSyncSummary(config.automatic)}`,\n `Startup transfer: ${startupTransferSummary(config)}`,\n `Agent mode: ${config.agentMode ? \"On (experimental; autonomous merged sync)\" : \"Off\"}`,\n ...(config.continuous ? await (await import(\"../sync/continuous-record.js\")).continuousStatusLines(config) : []),\n `Last applied: ${lastAppliedSnapshot}`,\n ...(noSyncedContent\n ? [\"\", \"No included content is selected. Choose included content in Settings before syncing.\"]\n : []),\n \"\",\n \"ACTIONS \u00B7 transfer, inspect, or manage\",\n ];\n return {\n title: (changesBlocked ? [\"Manage sync\", ...operationStatusLines(operation)] : ordinaryTitle).join(\"\\n\"),\n actions: operationActions(operation, noSyncedContent, canSwitch, mainActions),\n operation,\n ...(currentObservation ? { observation: currentObservation } : {}),\n ...(currentAttention\n ? {\n attention: currentAttention,\n attentionBlocksSync: currentAttention.decision.setupName === config.setupName,\n attentionReviewDisabled: changesBlocked,\n }\n : {}),\n };\n } catch (error) {\n if (signal?.aborted) throw error;\n return {\n title: [\n \"Manage sync\",\n \"\",\n \"Settings need attention. Automatic sync is paused.\",\n `Current sync setup: ${safeTerminalText(typeof raw.activeSyncSetup === \"string\" ? raw.activeSyncSetup : \"none\")}`,\n `Error: ${safeTerminalText(errorMessage(error))}`,\n `File: ${safeTerminalText(await activeLocalConfigPath())}`,\n \"\",\n \"What do you want to do?\",\n ].join(\"\\n\"),\n actions: [\"Sync setups\u2026\", \"Storage connections\u2026\", \"History\", \"Help\"],\n };\n }\n}\n\nfunction operationActions(\n operation: OperationAvailability,\n noSyncedContent: boolean,\n canSwitch: boolean,\n mainActions: string[],\n) {\n if (operationCanRecover(operation)) {\n return [\"Restore sync access\u2026 (recommended)\", \"History\", \"Help\"];\n }\n if (operation.kind !== \"free\") {\n return [\"Refresh operation status\", \"History\", \"Help\"];\n }\n return noSyncedContent\n ? [\n ...(mainActions.includes(\"Review unresolved conflicts\") ? [\"Review unresolved conflicts\"] : []),\n \"Settings\",\n ...(canSwitch ? [\"Switch sync setup\"] : []),\n \"History\",\n \"Diagnostics\",\n ]\n : mainActions;\n}\n\nfunction operationStatusLines(operation: OperationAvailability): string[] {\n switch (operation.kind) {\n case \"free\":\n return [];\n case \"live\": {\n const command = truncateToWidth(safeTerminalText(operation.lock.command), 16, \"\u2026\");\n return [\n `Running: ${command} (pid ${operation.lock.pid}). Wait, then refresh; Transfer actions and Settings return.`,\n ];\n }\n case \"busy\":\n return [\n \"Pi-sync may be starting or finishing. Wait, then refresh; Transfer actions and Settings remain unavailable.\",\n ];\n case \"recoverable-stale\":\n return [\n \"Sync paused: old lock remains. Close other Pi sessions then restore; Transfer actions and Settings return.\",\n ];\n case \"recoverable-unreadable\":\n return [\n \"Sync paused: owner unknown. Close other Pi sessions then restore; Transfer actions and Settings return.\",\n ];\n case \"inspection-error\":\n return [\"Lock check failed. Fix path access, then refresh; Transfer actions and Settings remain unavailable.\"];\n }\n}\n\nexport function backendStorageDescription(config: AnySyncConfig) {\n const connection = safeTerminalText(config.connectionName);\n switch (config.backend.type) {\n case \"s3\": {\n const type =\n config.backend.profile.kind === \"r2\" || isCloudflareR2Endpoint(config.backend.profile.endpoint)\n ? \"Cloudflare R2\"\n : \"S3-compatible\";\n return `${type} \u00B7 ${connection} \u00B7 ${safeTerminalText(config.backend.destination.bucket)}`;\n }\n case \"webdav\":\n return `WebDAV \u00B7 ${connection} \u00B7 ${safeTerminalText(config.backend.destination.path)}`;\n case \"git\":\n return `Git \u00B7 ${connection} \u00B7 ${safeTerminalText(config.backend.destination.branch)}`;\n }\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport { loadConfig } from \"../settings/config.js\";\nimport { readLocalConfigObject } from \"../settings/settings-store.js\";\nimport { ownRecord } from \"../settings/settings-validation.js\";\nimport { throwIfAborted } from \"../sync/signals.js\";\nimport { syncErrorGuidance } from \"../sync/sync-error-guidance.js\";\nimport { syncIncludeSelection } from \"../sync/sync-policy.js\";\nimport { safeTerminalText } from \"./terminal-text.js\";\n\nexport async function countValidSyncSetups(setups: Record<string, unknown> | undefined, signal?: AbortSignal) {\n let count = 0;\n for (const name of Object.keys(setups ?? {})) {\n throwIfAborted(signal);\n let valid = false;\n try {\n await loadConfig(name);\n valid = true;\n } catch {\n // Invalid setups stay visible in management but are not switchable.\n }\n throwIfAborted(signal);\n if (valid) count += 1;\n }\n return count;\n}\n\ntype SyncSetupActions = {\n add(signal?: AbortSignal): Promise<void>;\n edit(name: string, signal?: AbortSignal): Promise<void>;\n makeCurrent(name: string, signal?: AbortSignal): Promise<\"exit\" | undefined>;\n remove(name: string, signal?: AbortSignal): Promise<void>;\n};\n\ninterface SetupMenuState {\n setups: Record<string, unknown>;\n active?: string;\n selected?: {\n name: string;\n detail: string[];\n valid: boolean;\n removeUnavailable: boolean;\n };\n}\n\nexport async function showSyncSetups(\n ctx: ExtensionCommandContext,\n actions: SyncSetupActions,\n signal?: AbortSignal,\n): Promise<\"exit\" | undefined> {\n let selectedName: string | undefined;\n let exit = false;\n const nameById = new Map<string, string>();\n type Screen = \"list\" | \"detail\";\n type Action = \"add\" | \"select\" | \"make-current\" | \"edit\" | \"remove\" | \"back\";\n const menu = defineMenu<SetupMenuState, Screen, Action, ExtensionCommandContext>({\n start: \"list\",\n screens: {\n list: ({ state }) => {\n nameById.clear();\n const names = Object.keys(state.setups).sort((left, right) => left.localeCompare(right));\n return {\n kind: \"actions\",\n title: \"Sync setups\",\n lines: [\"What to sync, where to store it, and when to sync.\"],\n items: [\n { id: \"add\", label: \"Add sync setup\", action: \"add\" },\n ...names.map((name, index) => {\n const id = `setup:${index}`;\n nameById.set(id, name);\n return {\n id,\n label: `${safeTerminalText(name)}${name === state.active ? \" (current)\" : \"\"}`,\n description: setupSummary(state.setups[name]),\n action: \"select\" as const,\n };\n }),\n ],\n hint: \"back\",\n };\n },\n detail: ({ state }) => ({\n kind: \"actions\",\n title: state.selected ? `Sync setup \u201C${safeTerminalText(state.selected.name)}\u201D` : \"Sync setup\",\n lines: state.selected?.detail ?? [\"This sync setup no longer exists.\"],\n items: state.selected\n ? [\n ...(!state.selected.name || state.selected.name === state.active || !state.selected.valid\n ? []\n : [\n {\n id: \"make-current\",\n label: \"Make current\u2026\",\n action: \"make-current\" as const,\n },\n ]),\n { id: \"edit\", label: \"Edit storage location\u2026\", action: \"edit\" },\n ...(state.selected.removeUnavailable\n ? []\n : [\n {\n id: \"remove\",\n label: \"Remove sync setup\u2026\",\n action: \"remove\" as const,\n },\n ]),\n { id: \"back\", label: \"Back\", action: \"back\" },\n ]\n : [{ id: \"back\", label: \"Back\", action: \"back\" }],\n hint: \"back\",\n }),\n },\n actions: {\n add: async () => {\n try {\n await actions.add(signal);\n } catch (error) {\n if (!signal?.aborted) {\n ctx.ui.notify(`Sync setup was not added: ${menuErrorMessage(error)}`, \"error\");\n }\n }\n return { kind: \"stay\" };\n },\n select: async ({ itemId }) => {\n selectedName = nameById.get(itemId);\n return selectedName ? { kind: \"to\", screen: \"detail\" } : { kind: \"rejected\" };\n },\n \"make-current\": async () => {\n if (!selectedName) return { kind: \"rejected\" };\n try {\n exit = (await actions.makeCurrent(selectedName, signal)) === \"exit\";\n return exit ? { kind: \"close\" } : { kind: \"stay\" };\n } catch (error) {\n notifySetupChangeError(ctx, selectedName, error, signal);\n return { kind: \"stay\" };\n }\n },\n edit: async () => {\n if (!selectedName) return { kind: \"rejected\" };\n try {\n await actions.edit(selectedName, signal);\n } catch (error) {\n notifySetupChangeError(ctx, selectedName, error, signal);\n }\n return { kind: \"stay\" };\n },\n remove: async () => {\n if (!selectedName) return { kind: \"rejected\" };\n const name = selectedName;\n try {\n await actions.remove(name, signal);\n selectedName = undefined;\n return { kind: \"back\" };\n } catch (error) {\n notifySetupChangeError(ctx, name, error, signal);\n return { kind: \"stay\" };\n }\n },\n back: async () => {\n selectedName = undefined;\n return { kind: \"back\" };\n },\n },\n });\n await runMenu(ctx, menu, {\n getState: async () => loadSetupMenuState(selectedName, signal),\n signal,\n isCurrent: () => !signal?.aborted,\n });\n return exit ? \"exit\" : undefined;\n}\n\nasync function loadSetupMenuState(selectedName: string | undefined, signal?: AbortSignal): Promise<SetupMenuState> {\n const raw = await readLocalConfigObject();\n throwIfAborted(signal);\n const setups = ownRecord(raw?.syncSetups) ?? {};\n const active = typeof raw?.activeSyncSetup === \"string\" ? raw.activeSyncSetup : undefined;\n if (!selectedName || !ownRecord(setups[selectedName])) return { setups, active };\n const setupCount = Object.keys(setups).length;\n const isCurrent = selectedName === active;\n let detail: string[];\n let valid = true;\n try {\n const config = await loadConfig(selectedName);\n throwIfAborted(signal);\n const selection = syncIncludeSelection(config.include);\n detail = [\n `Status: ${isCurrent ? \"Current\" : \"Not current\"}`,\n `Storage connection: ${safeTerminalText(config.connectionName)}`,\n `Endpoint: ${storageEndpoint(config)}`,\n `Storage location: ${storageLocation(config)}`,\n `Included content: ${selection.builtIns.length} built-in groups \u00B7 ${selection.custom.length} extra paths`,\n `Sessions: ${selection.sessions ? \"On \u2014 privacy-sensitive\" : \"Off\"}`,\n `Automatic sync: ${config.automatic ? \"On\" : \"Off\"}`,\n `Automatic transfer at startup: ${config.automaticTransfer ? \"On \u2014 may upload, replace, or delete selected files; no reload\" : \"Off\"}`,\n `Agent mode: ${config.agentMode ? \"On (experimental; autonomous merged sync)\" : \"Off\"}`,\n `Continuous sync: ${config.continuous ? (config.agentMode ? \"On (experimental; recurring requests and transfers)\" : \"Saved On; paused until Agent mode is enabled\") : \"Off\"}`,\n isCurrent\n ? \"Edit included content and automatic sync in /sync \u2192 Settings.\"\n : \"To edit included content or automatic sync, make this setup current, then open /sync \u2192 Settings.\",\n ];\n } catch (error) {\n valid = false;\n detail = [\n `Status: Invalid${isCurrent ? \" current setup\" : \"\"}`,\n `Reason: ${menuErrorMessage(error)}`,\n \"Make current and sync are unavailable until this setup is repaired.\",\n ];\n }\n const removeUnavailable = isCurrent && setupCount > 1;\n if (removeUnavailable) detail.push(\"Remove unavailable: switch to another setup first.\");\n return {\n setups,\n active,\n selected: { name: selectedName, detail, valid, removeUnavailable },\n };\n}\n\nfunction notifySetupChangeError(ctx: ExtensionCommandContext, name: string, error: unknown, signal?: AbortSignal) {\n if (signal?.aborted) return;\n ctx.ui.notify(`Sync setup \u201C${safeTerminalText(name)}\u201D was not changed: ${menuErrorMessage(error)}`, \"error\");\n}\n\nfunction menuErrorMessage(error: unknown) {\n return syncErrorGuidance(error);\n}\n\nfunction setupSummary(value: unknown) {\n const storage = ownRecord(ownRecord(value)?.storage);\n if (!storage || typeof storage.connection !== \"string\") return \"Invalid storage reference\";\n return safeTerminalText(\n `${storage.connection} \u00B7 ${storage.bucket ?? storage.branch ?? \"WebDAV\"} \u00B7 ${storage.path ?? \"missing path\"}`,\n );\n}\n\nfunction storageEndpoint(config: Awaited<ReturnType<typeof loadConfig>>) {\n switch (config.backend.type) {\n case \"s3\":\n return safeTerminalText(config.backend.profile.endpoint);\n case \"git\":\n return safeTerminalText(config.backend.profile.remote);\n case \"webdav\":\n return safeTerminalText(config.backend.profile.url);\n }\n}\n\nfunction storageLocation(config: Awaited<ReturnType<typeof loadConfig>>) {\n switch (config.backend.type) {\n case \"s3\":\n return safeTerminalText(`${config.backend.destination.bucket}/${config.storagePath}`);\n case \"git\":\n return safeTerminalText(`Git \u00B7 ${config.backend.destination.branch}:${config.storagePath}`);\n case \"webdav\":\n return safeTerminalText(`WebDAV \u00B7 ${config.storagePath}`);\n }\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, type MenuSettingItem, runMenu } from \"@narumitw/pi-tui-kit\";\nimport { loadConfig } from \"../settings/config.js\";\nimport { localConfigPath } from \"../settings/config-file.js\";\nimport { updateSyncSetup } from \"../settings/settings-management.js\";\nimport { updateLocalConfig } from \"../settings/settings-store.js\";\nimport { normalizeLocalFields, sameLocalFields } from \"../sync/local-fields.js\";\nimport {\n SETUP_SWITCH_ACTION_OPTIONS,\n saveOnSwitch,\n setupSwitchActionFromLabel,\n setupSwitchActionLabel,\n} from \"../sync/setup-switch.js\";\nimport { captureMutationOwner } from \"../sync/sync-local.js\";\nimport {\n AGENT_MODE_DESCRIPTION,\n CONTINUOUS_DESCRIPTION,\n saveAgentMode,\n saveContinuousMode,\n} from \"./agent-mode-setting.js\";\nimport type { RunRoute } from \"./cancellable-operation.js\";\nimport { dispatchManagerResult } from \"./manager-result-dispatcher.js\";\nimport { boundedSettingsUI } from \"./settings-frame.js\";\nimport { showEditSyncSetupStorage, showSyncSetupManager } from \"./setup/setup-actions.js\";\nimport { showStorageConnections } from \"./storage-connections-ui.js\";\nimport { AUTOMATIC_SYNC_DESCRIPTION, STARTUP_TRANSFER_DESCRIPTION, startupTransferSummary } from \"./sync-behavior.js\";\nimport { configureSyncStatus } from \"./sync-status.js\";\nimport { safeTerminalText } from \"./terminal-text.js\";\n\nexport type SyncSettingsRoute = RunRoute;\n\nexport async function showSyncSettings(\n ctx: ExtensionCommandContext,\n runRoute: SyncSettingsRoute,\n signal?: AbortSignal,\n): Promise<\"back\" | \"exit\"> {\n let disposition: \"back\" | \"exit\" = \"back\";\n const exitSettings = () => {\n disposition = \"exit\";\n return { kind: \"close\" as const };\n };\n if (ctx.mode !== \"tui\") {\n ctx.ui.notify(`Edit pi-sync settings manually: ${safeTerminalText(localConfigPath())}`, \"info\");\n if (ctx.mode === \"rpc\" && ctx.hasUI) {\n // Preserve RPC catalog management; preference/credential editing stays TUI-only.\n const management = defineMenu<undefined, \"management\", \"setups\" | \"connections\", ExtensionCommandContext>({\n start: \"management\",\n screens: {\n management: () => ({\n kind: \"actions\",\n title: \"Sync settings management\",\n items: [\n { id: \"setups\", label: \"Manage sync setups\", action: \"setups\" },\n { id: \"connections\", label: \"Manage storage connections\", action: \"connections\" },\n ],\n hint: \"back\",\n }),\n },\n actions: {\n setups: async ({ signal: actionSignal }) => {\n const result = await showSyncSetupManager(ctx, runRoute, actionSignal);\n return result === \"exit\" ? exitSettings() : { kind: \"stay\" };\n },\n connections: async ({ signal: actionSignal }) => {\n await showStorageConnections(ctx, actionSignal);\n return { kind: \"stay\" };\n },\n },\n });\n await runMenu(ctx, management, { getState: () => undefined, signal, isCurrent: () => !signal?.aborted });\n }\n return disposition;\n }\n const initial = await loadConfig();\n if (signal?.aborted) return \"back\";\n const setupName = initial.setupName;\n type Action =\n | \"automatic\"\n | \"automatic-transfer\"\n | \"agent-mode\"\n | \"continuous\"\n | \"merge-settings\"\n | \"local-fields\"\n | \"content-policy\"\n | \"skip-secret-scan\"\n | \"show-status\"\n | \"debug\"\n | \"on-switch\"\n | \"include\"\n | \"remote-include\"\n | \"storage-location\"\n | \"setups\"\n | \"connections\";\n type Group = \"content\" | \"behavior\" | \"storage\" | \"advanced\" | \"all\";\n type Screen = \"categories\" | Group;\n const groups: Record<Group, { label: string; ids: readonly string[] }> = {\n content: { label: \"Sync content\", ids: [\"include\", \"remoteInclude\", \"localFields\"] },\n behavior: {\n label: \"Sync behavior\",\n ids: [\"automatic\", \"automaticTransfer\", \"agentMode\", \"continuous\", \"onSwitch\"],\n },\n storage: { label: \"Storage & setups\", ids: [\"storageLocation\", \"setups\", \"connections\"] },\n advanced: { label: \"Advanced\", ids: [\"mergeSettings\", \"contentPolicy\", \"skipSecretScan\", \"showStatus\", \"debug\"] },\n all: { label: \"All settings (search)\", ids: [] },\n };\n let saveStatus = \"Simple choices save immediately. Back does not undo saved changes.\";\n // Keep Kit's existing settings adapter: native SettingsList has no async save/rollback\n // contract or injected keybindings. Kit preserves these safety and accessibility behaviors.\n // Categories use public navigation; All settings retains cross-category search.\n const settingsScreen = (state: Awaited<ReturnType<typeof loadConfig>>, group: Group) =>\n ({\n kind: \"settings\",\n title: `Pi Sync Settings \u00B7 ${groups[group].label}`,\n lines: [\n `Setup: ${safeTerminalText(state.setupName)} \u00B7 Connection: ${safeTerminalText(state.connectionName)}`,\n saveStatus,\n ],\n items: (\n [\n {\n id: \"include\",\n label: \"Included paths\",\n description:\n \"This setup: choose paths in a draft, then review and Save or Discard. No transfer is started.\",\n currentValue: `${state.include.length} paths \u00B7 Edit`,\n action: \"include\",\n },\n {\n id: \"remoteInclude\",\n label: \"Compare included paths\",\n description:\n \"This setup: compare included-path policies, not file contents. Review before saving either list; no files transfer unless you explicitly Continue.\",\n currentValue: \"Review\",\n action: \"remote-include\",\n },\n {\n id: \"localFields\",\n label: \"Machine-local fields\",\n description:\n \"This setup: settings.json root fields excluded from future portable snapshots, not project overrides. Policy changes require reviewed directional migration; old history remains.\",\n currentValue: `${state.localFields?.length ?? 0} fields \u00B7 Edit`,\n action: \"local-fields\",\n },\n {\n id: \"storageLocation\",\n label: \"Storage location\",\n description: \"This setup: review and save bucket, branch, or path changes. Remote history is not moved.\",\n currentValue:\n state.backend.type === \"s3\"\n ? `${safeTerminalText(state.backend.destination.bucket)} \u00B7 ${safeTerminalText(state.backend.destination.prefix)}`\n : state.backend.type === \"git\"\n ? `${safeTerminalText(state.backend.destination.branch)} \u00B7 ${safeTerminalText(state.backend.destination.directory)}`\n : safeTerminalText(state.backend.destination.path),\n action: \"storage-location\",\n },\n {\n id: \"setups\",\n label: \"Manage sync setups\",\n description:\n \"This device: add, switch, edit, or remove sync setups. Each edit identifies its owner before saving.\",\n currentValue: \"Open\",\n action: \"setups\",\n },\n {\n id: \"connections\",\n label: \"Manage storage connections\",\n description:\n \"Shared connections on this device: review affected setups before saving server or credential changes.\",\n currentValue: \"Open\",\n action: \"connections\",\n },\n {\n id: \"automatic\",\n label: \"Automatic sync\",\n description: AUTOMATIC_SYNC_DESCRIPTION,\n currentValue: state.automatic ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"automatic\",\n },\n {\n id: \"automaticTransfer\",\n label: \"Startup transfer\",\n description: `${STARTUP_TRANSFER_DESCRIPTION} Saved preference and requirements: ${startupTransferSummary(state)}.`,\n currentValue: state.automaticTransfer ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"automatic-transfer\",\n },\n {\n id: \"agentMode\",\n label: \"Agent mode (experimental)\",\n description: AGENT_MODE_DESCRIPTION,\n currentValue: state.agentMode ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"agent-mode\",\n },\n {\n id: \"continuous\",\n label: \"Continuous sync (experimental)\",\n description: `${CONTINUOUS_DESCRIPTION}${state.continuous && !state.agentMode ? \" Saved On, but paused until Agent mode is enabled.\" : \"\"}`,\n currentValue: state.continuous ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"continuous\",\n },\n {\n id: \"onSwitch\",\n label: \"On setup switch\",\n description:\n \"All setups on this device: ask before a pull review, open it automatically, or switch without pulling. Applies to subsequent switches.\",\n currentValue: setupSwitchActionLabel(state.onSwitch),\n values: SETUP_SWITCH_ACTION_OPTIONS.map(({ label }) => label),\n action: \"on-switch\",\n },\n {\n id: \"mergeSettings\",\n label: \"Merge settings fields\",\n description:\n \"This setup, experimental opt-in: merge independent global settings.json root fields with a verified private ancestor. Arrays and nested objects remain atomic. Applies to subsequent sync; no reload.\",\n currentValue: state.mergeSettings ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"merge-settings\",\n },\n {\n id: \"contentPolicy\",\n label: \"Content merge / partial progress\",\n description:\n \"This setup, experimental opt-in: review the version-5 upgrade before saving. Merge bounded text and prefix-only sessions; partial progress keeps withheld versions and baselines. Applies to subsequent sync; disabling does not clear recovery evidence.\",\n currentValue: state.mergeContent\n ? state.partialSync\n ? \"Merge + partial\"\n : \"Merge only\"\n : state.partialSync\n ? \"Partial only\"\n : \"Off\",\n values: [\"Off\", \"Merge only\", \"Merge + partial\", \"Partial only\"],\n action: \"content-policy\",\n },\n {\n id: \"skipSecretScan\",\n label: \"Skip secret scan\",\n description:\n \"All setups on this device: skip possible-secret checks on subsequent pushes, including automatic pushes. Other safety checks remain. Diagnostics still scans.\",\n currentValue: state.skipSecretScan ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"skip-secret-scan\",\n },\n {\n id: \"showStatus\",\n label: \"Show sync status\",\n description:\n \"All setups on this device: saved and applied immediately to Pi status. Review widgets and notifications remain available.\",\n currentValue: state.showStatus ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"show-status\",\n },\n {\n id: \"debug\",\n label: \"Debug startup timings\",\n description:\n \"All setups on this device: show startup durations in TUI/RPC notifications. Applies next session start; no credentials or file contents.\",\n currentValue: state.debug ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"debug\",\n },\n ] satisfies MenuSettingItem<Action>[]\n ).filter((item) => group === \"all\" || groups[group].ids.includes(item.id)),\n }) as const;\n const menu = defineMenu<Awaited<ReturnType<typeof loadConfig>>, Screen, Action, ExtensionCommandContext>({\n start: \"categories\",\n screens: {\n categories: ({ state }) => ({\n kind: \"actions\",\n title: \"Pi Sync Settings\",\n lines: [\n `Setup: ${safeTerminalText(state.setupName)} \u00B7 Connection: ${safeTerminalText(state.connectionName)}`,\n \"Choose a task, or search all settings. Scope is shown in each setting's description.\",\n saveStatus,\n ],\n items: (Object.entries(groups) as [Group, (typeof groups)[Group]][]).map(([id, group]) => ({\n id,\n label: group.label,\n to: id,\n })),\n hint: \"back\",\n }),\n content: ({ state }) => settingsScreen(state, \"content\"),\n behavior: ({ state }) => settingsScreen(state, \"behavior\"),\n storage: ({ state }) => settingsScreen(state, \"storage\"),\n advanced: ({ state }) => settingsScreen(state, \"advanced\"),\n all: ({ state }) => settingsScreen(state, \"all\"),\n },\n actions: {\n \"storage-location\": async ({ signal: actionSignal }) => {\n const editorSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n await showEditSyncSetupStorage(ctx, setupName, editorSignal);\n return resumeSettings(editorSignal);\n },\n setups: async ({ signal: actionSignal }) => {\n const editorSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n const result = await showSyncSetupManager(ctx, runRoute, editorSignal);\n return result === \"exit\" ? exitSettings() : resumeSettings(editorSignal);\n },\n connections: async ({ signal: actionSignal }) => {\n const editorSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n await showStorageConnections(ctx, editorSignal);\n return resumeSettings(editorSignal);\n },\n \"content-policy\": async ({ value, signal: actionSignal }) => {\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n const validate = captureMutationOwner(ctx, mutationSignal);\n try {\n const previous = await loadConfig(setupName);\n validate();\n const mergeContent = value === \"Merge only\" || value === \"Merge + partial\";\n const partialSync = value === \"Partial only\" || value === \"Merge + partial\";\n if (\n !(await ctx.ui.confirm(\n \"Save experimental content policy?\",\n \"This explicitly upgrades settings to version 5; partial snapshots use version 3 and older clients must refuse them. Text/session merge is conservative. Partial sync preserves withheld versions and old baselines. Disabling does not clear unresolved groups or recovery evidence. Review a directional migration first if portable policy changes.\",\n { signal: mutationSignal },\n ))\n )\n return { kind: \"rejected\" };\n validate();\n ctx.ui.notify(\"Saving reviewed Pi Sync policy\u2026\", \"info\");\n await updateLocalConfig((current) => {\n validate();\n const setup = current.syncSetups[setupName];\n if (\n !setup ||\n Boolean(setup.sync.mergeContent) !== Boolean(previous.mergeContent) ||\n Boolean(setup.sync.partialSync) !== Boolean(previous.partialSync)\n )\n throw new Error(\"Content policy changed during review.\");\n return {\n ...current,\n version: 5,\n syncSetups: {\n ...current.syncSetups,\n [setupName]: { ...setup, sync: { ...setup.sync, mergeContent, partialSync } },\n },\n };\n }, mutationSignal);\n validate();\n saveStatus =\n \"Saved reviewed policy for this setup. Applies to subsequent sync operations; recovery evidence is retained.\";\n ctx.ui.notify(saveStatus, \"info\");\n return { kind: \"stay\" };\n } catch (error) {\n if (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n \"merge-settings\": async ({ value, signal: actionSignal }) => {\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n const validate = captureMutationOwner(ctx, mutationSignal);\n try {\n validate();\n await updateSyncSetup(\n setupName,\n (setup) => ({ ...setup, sync: { ...setup.sync, mergeSettings: value === \"On\" } }),\n { signal: mutationSignal },\n );\n validate();\n return { kind: \"stay\" };\n } catch (error) {\n if (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n \"local-fields\": async ({ signal: actionSignal }) => {\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n const validate = captureMutationOwner(ctx, mutationSignal);\n try {\n const previous = await loadConfig(setupName);\n validate();\n const input = await ctx.ui.input(\n \"Machine-local settings.json root fields (JSON string array)\",\n JSON.stringify(previous.localFields ?? []),\n { signal: mutationSignal },\n );\n validate();\n if (input === undefined) return { kind: \"rejected\" };\n let fields: string[];\n try {\n fields = normalizeLocalFields(JSON.parse(input));\n } catch {\n throw new Error(\"Invalid localFields JSON array; no policy was changed.\");\n }\n if (sameLocalFields(previous.localFields, fields)) return { kind: \"stay\" };\n const confirmed = await ctx.ui.confirm(\n \"Save portable field policy?\",\n \"This opts into settings/snapshot version 4/2; older clients must refuse them. Future snapshots omit these fields, but old remote history is NOT erased. Review an explicit force push/pull migration before further sync. Removed rules can expose or replace local-only values.\",\n { signal: mutationSignal },\n );\n validate();\n if (!confirmed) return { kind: \"rejected\" };\n ctx.ui.notify(\"Saving reviewed Pi Sync policy\u2026\", \"info\");\n await updateLocalConfig((current) => {\n validate();\n const setup = current.syncSetups[setupName];\n if (!setup || !sameLocalFields(setup.sync.localFields, previous.localFields))\n throw new Error(\"Field policy changed while under review; reopen settings.\");\n return {\n ...current,\n version: current.version === 5 ? 5 : 4,\n syncSetups: {\n ...current.syncSetups,\n [setupName]: { ...setup, sync: { ...setup.sync, localFields: fields } },\n },\n };\n }, mutationSignal);\n validate();\n saveStatus =\n \"Saved reviewed policy for this setup. Applies to subsequent sync operations; recovery evidence is retained.\";\n ctx.ui.notify(saveStatus, \"info\");\n return { kind: \"stay\" };\n } catch (error) {\n if (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n automatic: async ({ value, signal: actionSignal }) => {\n const automatic = value === \"On\";\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n try {\n const latest = await loadConfig(setupName);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n if (latest.automatic === automatic) return { kind: \"stay\" };\n await updateSyncSetup(setupName, (setup) => ({ ...setup, sync: { ...setup.sync, automatic } }), {\n signal: mutationSignal,\n });\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n ctx.ui.notify(\n `Automatic sync ${automatic ? \"enabled\" : \"disabled\"} for \u201C${safeTerminalText(setupName)}\u201D.`,\n \"info\",\n );\n return { kind: \"stay\" };\n } catch (error) {\n if (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n \"agent-mode\": async ({ value, signal: actionSignal }) => {\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n const validate = captureMutationOwner(ctx, mutationSignal);\n try {\n const saved = await saveAgentMode(ctx, setupName, value === \"On\", mutationSignal);\n if (!saved) return { kind: \"rejected\" };\n try {\n validate();\n ctx.ui.notify(\n \"Agent mode saved. Applies to subsequent sync and the next session start; no transfer started.\",\n \"info\",\n );\n } catch {\n // The save committed. A closed or replaced UI must not report a failed save.\n // The next Settings read shows the persisted value.\n }\n return { kind: \"stay\" };\n } catch (error) {\n try {\n validate();\n } catch {\n return { kind: \"rejected\" };\n }\n notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n continuous: async ({ value, signal: actionSignal }) => {\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n const validate = captureMutationOwner(ctx, mutationSignal);\n try {\n const saved = await saveContinuousMode(ctx, setupName, value === \"On\", mutationSignal);\n if (!saved) return { kind: \"rejected\" };\n try {\n validate();\n ctx.ui.notify(\n value === \"On\"\n ? \"Continuous sync enabled. Monitoring starts after the /sync command or manager closes; completed work is not undone.\"\n : \"Continuous sync disabled. Completed work is not undone.\",\n \"info\",\n );\n } catch {\n /* committed save; do not use stale UI */\n }\n return { kind: \"stay\" };\n } catch (error) {\n try {\n validate();\n } catch {\n return { kind: \"rejected\" };\n }\n notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n \"automatic-transfer\": async ({ value, signal: actionSignal }) => {\n const automaticTransfer = value === \"On\";\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n try {\n await updateSyncSetup(setupName, (setup) => ({ ...setup, sync: { ...setup.sync, automaticTransfer } }), {\n signal: mutationSignal,\n });\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n ctx.ui.notify(\n `Automatic startup transfer ${automaticTransfer ? \"enabled for the next session start\" : \"disabled\"}. Completed transfers are not undone.`,\n \"info\",\n );\n return { kind: \"stay\" };\n } catch (error) {\n if (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n \"skip-secret-scan\": async ({ value, signal: actionSignal }) => {\n const skipSecretScan = value === \"On\";\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n try {\n const latest = await loadConfig(setupName);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n if (latest.skipSecretScan === skipSecretScan) return { kind: \"stay\" };\n await updateLocalConfig((settings) => ({ ...settings, skipSecretScan }), mutationSignal);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n ctx.ui.notify(`Secret scan ${skipSecretScan ? \"disabled\" : \"enabled\"} for pushes in all setups.`, \"info\");\n return { kind: \"stay\" };\n } catch (error) {\n if (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n \"show-status\": async ({ value, signal: actionSignal }) => {\n const showStatus = value === \"On\";\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n try {\n const latest = await loadConfig(setupName);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n if (latest.showStatus === showStatus) return { kind: \"stay\" };\n await updateLocalConfig((settings) => ({ ...settings, showStatus }), mutationSignal);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n configureSyncStatus(ctx, showStatus);\n ctx.ui.notify(`Pi Sync status ${showStatus ? \"enabled\" : \"disabled\"} for all setups.`, \"info\");\n return { kind: \"stay\" };\n } catch (error) {\n if (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n debug: async ({ value, signal: actionSignal }) => {\n const debug = value === \"On\";\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n try {\n await updateLocalConfig((settings) => ({ ...settings, debug }), mutationSignal);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n return { kind: \"stay\" };\n } catch (error) {\n if (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n \"on-switch\": async ({ value, signal: actionSignal }) => {\n const action = value ? setupSwitchActionFromLabel(value) : undefined;\n if (!action) return { kind: \"rejected\" };\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n try {\n const latest = await loadConfig(setupName);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n if (latest.onSwitch === action) return { kind: \"stay\" };\n await saveOnSwitch(action, mutationSignal);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n ctx.ui.notify(`After switching setup: ${value}.`, \"info\");\n return { kind: \"stay\" };\n } catch (error) {\n if (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n include: async ({ signal: actionSignal }) => {\n const editorSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n await runRoute(\"files\", editorSignal, undefined, setupName);\n return editorSignal.aborted ? { kind: \"rejected\" } : { kind: \"stay\" };\n },\n \"remote-include\": async ({ signal: actionSignal }) => {\n const reviewSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n const { showRemoteSelectionReview } = await import(\"./remote-selection-ui.js\");\n if (reviewSignal.aborted) return { kind: \"rejected\" };\n const review = await showRemoteSelectionReview(ctx, setupName, reviewSignal, undefined, {\n origin: \"settings\",\n runRoute,\n });\n if (reviewSignal.aborted) return { kind: \"rejected\" };\n if (review.kind === \"route-result\") {\n const disposition = await dispatchManagerResult(ctx, review.result, review.route, runRoute, reviewSignal);\n return disposition.kind === \"close\" ? exitSettings() : { kind: \"stay\" };\n }\n return review.kind === \"closed\" || review.kind === \"stale\" ? exitSettings() : { kind: \"stay\" };\n },\n },\n });\n for (const id of [\n \"automatic\",\n \"automatic-transfer\",\n \"merge-settings\",\n \"skip-secret-scan\",\n \"show-status\",\n \"debug\",\n \"on-switch\",\n ] as const) {\n const save = menu.actions[id];\n menu.actions[id] = async (action) => {\n const validate = captureMutationOwner(ctx, action.signal);\n validate();\n ctx.ui.notify(\"Saving Pi Sync setting\u2026\", \"info\");\n const result = await save(action);\n if (action.signal.aborted || signal?.aborted) return { kind: \"rejected\" };\n validate();\n saveStatus =\n result?.kind === \"rejected\"\n ? \"Save failed or rejected. Previous value retained; retry is available.\"\n : id === \"automatic-transfer\" || id === \"automatic\" || id === \"debug\"\n ? \"Saved. Enabling startup work applies next session start; completed transfers are not undone.\"\n : \"Saved. Applies to subsequent operations; status visibility applies immediately.\";\n ctx.ui.notify(saveStatus, result?.kind === \"rejected\" ? \"warning\" : \"info\");\n return result;\n };\n }\n async function resumeSettings(editorSignal: AbortSignal) {\n if (editorSignal.aborted) return { kind: \"close\" as const };\n try {\n const active = await loadConfig();\n if (editorSignal.aborted || active.setupName !== setupName) return { kind: \"close\" as const };\n // Stay reloads authoritative rows without pushing a duplicate screen or clearing search.\n return { kind: \"stay\" as const };\n } catch {\n return { kind: \"close\" as const };\n }\n }\n await runMenu({ ...ctx, ui: boundedSettingsUI(ctx) }, menu, {\n getState: () => loadConfig(setupName),\n signal,\n isCurrent: () => !signal?.aborted,\n });\n return disposition;\n}\n\nfunction notifySaveFailure(ctx: ExtensionCommandContext, error: unknown) {\n ctx.ui.notify(\n `Pi Sync settings save failed: ${safeTerminalText(error instanceof Error ? error.message : String(error))}`,\n \"error\",\n );\n}\n", "import { isDeepStrictEqual } from \"node:util\";\nimport type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { requireSettings, updateLocalConfig } from \"../settings/settings-store.js\";\nimport { captureMutationOwner } from \"../sync/sync-local.js\";\nimport { confirmMergeReview } from \"./merge-review.js\";\nimport { safeTerminalText } from \"./terminal-text.js\";\n\nexport const AGENT_MODE_DESCRIPTION =\n \"This setup, experimental: one autonomous merged sync next startup and on Sync now. Sends eligible conflict text to the selected Pi model; may incur costs and replace/delete selected local and remote content without transfer prompts. No automatic reload. Unsupported conflicts pause.\";\n\nexport const CONTINUOUS_DESCRIPTION =\n \"This setup, experimental: recurring sync while Pi is open. Requires Agent mode. Watches selected files, checks the remote every 60\u201366 seconds, and retries temporary failures. Local changes and retries can cause extra requests between polls. May disclose conflict text and incur model/storage costs. No automatic reload.\";\n\nexport function saveContinuousMode(\n ctx: ExtensionCommandContext,\n setupName: string,\n enabled: boolean,\n signal?: AbortSignal,\n) {\n return saveAgentMode(ctx, setupName, enabled, signal, \"continuous\");\n}\n\nexport async function saveAgentMode(\n ctx: ExtensionCommandContext,\n setupName: string,\n enabled: boolean,\n signal?: AbortSignal,\n preference: \"agentMode\" | \"continuous\" = \"agentMode\",\n) {\n const validate = captureMutationOwner(ctx, signal);\n const settings = await requireSettings();\n validate();\n const setup = settings.syncSetups[setupName];\n if (!setup || settings.activeSyncSetup !== setupName) throw new Error(\"Current sync setup changed; reopen Settings.\");\n const continuous = preference === \"continuous\";\n const label = continuous ? \"Continuous sync\" : \"Agent mode\";\n if (enabled && continuous && !setup.sync.agentMode) throw new Error(\"Enable Agent mode before Continuous sync.\");\n if (Boolean(setup.sync[preference]) === enabled) return true;\n if (enabled) {\n const summary = [\n `Setup: ${safeTerminalText(setupName)}`,\n `Storage connection: ${safeTerminalText(setup.storage.connection)}`,\n `Storage path: ${safeTerminalText(setup.storage.path)}`,\n ...(setup.storage.bucket ? [`Bucket: ${safeTerminalText(String(setup.storage.bucket))}`] : []),\n ...(setup.storage.branch ? [`Branch: ${safeTerminalText(String(setup.storage.branch))}`] : []),\n `Included paths: ${setup.sync.include.map(safeTerminalText).join(\", \")}`,\n continuous ? CONTINUOUS_DESCRIPTION : AGENT_MODE_DESCRIPTION,\n ...(continuous\n ? [\n \"Upgrade all Pi processes sharing this agent directory before enabling Continuous sync. Monitoring starts after the /sync command or manager closes. An elected idle local session uses its selected Pi model; another session can use a different provider/model. Each computer is a separate replica.\",\n \"Automatic requests are limited to two per candidate and two per replica binding in a rolling 15-minute window, across restarts. Network/storage checks and requests may incur costs. Retries start at five seconds and grow to five minutes. These are request bounds, not a currency cap.\",\n ]\n : setup.sync.continuous\n ? [\"The saved Continuous sync preference will resume monitoring after the /sync command or manager closes.\"]\n : []),\n \"Only bounded Markdown/plain-text conflicts and atomic global settings choices are eligible. Model errors can change intended behavior. Session histories, code, deletion conflicts and path collisions are not model-resolved.\",\n \"The existing baseline, selection, secret-scan and publication checks remain. Pi Sync cannot exclude arbitrary concurrent local writers. Disabling does not undo completed transfers or provider charges. No transfer starts from Settings.\",\n ].join(\"\\n\\n\");\n if (\n !(await confirmMergeReview(\n ctx,\n `Enable experimental ${label}?`,\n summary,\n signal,\n () => !signal?.aborted,\n `Enable ${label}`,\n summary.split(\"\\n\"),\n ))\n )\n return false;\n validate();\n }\n await updateLocalConfig((current) => {\n validate();\n if (\n current.activeSyncSetup !== setupName ||\n !isDeepStrictEqual(current.syncSetups[setupName], setup) ||\n !isDeepStrictEqual(\n current.storageConnections[setup.storage.connection],\n settings.storageConnections[setup.storage.connection],\n )\n )\n throw new Error(\"Sync setup or connection changed during Agent mode review; reopen Settings.\");\n return {\n ...current,\n syncSetups: { ...current.syncSetups, [setupName]: { ...setup, sync: { ...setup.sync, [preference]: enabled } } },\n };\n }, signal);\n // The atomic writer has committed. Later cancellation cannot undo this save.\n return true;\n}\n", "import { stripVTControlCharacters } from \"node:util\";\nimport type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\n\n/** Adapt only public rendering/input boundaries; Kit still owns search, saves and focus. */\nexport function boundedSettingsUI(ctx: ExtensionCommandContext): ExtensionCommandContext[\"ui\"] {\n return {\n ...ctx.ui,\n custom: (factory, options) =>\n ctx.ui.custom((tui, ...args) => {\n // Kit pins search before the selected setting at a one-row budget. Render its\n // smallest complete frame, then retain the active row when the real budget is smaller.\n const terminal = new Proxy(tui.terminal, {\n get: (target, key) => (key === \"rows\" ? Math.max(8, target.rows) : Reflect.get(target, key)),\n });\n const screenTui = new Proxy(tui, {\n get(target, key) {\n if (key === \"terminal\") return terminal;\n const value = Reflect.get(target, key);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n const guard = <\n T extends {\n render(width: number): string[];\n handleMouse?: import(\"@earendil-works/pi-tui\").Component[\"handleMouse\"];\n },\n >(\n component: T,\n ): T => {\n const render = component.render.bind(component);\n const handleMouse = component.handleMouse?.bind(component);\n let sourceRow = 0;\n const compact = () => tui.terminal.rows < 8;\n component.render = (width) => {\n if (width <= 0) return [];\n const lines = render(width);\n if (!compact()) return lines;\n const active = lines.findIndex((line) => stripVTControlCharacters(line).startsWith(\"\u2192\"));\n const search = lines.findIndex((line) => stripVTControlCharacters(line).startsWith(\">\"));\n sourceRow = active < 0 ? Math.max(0, search) : active;\n return lines.slice(sourceRow, sourceRow + 1);\n };\n if (handleMouse)\n component.handleMouse = (event) => {\n if (event.width <= 0 || (compact() && event.y !== 0)) return undefined;\n component.render(event.width);\n return handleMouse(compact() ? { ...event, y: event.y + sourceRow } : event);\n };\n return component;\n };\n const component = factory(screenTui, ...args);\n return component instanceof Promise ? component.then(guard) : guard(component);\n }, options),\n };\n}\n", "import { isDeepStrictEqual } from \"node:util\";\nimport type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport {\n addStorageConnection,\n removeStorageConnection,\n updateStorageConnection,\n} from \"../settings/settings-management.js\";\nimport { readLocalConfigObject } from \"../settings/settings-store.js\";\nimport { isCloudflareR2Endpoint, normalizeS3Endpoint, ownRecord } from \"../settings/settings-validation.js\";\nimport { syncErrorGuidance } from \"../sync/sync-error-guidance.js\";\nimport { showAddGitStorageProfile, showEditGitStorageProfile } from \"./setup/git-ui.js\";\nimport { applyS3CredentialUpdate, chooseS3Credentials, chooseS3CredentialUpdate } from \"./setup/s3-credentials-ui.js\";\nimport { promptResourceName } from \"./setup/setup-prompts.js\";\nimport { saveReviewedDraft } from \"./setup/setup-review.js\";\nimport { requiredInput, requiredValueInput } from \"./setup/text-input.js\";\nimport { showAddWebDavStorageProfile, showEditWebDavStorageProfile } from \"./setup/webdav-ui.js\";\nimport { safeTerminalText } from \"./terminal-text.js\";\n\nexport async function showStorageConnections(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n let selectedName: string | undefined;\n const nameById = new Map<string, string>();\n type Screen = \"list\" | \"detail\";\n type Action = \"add\" | \"select\" | \"edit\" | \"remove\" | \"back\";\n const menu = defineMenu<Awaited<ReturnType<typeof loadStorageMenuState>>, Screen, Action, ExtensionCommandContext>({\n start: \"list\",\n screens: {\n list: ({ state }) => {\n nameById.clear();\n const names = Object.keys(state.profiles).sort((left, right) => left.localeCompare(right));\n return {\n kind: \"actions\",\n title: \"Storage connections\",\n lines: state.supportedVersion\n ? [\"Server addresses and sign-in details, reusable across sync setups.\"]\n : [\"Create supported pi-sync settings before managing storage connections.\"],\n items: state.supportedVersion\n ? [\n { id: \"add\", label: \"Add storage connection\", action: \"add\" as const },\n ...names.map((name, index) => {\n const id = `connection:${index}`;\n nameById.set(id, name);\n return {\n id,\n label: safeTerminalText(name),\n description: connectionSummary(ownRecord(state.profiles[name]) ?? {}),\n action: \"select\" as const,\n };\n }),\n ]\n : [],\n hint: \"back\",\n };\n },\n detail: ({ state }) => ({\n kind: \"actions\",\n title: state.selected ? `Storage connection \u201C${safeTerminalText(state.selected.name)}\u201D` : \"Storage connection\",\n lines: state.selected?.lines ?? [\"This storage connection no longer exists.\"],\n items: state.selected\n ? [\n { id: \"edit\", label: \"Edit storage connection\u2026\", action: \"edit\" },\n ...(state.selected.usedBy.length === 0\n ? [\n {\n id: \"remove\",\n label: \"Remove storage connection\u2026\",\n action: \"remove\" as const,\n },\n ]\n : []),\n { id: \"back\", label: \"Back\", action: \"back\" },\n ]\n : [{ id: \"back\", label: \"Back\", action: \"back\" }],\n hint: \"back\",\n }),\n },\n actions: {\n add: async () => {\n try {\n await showAddStorageConnection(ctx, signal);\n } catch (error) {\n if (!signal?.aborted) {\n ctx.ui.notify(`Storage connection was not added: ${syncErrorGuidance(error)}`, \"error\");\n }\n }\n return { kind: \"stay\" };\n },\n select: async ({ itemId }) => {\n selectedName = nameById.get(itemId);\n return selectedName ? { kind: \"to\", screen: \"detail\" } : { kind: \"rejected\" };\n },\n edit: async ({ state }) => {\n if (!state.selected || state.selected.name !== selectedName) return { kind: \"rejected\" };\n try {\n await editStorageConnection(ctx, state.selected.name, state.selected.profile, state.selected.usedBy, signal);\n } catch (error) {\n notifyConnectionError(ctx, state.selected.name, error, signal);\n }\n return { kind: \"stay\" };\n },\n remove: async ({ state }) => {\n if (!state.selected || state.selected.name !== selectedName) return { kind: \"rejected\" };\n const name = state.selected.name;\n const confirmed = await ctx.ui.confirm(\n \"Remove storage connection?\",\n `Remove local storage connection \u201C${safeTerminalText(name)}\u201D? Remote data and history are not deleted.`,\n { signal },\n );\n if (!confirmed || signal?.aborted) return { kind: \"rejected\" };\n try {\n await removeStorageConnection(name, signal);\n ctx.ui.notify(`Removed storage connection \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n selectedName = undefined;\n return { kind: \"back\" };\n } catch (error) {\n notifyConnectionError(ctx, name, error, signal);\n return { kind: \"stay\" };\n }\n },\n back: async () => {\n selectedName = undefined;\n return { kind: \"back\" };\n },\n },\n });\n await runMenu(ctx, menu, {\n getState: () => loadStorageMenuState(selectedName, signal),\n signal,\n isCurrent: () => !signal?.aborted,\n });\n}\n\nasync function loadStorageMenuState(selectedName: string | undefined, signal?: AbortSignal) {\n const raw = await readLocalConfigObject();\n if (signal?.aborted) throw signal.reason;\n const profiles = ownRecord(raw?.storageConnections) ?? {};\n const profile = selectedName ? ownRecord(profiles[selectedName]) : undefined;\n if (!selectedName || !profile) {\n return {\n supportedVersion: raw?.version === 3 || raw?.version === 4 || raw?.version === 5,\n profiles,\n selected: undefined,\n };\n }\n const usedBy = referencingSetups(raw, selectedName);\n return {\n supportedVersion: raw?.version === 3 || raw?.version === 4 || raw?.version === 5,\n profiles,\n selected: {\n name: selectedName,\n profile,\n usedBy,\n lines: [\n `Type: ${connectionType(profile)}`,\n `Endpoint: ${connectionEndpoint(profile)}`,\n `Credentials: ${credentialSource(profile)}`,\n `Used by: ${usedBy.length > 0 ? usedBy.map(safeTerminalText).join(\", \") : \"No sync setups\"}`,\n ...(usedBy.length > 0\n ? [\n \"Remove unavailable: remove the listed sync setups first. Switch away from a current setup before removing it if other setups remain.\",\n ]\n : []),\n ],\n },\n };\n}\n\nfunction notifyConnectionError(ctx: ExtensionCommandContext, name: string, error: unknown, signal?: AbortSignal) {\n if (signal?.aborted) return;\n ctx.ui.notify(`Storage connection \u201C${safeTerminalText(name)}\u201D was not changed: ${syncErrorGuidance(error)}`, \"error\");\n}\n\nasync function editStorageConnection(\n ctx: ExtensionCommandContext,\n name: string,\n profile: Record<string, unknown>,\n usedBy: string[],\n signal?: AbortSignal,\n) {\n if (ctx.mode !== \"tui\") {\n ctx.ui.notify(\n \"Editing storage connections requires TUI mode for safe credential handling. Edit the private pi-sync settings file instead.\",\n \"warning\",\n );\n return;\n }\n if (profile.type === \"webdav\") {\n await showEditWebDavStorageProfile(\n ctx,\n name,\n { ...profile, kind: \"webdav\", ...(ownRecord(profile.credentials) ?? {}) },\n signal,\n usedBy,\n );\n return;\n }\n if (profile.type === \"git\") {\n await showEditGitStorageProfile(ctx, name, { ...profile, kind: \"git\" }, signal, usedBy);\n return;\n }\n const endpoint = await requiredInput(\n ctx,\n \"Endpoint\",\n String(profile.endpoint ?? \"https://s3.example.com\"),\n signal,\n normalizeS3Endpoint,\n );\n if (!endpoint || signal?.aborted) return;\n const region = await requiredInput(\n ctx,\n \"Region\\n\\nUse your bucket's region; Cloudflare R2 uses auto.\",\n String(profile.region ?? \"auto\"),\n signal,\n );\n if (!region || signal?.aborted) return;\n const storedCredentials = ownRecord(profile.credentials) ?? {};\n const credentials = await chooseS3CredentialUpdate(ctx, { ...profile, ...storedCredentials }, signal);\n if (!credentials || signal?.aborted) return;\n const saved = await saveReviewedDraft(\n ctx,\n \"Review storage connection\",\n [\n `Storage connection: ${safeTerminalText(name)}`,\n `Endpoint: ${safeTerminalText(String(profile.endpoint ?? \"missing\"))} \u2192 ${safeTerminalText(endpoint)}`,\n `Region: ${safeTerminalText(String(profile.region ?? \"auto\"))} \u2192 ${safeTerminalText(region)}`,\n `Credentials: ${safeTerminalText(credentials.summary)}`,\n `Affected sync setups: ${usedBy.length > 0 ? usedBy.map(safeTerminalText).join(\", \") : \"None\"}`,\n \"Saving changes future storage access for every affected setup; it does not move remote data.\",\n ],\n \"Save storage connection\",\n (saveSignal) =>\n updateStorageConnection(\n name,\n (current) => {\n if (current.type !== \"s3\" || !isDeepStrictEqual(current, profile)) {\n throw new Error(\"Storage connection changed while it was open; reopen it.\");\n }\n return {\n ...current,\n endpoint,\n region,\n credentials: applyS3CredentialUpdate(current.credentials, credentials) as typeof current.credentials,\n };\n },\n usedBy,\n saveSignal,\n ),\n signal,\n );\n if (!saved || signal?.aborted) return;\n ctx.ui.notify(`Saved storage connection \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n}\n\nexport async function showAddStorageConnection(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n if (ctx.mode !== \"tui\") {\n ctx.ui.notify(\n \"Adding storage connections requires TUI mode for safe credential handling. Edit the private pi-sync settings file instead.\",\n \"warning\",\n );\n return false;\n }\n const preset = await ctx.ui.select(\n \"Storage type\",\n [\"Cloudflare R2\", \"Other S3-compatible storage\", \"WebDAV\", \"Git\", \"Cancel\"],\n { signal },\n );\n if (signal?.aborted || !preset || preset === \"Cancel\") return false;\n if (preset === \"WebDAV\") return showAddWebDavStorageProfile(ctx, signal);\n if (preset === \"Git\") return showAddGitStorageProfile(ctx, signal);\n const name = await promptResourceName(ctx, \"storage connection\", preset === \"Cloudflare R2\" ? \"r2\" : \"s3\", signal);\n if (!name || signal?.aborted) return false;\n const endpoint = await requiredValueInput(\n ctx,\n \"S3 API endpoint\\n\\nUse the API URL from your storage provider, not its web console.\",\n preset === \"Cloudflare R2\" ? \"https://<account-id>.r2.cloudflarestorage.com\" : \"https://s3.example.com\",\n signal,\n normalizeS3Endpoint,\n );\n if (!endpoint || signal?.aborted) return false;\n const region =\n preset === \"Cloudflare R2\"\n ? \"auto\"\n : await requiredInput(\n ctx,\n \"Region\\n\\nUse the region assigned to your bucket by the provider.\",\n \"us-east-1\",\n signal,\n );\n if (!region || signal?.aborted) return false;\n const credentials = await chooseS3Credentials(ctx, signal);\n if (!credentials || signal?.aborted) return false;\n const saved = await saveReviewedDraft(\n ctx,\n \"Review storage connection\",\n [\n `Name: ${safeTerminalText(name)}`,\n `Type: ${preset}`,\n `Endpoint: ${safeTerminalText(endpoint)}`,\n `Region: ${safeTerminalText(region)}`,\n `Credentials: ${safeTerminalText(credentials.summary)}`,\n \"Adding a connection does not contact remote storage or start syncing.\",\n ],\n \"Add storage connection\",\n (saveSignal) =>\n addStorageConnection(\n name,\n {\n type: \"s3\",\n endpoint,\n region,\n credentials: {\n accessKeyId: credentials.profileFields.accessKeyId ?? \"\",\n secretAccessKey: credentials.profileFields.secretAccessKey ?? \"\",\n },\n },\n saveSignal,\n ),\n signal,\n );\n if (!saved) return false;\n if (signal?.aborted) return true;\n ctx.ui.notify(`Added storage connection \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n return true;\n}\n\nfunction referencingSetups(raw: Record<string, unknown> | undefined, connection: string) {\n return Object.entries(ownRecord(raw?.syncSetups) ?? {})\n .filter(([, value]) => ownRecord(ownRecord(value)?.storage)?.connection === connection)\n .map(([name]) => name)\n .sort((left, right) => left.localeCompare(right));\n}\n\nexport function connectionSummary(profile: Record<string, unknown>) {\n return `${connectionType(profile)} \u00B7 ${connectionEndpoint(profile)}`;\n}\n\nfunction connectionType(profile: Record<string, unknown>) {\n if (profile.type === \"git\") return \"Git\";\n if (profile.type === \"webdav\") return \"WebDAV\";\n if (profile.type === \"s3\" && typeof profile.endpoint === \"string\" && isCloudflareR2Endpoint(profile.endpoint)) {\n return \"Cloudflare R2\";\n }\n return \"S3-compatible\";\n}\n\nfunction connectionEndpoint(profile: Record<string, unknown>) {\n const value = profile.type === \"git\" ? profile.remote : profile.type === \"webdav\" ? profile.url : profile.endpoint;\n if (typeof value !== \"string\" || value.length === 0) return \"Missing\";\n if (profile.type === \"git\") return safeTerminalText(value);\n try {\n const url = new URL(value);\n return safeTerminalText(`${url.origin}${url.pathname}`);\n } catch {\n return \"Invalid\";\n }\n}\n\nfunction credentialSource(profile: Record<string, unknown>) {\n if (profile.type === \"git\") return \"Git credential helper or SSH configuration\";\n const credentials = ownRecord(profile.credentials);\n if (profile.type === \"webdav\") return credentials?.password ? \"Settings file\" : \"Missing\";\n if (credentials?.accessKeyId && credentials.secretAccessKey) return \"Settings file\";\n return \"Missing\";\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport { loadConfig, syncConfigReviewIdentity } from \"../../settings/config.js\";\nimport { loadOnSwitch, readLocalConfigObject } from \"../../settings/settings-store.js\";\nimport type { AnySyncConfig } from \"../../settings/settings-types.js\";\nimport { ownRecord } from \"../../settings/settings-validation.js\";\nimport { useSyncSetup } from \"../../sync/setup-switch.js\";\nimport { errorMessage } from \"../../sync/sync-errors.js\";\nimport { automaticSyncSummary } from \"../automatic-sync-summary.js\";\nimport { type RunRoute, runCancellableOperation } from \"../cancellable-operation.js\";\nimport { dispatchManagerResult } from \"../manager-result-dispatcher.js\";\nimport { backendStorageDescription } from \"../manager-state.js\";\nimport { safeTerminalText } from \"../terminal-text.js\";\n\nasync function selectSetupForSwitch(\n ctx: ExtensionCommandContext,\n raw: Record<string, unknown>,\n targets: Record<string, unknown>,\n active: string | undefined,\n signal?: AbortSignal,\n) {\n let selectedName: string | undefined;\n const nameById = new Map<string, string>();\n const profiles = ownRecord(raw.storageConnections);\n const menu = defineMenu<undefined, \"setups\", \"select\", ExtensionCommandContext>({\n start: \"setups\",\n screens: {\n setups: () => ({\n kind: \"actions\",\n title: \"Switch sync setup\",\n lines: [`Current sync setup: ${safeTerminalText(active ?? \"none\")}`],\n items: Object.keys(targets)\n .sort((left, right) => left.localeCompare(right))\n .map((candidate, index) => {\n const target = ownRecord(targets[candidate]);\n const storage = ownRecord(target?.storage);\n const profileName = typeof storage?.connection === \"string\" ? storage.connection : undefined;\n const profile = profileName && profiles ? ownRecord(profiles[profileName]) : undefined;\n const location = profile\n ? profile.type === \"git\"\n ? `${String(storage?.branch ?? \"missing branch\")}:${String(storage?.path ?? \"missing path\")}`\n : profile.type === \"s3\"\n ? `${String(storage?.bucket ?? \"missing bucket\")}/${String(storage?.path ?? \"missing path\")}`\n : String(storage?.path ?? \"missing path\")\n : `invalid: missing connection ${profileName ?? \"reference\"}`;\n const id = `setup:${index}`;\n nameById.set(id, candidate);\n return {\n id,\n label: `${safeTerminalText(candidate)}${candidate === active ? \" (current)\" : \"\"}`,\n description: `${safeTerminalText(profileName ?? \"unknown\")} \u00B7 ${safeTerminalText(location)}`,\n action: \"select\" as const,\n };\n }),\n hint: \"close\",\n }),\n },\n actions: {\n select: async ({ itemId }) => {\n selectedName = nameById.get(itemId);\n return { kind: \"close\" };\n },\n },\n });\n await runMenu(ctx, menu, {\n getState: () => undefined,\n signal,\n isCurrent: () => !signal?.aborted,\n });\n return selectedName;\n}\n\nexport async function showSetupSwitcher(\n ctx: ExtensionCommandContext,\n runRoute: RunRoute,\n selectedName?: string,\n signal?: AbortSignal,\n) {\n const raw = await readLocalConfigObject();\n if (signal?.aborted) return false;\n if (raw?.version !== 3 && raw?.version !== 4 && raw?.version !== 5) {\n ctx.ui.notify(\"Add a second sync setup before switching setups.\", \"info\");\n return false;\n }\n const targets = ownRecord(raw.syncSetups);\n if (!targets) {\n ctx.ui.notify(\"No sync setups are configured.\", \"warning\");\n return false;\n }\n const active = typeof raw.activeSyncSetup === \"string\" ? raw.activeSyncSetup : undefined;\n let name = selectedName;\n if (!name) {\n name = await selectSetupForSwitch(ctx, raw, targets, active, signal);\n if (!name) return false;\n }\n if (!name || !Object.hasOwn(targets, name)) {\n ctx.ui.notify(`Sync setup \u201C${safeTerminalText(name ?? \"unknown\")}\u201D no longer exists.`, \"warning\");\n return false;\n }\n if (name === active) {\n ctx.ui.notify(`Sync setup \u201C${safeTerminalText(name)}\u201D is already current.`, \"info\");\n return false;\n }\n let config: AnySyncConfig;\n try {\n config = await loadConfig(name);\n if (signal?.aborted) return false;\n } catch (error) {\n ctx.ui.notify(\n `Cannot use sync setup \u201C${safeTerminalText(name)}\u201D: ${safeTerminalText(errorMessage(error))}`,\n \"error\",\n );\n return false;\n }\n const onSwitch = await loadOnSwitch();\n if (signal?.aborted) return false;\n const switchEffect =\n onSwitch === \"ask-before-pull\"\n ? \"After switching, pi-sync will ask whether to review a pull for this setup.\"\n : onSwitch === \"pull-after-switch\"\n ? \"After switching, pi-sync will check this setup and show exact changes before applying them.\"\n : \"After switching, pi-sync will not pull or modify synced files.\";\n const confirmed = await ctx.ui.confirm(\n \"Switch sync setup?\",\n [\n `From: ${safeTerminalText(active ?? \"none\")}`,\n `To: ${safeTerminalText(name)}`,\n `Storage: ${backendStorageDescription(config)}`,\n `Included content: ${config.include.length} paths`,\n `Automatic sync: ${automaticSyncSummary(config.automatic)} \u00B7 Sessions: ${config.include.includes(\"sessions\") ? \"On\" : \"Off\"}`,\n `Automatic transfer at startup: ${config.automaticTransfer ? \"On \u2014 may upload, replace, or delete selected files; no reload\" : \"Off\"}`,\n `Agent mode: ${config.agentMode ? \"On (experimental; autonomous merged sync)\" : \"Off\"}`,\n `Continuous sync: ${config.continuous ? (config.agentMode ? \"On (experimental; recurring requests and transfers)\" : \"Saved On; paused until Agent mode is enabled\") : \"Off\"}`,\n \"\",\n switchEffect,\n ].join(\"\\n\"),\n { signal },\n );\n if (signal?.aborted || !confirmed) return false;\n try {\n let pullClosed = false;\n const result = await useSyncSetup(\n ctx,\n name,\n async (selectedTarget) => {\n const pullResult = await runCancellableOperation(\n ctx,\n `Pulling sync setup \u201C${safeTerminalText(name)}\u201D\u2026`,\n \"pull\",\n runRoute,\n {\n commitAware: true,\n cancelledMessage: null,\n target: selectedTarget,\n signal,\n },\n );\n const disposition = await dispatchManagerResult(ctx, pullResult, \"pull\", runRoute, signal);\n if (pullResult.kind === \"closed\" || pullResult.kind.endsWith(\"required\")) {\n pullClosed = disposition.kind === \"close\";\n }\n if (disposition.appliedRoute === \"pull\") return \"applied\";\n if (pullResult.kind === \"completed\") return pullResult.outcome;\n return pullResult.kind === \"cancelled\" ? \"cancelled\" : undefined;\n },\n onSwitch,\n signal,\n syncConfigReviewIdentity(config),\n );\n if (pullClosed) return \"closed\";\n return result.pullApplied ? \"pull-attempted\" : \"switched\";\n } catch (error) {\n if (signal?.aborted) return false;\n ctx.ui.notify(\n `Sync setup \u201C${safeTerminalText(name)}\u201D was not switched: ${safeTerminalText(errorMessage(error))}`,\n \"error\",\n );\n return false;\n }\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { refreshTargetCompletions } from \"../../commands/setup-completions.js\";\nimport { loadPartialConfig } from \"../../settings/config.js\";\nimport { removeSyncSetup } from \"../../settings/settings-management.js\";\nimport { readLocalConfigObject } from \"../../settings/settings-store.js\";\nimport { ownRecord } from \"../../settings/settings-validation.js\";\nimport type { RunRoute } from \"../cancellable-operation.js\";\nimport { showAddStorageConnection } from \"../storage-connections-ui.js\";\nimport { showSyncSetups } from \"../sync-setups-ui.js\";\nimport { safeTerminalText } from \"../terminal-text.js\";\nimport { showAddGitTarget, showEditGitTarget } from \"./git-ui.js\";\nimport { showAddS3Target, showEditS3Target } from \"./s3-ui.js\";\nimport { promptResourceName } from \"./setup-prompts.js\";\nimport { showSetupSwitcher } from \"./setup-switcher.js\";\nimport { showAddWebDavTarget, showEditWebDavTarget } from \"./webdav-ui.js\";\n\nexport async function showSyncSetupManager(ctx: ExtensionCommandContext, runRoute: RunRoute, signal?: AbortSignal) {\n return showSyncSetups(\n ctx,\n {\n add: async (setupSignal) => {\n await showAddTarget(ctx, setupSignal);\n },\n edit: async (name, setupSignal) => {\n await showEditSyncSetupStorage(ctx, name, setupSignal);\n },\n makeCurrent: async (name, setupSignal) => {\n const result = await showSetupSwitcher(ctx, runRoute, name, setupSignal);\n return result === \"pull-attempted\" || result === \"closed\" ? \"exit\" : undefined;\n },\n remove: async (name, setupSignal) => {\n await showRemoveTarget(ctx, name, setupSignal);\n },\n },\n signal,\n );\n}\n\nasync function showAddTarget(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n let raw = await readLocalConfigObject();\n if (signal?.aborted) return;\n if (!raw) return void ctx.ui.notify(\"Set up the first sync setup before adding another.\", \"info\");\n if (raw.version !== 3 && raw.version !== 4 && raw.version !== 5) {\n ctx.ui.notify(\"Version 1 and version 2 settings are unsupported and are never migrated.\", \"error\");\n return;\n }\n let profiles = ownRecord(raw.storageConnections) ?? {};\n const name = await promptResourceName(ctx, \"sync setup\", \"work\", signal);\n if (!name) return;\n const createConnection = \"Add a new storage connection\u2026\";\n let profile = await ctx.ui.select(\n \"Choose a storage connection\\n\\nReuse a server address and sign-in details. A new connection is saved separately and remains if you cancel this setup.\",\n [...Object.keys(profiles).sort(), createConnection, \"Cancel\"],\n { signal },\n );\n if (signal?.aborted || !profile || profile === \"Cancel\") return;\n if (profile === createConnection) {\n const previousNames = new Set(Object.keys(profiles));\n if (!(await showAddStorageConnection(ctx, signal))) return;\n if (signal?.aborted) return;\n raw = (await readLocalConfigObject()) ?? raw;\n if (signal?.aborted) return;\n profiles = ownRecord(raw.storageConnections) ?? {};\n profile = Object.keys(profiles).find((candidate) => !previousNames.has(candidate));\n if (!profile) return;\n ctx.ui.notify(\n `Connection \u201C${safeTerminalText(profile)}\u201D saved. Cancelling setup will keep this connection.`,\n \"info\",\n );\n }\n const storageKind = ownRecord(profiles[profile])?.type;\n if (storageKind === \"webdav\") {\n const saved = await showAddWebDavTarget(ctx, name, profile, signal);\n if (signal?.aborted) return;\n if (saved) await refreshTargetCompletions();\n return;\n }\n if (storageKind === \"git\") {\n const saved = await showAddGitTarget(ctx, name, profile, signal);\n if (signal?.aborted) return;\n if (saved) await refreshTargetCompletions();\n return;\n }\n await showAddS3Target(ctx, raw, profile, name, signal);\n}\n\nexport async function showEditSyncSetupStorage(ctx: ExtensionCommandContext, name: string, signal?: AbortSignal) {\n const partial = await loadPartialConfig(name);\n if (signal?.aborted) return;\n if (!partial.setupName) {\n ctx.ui.notify(\"Create supported pi-sync settings before editing a named sync setup.\", \"info\");\n return;\n }\n if (partial.storageKind === \"webdav\") {\n await showEditWebDavTarget(ctx, partial, signal);\n return;\n }\n if (partial.storageKind === \"git\") {\n await showEditGitTarget(ctx, partial, signal);\n return;\n }\n await showEditS3Target(ctx, partial, signal);\n}\n\nasync function showRemoveTarget(ctx: ExtensionCommandContext, name: string, signal?: AbortSignal) {\n const confirmed = await ctx.ui.confirm(\n \"Remove sync setup?\",\n `Remove local sync setup \u201C${safeTerminalText(name)}\u201D? Remote data and history are not deleted.`,\n { signal },\n );\n if (signal?.aborted || !confirmed) return;\n await removeSyncSetup(name, signal);\n if (signal?.aborted) return;\n await refreshTargetCompletions();\n if (signal?.aborted) return;\n ctx.ui.notify(`Removed sync setup \u201C${safeTerminalText(name)}\u201D; remote data was not deleted.`, \"info\");\n}\n"],
5
- "mappings": "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",
6
- "names": ["defineMenu", "runMenu", "defineMenu", "runMenu", "component", "isDeepStrictEqual", "defineMenu", "runMenu", "defineMenu", "runMenu", "isDeepStrictEqual", "defineMenu", "runMenu", "defineMenu", "runMenu", "defineMenu", "runMenu", "disposition", "defineMenu", "runMenu"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/ui/transfer-review.ts", "../../src/sync/apply-review.ts", "../../src/sync/field-migration.ts", "../../src/sync/sync-mutations.ts", "../../src/sync/sync-queries.ts"],
4
- "sourcesContent": ["import type { ExtensionCommandContext, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { confirmMergeReview } from \"./merge-review.js\";\n\n/** Reuse the scrollable safe-default review in TUI; retain RPC's confirmation protocol. */\nexport async function confirmTransferReview(\n ctx: ExtensionCommandContext | ExtensionContext,\n title: string,\n content: string,\n signal: AbortSignal | undefined,\n validate: () => void,\n) {\n validate();\n const isCurrent = () => {\n try {\n validate();\n return true;\n } catch {\n return false;\n }\n };\n const confirmed =\n ctx.mode === \"tui\" && ctx.hasUI\n ? await confirmMergeReview(ctx, title, content, signal, isCurrent, \"apply reviewed transfer\", content.split(\"\\n\"))\n : await ctx.ui.confirm(title, content, { signal });\n validate();\n return confirmed;\n}\n", "import { createHash } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { agentDir } from \"../snapshot/session-paths.js\";\nimport { addTopLevelCaseVariantDeletes } from \"../snapshot/snapshot-apply.js\";\nimport type { Snapshot } from \"../snapshot/snapshot-types.js\";\nimport { throwIfAborted } from \"./signals.js\";\n\nexport interface CaseCleanupReview {\n path: string;\n fingerprint: string;\n}\n\n/** Inspect the apply engine's additional alias removals, which logical snapshots omit. */\nexport async function inspectCaseCleanup(snapshot: Snapshot, signal?: AbortSignal): Promise<CaseCleanupReview[]> {\n throwIfAborted(signal);\n const root = agentDir();\n const plan = await addTopLevelCaseVariantDeletes(root, { writes: [], deletes: [] }, snapshot);\n throwIfAborted(signal);\n const review: CaseCleanupReview[] = [];\n for (const target of plan.deletes.sort()) {\n const stat = await fs.lstat(target);\n throwIfAborted(signal);\n const hash = createHash(\"sha256\");\n if (stat.isSymbolicLink()) hash.update(await fs.readlink(target));\n else {\n if (!stat.isFile()) throw new Error(\"Case-variant path is no longer a regular file or symlink.\");\n const handle = await fs.open(\n target,\n constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0) | (constants.O_NONBLOCK ?? 0),\n );\n try {\n throwIfAborted(signal);\n const opened = await handle.stat();\n if (!opened.isFile() || opened.dev !== stat.dev || opened.ino !== stat.ino)\n throw new Error(\"Case-variant file changed while preparing review.\");\n for await (const bytes of handle.createReadStream({ autoClose: false, signal })) {\n throwIfAborted(signal);\n hash.update(bytes);\n }\n } finally {\n await handle.close();\n }\n }\n throwIfAborted(signal);\n review.push({\n path: path.basename(target),\n fingerprint: `${stat.dev}:${stat.ino}:${stat.mode}:${hash.digest(\"hex\")}`,\n });\n }\n return review;\n}\n\nexport async function revalidateCaseCleanup(\n expected: readonly CaseCleanupReview[],\n snapshot: Snapshot,\n signal?: AbortSignal,\n) {\n const current = await inspectCaseCleanup(snapshot, signal);\n if (JSON.stringify(current) !== JSON.stringify(expected))\n throw new Error(\"Case-variant paths changed during transfer review; reopen the preview.\");\n}\n", "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, syncStateFingerprint, 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 { confirmTransferReview } from \"../ui/transfer-review.js\";\nimport { startupTransferEnabled } from \"./agent-policy.js\";\nimport { inspectCaseCleanup, revalidateCaseCleanup } from \"./apply-review.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 || !options.yes))\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 (!options.yes || 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 push review; retry from current bytes.\");\n }\n const currentState = await readStateForConfig(config);\n if (!options.yes && syncStateFingerprint(currentState) !== syncStateFingerprint(state))\n throw new Error(\"Baseline changed during push review.\");\n requireResolvedDirectionalProgress(currentState, 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 const caseCleanup = options.yes ? [] : await inspectCaseCleanup(physical, options.signal);\n validateMutation();\n if (\n !options.yes &&\n !(await confirmTransferReview(\n ctx,\n snapshotIncludesSessions(remote) ? \"Pull pi settings and sessions?\" : \"Pull pi settings?\",\n formatPullSummary(\n config,\n backend.destination,\n local,\n physical,\n protectedSessionPaths(ctx),\n caseCleanup.map((item) => item.path),\n ),\n options.signal,\n validateMutation,\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 const currentState = await readStateForConfig(config);\n if (!options.yes && syncStateFingerprint(currentState) !== syncStateFingerprint(state))\n throw new Error(\"Baseline changed during pull review.\");\n requireResolvedDirectionalProgress(currentState, options);\n if (!options.yes) await revalidateCaseCleanup(caseCleanup, physical, options.signal);\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 options.background?.validate(config);\n if (config.include.length > 0 && options.auto && startupTransferEnabled(config))\n 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 if (options.auto) throw new Error(\"Automatic transfer is not authorized by the current settings.\");\n\n // Established baselines return through mergeSync above; only initial-source selection remains.\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 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 (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 (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 const caseCleanup = options.yes ? [] : await inspectCaseCleanup(physical, options.signal);\n validateMutation();\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(\n config,\n backend.destination,\n local,\n physical,\n target,\n protectedSessionPaths(ctx),\n caseCleanup.map((item) => item.path),\n ),\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 const currentState = await readStateForConfig(config);\n if (!options.yes && syncStateFingerprint(currentState) !== syncStateFingerprint(state))\n throw new Error(\"Baseline changed during rollback review.\");\n requireResolvedDirectionalProgress(currentState, options, false);\n if (!options.yes) await revalidateCaseCleanup(caseCleanup, physical, options.signal);\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 confirmTransferReview(\n ctx,\n title,\n formatPushSummary(config, backend.destination, upload, head, countPreservedRemoteFiles(local, upload), remote),\n options.signal,\n captureMutationOwner(ctx, options.signal),\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 { readStateForConfig } from \"../state/sync-state-store.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 continuous = config.continuous\n ? await (await import(\"./continuous-record.js\")).continuousStatusLines(config)\n : [];\n throwIfAborted(options.signal);\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 ...continuous,\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 const lastApplied = await readStateForConfig(config)\n .then((state) => state.lastAppliedSnapshot)\n .catch(() => undefined);\n throwIfAborted(options.signal);\n const appliedDetails = lastApplied\n ? `Last applied snapshot ID: ${safeTerminalText(lastApplied)}\\nApplication time: unavailable. Snapshot dates are creation times.`\n : \"Last applied snapshot ID: unavailable.\";\n if (snapshots.length === 0) {\n ctx.ui.notify(`No remote pi-sync history found.\\n${appliedDetails}`, \"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\\n${appliedDetails}\\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 [\n appliedDetails,\n ...snapshots.map((item) => `${item.snapshotRef} ${item.createdAt} ${safeTerminalText(item.machine)}`),\n ].join(\"\\n\"),\n \"info\",\n );\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,eAAsB,sBACpB,KACA,OACA,SACA,QACA,UACA;AACA,WAAS;AACT,QAAM,YAAY,MAAM;AACtB,QAAI;AACF,eAAS;AACT,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,YACJ,IAAI,SAAS,SAAS,IAAI,QACtB,MAAM,mBAAmB,KAAK,OAAO,SAAS,QAAQ,WAAW,2BAA2B,QAAQ,MAAM,IAAI,CAAC,IAC/G,MAAM,IAAI,GAAG,QAAQ,OAAO,SAAS,EAAE,OAAO,CAAC;AACrD,WAAS;AACT,SAAO;AACT;;;AC1BA,SAAS,kBAAkB;AAC3B,SAAS,iBAAiB;AAC1B,OAAO,QAAQ;AACf,OAAO,UAAU;AAYjB,eAAsB,mBAAmB,UAAoB,QAAoD;AAC/G,iBAAe,MAAM;AACrB,QAAM,OAAO,SAAS;AACtB,QAAM,OAAO,MAAM,8BAA8B,MAAM,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC,EAAE,GAAG,QAAQ;AAC5F,iBAAe,MAAM;AACrB,QAAM,SAA8B,CAAC;AACrC,aAAW,UAAU,KAAK,QAAQ,KAAK,GAAG;AACxC,UAAM,OAAO,MAAM,GAAG,MAAM,MAAM;AAClC,mBAAe,MAAM;AACrB,UAAM,OAAO,WAAW,QAAQ;AAChC,QAAI,KAAK,eAAe,EAAG,MAAK,OAAO,MAAM,GAAG,SAAS,MAAM,CAAC;AAAA,SAC3D;AACH,UAAI,CAAC,KAAK,OAAO,EAAG,OAAM,IAAI,MAAM,2DAA2D;AAC/F,YAAM,SAAS,MAAM,GAAG;AAAA,QACtB;AAAA,QACA,UAAU,YAAY,UAAU,cAAc,MAAM,UAAU,cAAc;AAAA,MAC9E;AACA,UAAI;AACF,uBAAe,MAAM;AACrB,cAAM,SAAS,MAAM,OAAO,KAAK;AACjC,YAAI,CAAC,OAAO,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,OAAO,QAAQ,KAAK;AACrE,gBAAM,IAAI,MAAM,mDAAmD;AACrE,yBAAiB,SAAS,OAAO,iBAAiB,EAAE,WAAW,OAAO,OAAO,CAAC,GAAG;AAC/E,yBAAe,MAAM;AACrB,eAAK,OAAO,KAAK;AAAA,QACnB;AAAA,MACF,UAAE;AACA,cAAM,OAAO,MAAM;AAAA,MACrB;AAAA,IACF;AACA,mBAAe,MAAM;AACrB,WAAO,KAAK;AAAA,MACV,MAAM,KAAK,SAAS,MAAM;AAAA,MAC1B,aAAa,GAAG,KAAK,GAAG,IAAI,KAAK,GAAG,IAAI,KAAK,IAAI,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,IACzE,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,eAAsB,sBACpB,UACA,UACA,QACA;AACA,QAAM,UAAU,MAAM,mBAAmB,UAAU,MAAM;AACzD,MAAI,KAAK,UAAU,OAAO,MAAM,KAAK,UAAU,QAAQ;AACrD,UAAM,IAAI,MAAM,wEAAwE;AAC5F;;;ACtDA,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;;;ACuBA,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,SAAS,OAAO,gBAAgB,UAAa,CAAC,QAAQ;AAC5E,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,CAAC,QAAQ,OAAO,OAAO,gBAAgB,UAAc,MAAM,iBAAiB,MAAM,GAAI;AACxF,UAAM,UAAU,MAAM,eAAe,OAAO,kBAAkB,0BAA0B,KAAK,MAAM,CAAC;AACpG,QAAI,CAAC,WAAW,YAAY,OAAO,GAAG,YAAY,QAAQ,CAAC;AACzD,YAAM,IAAI,MAAM,qEAAqE;AAAA,EACzF;AACA,QAAM,eAAe,MAAM,mBAAmB,MAAM;AACpD,MAAI,CAAC,QAAQ,OAAO,qBAAqB,YAAY,MAAM,qBAAqB,KAAK;AACnF,UAAM,IAAI,MAAM,sCAAsC;AACxD,qCAAmC,cAAc,OAAO;AACxD,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,QAAM,cAAc,QAAQ,MAAM,CAAC,IAAI,MAAM,mBAAmB,UAAU,QAAQ,MAAM;AACxF,mBAAiB;AACjB,MACE,CAAC,QAAQ,OACT,CAAE,MAAM;AAAA,IACN;AAAA,IACA,yBAAyB,MAAM,IAAI,mCAAmC;AAAA,IACtE;AAAA,MACE;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,sBAAsB,GAAG;AAAA,MACzB,YAAY,IAAI,CAAC,SAAS,KAAK,IAAI;AAAA,IACrC;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,EACF,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,QAAM,eAAe,MAAM,mBAAmB,MAAM;AACpD,MAAI,CAAC,QAAQ,OAAO,qBAAqB,YAAY,MAAM,qBAAqB,KAAK;AACnF,UAAM,IAAI,MAAM,sCAAsC;AACxD,qCAAmC,cAAc,OAAO;AACxD,MAAI,CAAC,QAAQ,IAAK,OAAM,sBAAsB,aAAa,UAAU,QAAQ,MAAM;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,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,UAAQ,YAAY,SAAS,MAAM;AACnC,MAAI,OAAO,QAAQ,SAAS,KAAK,QAAQ,QAAQ,uBAAuB,MAAM;AAC5E,WAAO,UAAU,KAAK,SAAS,OAAO;AACxC,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,MAAI,QAAQ,KAAM,OAAM,IAAI,MAAM,+DAA+D;AAGjG,QAAM,gBAAgB,iBAAiB,OAAO,OAAO,WAAW;AAChE,QAAM,sBAAsB,OAAO,aAAuB;AACxD,qCAAiC,QAAQ,QAAQ;AACjD,UAAM,WAAW,iBAAiB,UAAU,OAAO,WAAW;AAC9D,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,UAAU,OAAO,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,GAAG;AAC/D,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,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;AACrE,QAAM,cAAc,QAAQ,MAAM,CAAC,IAAI,MAAM,mBAAmB,UAAU,QAAQ,MAAM;AACxF,mBAAiB;AAEjB,MAAI,CAAC,QAAQ,KAAK;AAChB,UAAM,YAAY,MAAM,IAAI,GAAG;AAAA,MAC7B,yBAAyB,MAAM,IAAI,uCAAuC;AAAA,MAC1E;AAAA,QACE;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA,sBAAsB,GAAG;AAAA,QACzB,YAAY,IAAI,CAAC,SAAS,KAAK,IAAI;AAAA,MACrC;AAAA,MACA,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,QAAM,eAAe,MAAM,mBAAmB,MAAM;AACpD,MAAI,CAAC,QAAQ,OAAO,qBAAqB,YAAY,MAAM,qBAAqB,KAAK;AACnF,UAAM,IAAI,MAAM,0CAA0C;AAC5D,qCAAmC,cAAc,SAAS,KAAK;AAC/D,MAAI,CAAC,QAAQ,IAAK,OAAM,sBAAsB,aAAa,UAAU,QAAQ,MAAM;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;AAAA,IACtB;AAAA,IACA;AAAA,IACA,kBAAkB,QAAQ,QAAQ,aAAa,QAAQ,MAAM,0BAA0B,OAAO,MAAM,GAAG,MAAM;AAAA,IAC7G,QAAQ;AAAA,IACR,qBAAqB,KAAK,QAAQ,MAAM;AAAA,EAC1C;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;;;AC3uBA,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,aACtB,OAAO,MAAM,OAAO,iCAAwB,GAAG,sBAAsB,MAAM,IAC3E,CAAC;AACL,iBAAe,QAAQ,MAAM;AAC7B,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,GAAG;AAAA,MACH;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,QAAM,cAAc,MAAM,mBAAmB,MAAM,EAChD,KAAK,CAAC,UAAU,MAAM,mBAAmB,EACzC,MAAM,MAAM,MAAS;AACxB,iBAAe,QAAQ,MAAM;AAC7B,QAAM,iBAAiB,cACnB,6BAA6B,iBAAiB,WAAW,CAAC;AAAA,qEAC1D;AACJ,MAAI,UAAU,WAAW,GAAG;AAC1B,QAAI,GAAG,OAAO;AAAA,EAAqC,cAAc,IAAI,MAAM;AAC3E;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,EAAQ,cAAc;AAAA;AAAA;AAAA,MACnF,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;AAAA,MACE;AAAA,MACA,GAAG,UAAU,IAAI,CAAC,SAAS,GAAG,KAAK,WAAW,IAAI,KAAK,SAAS,IAAI,iBAAiB,KAAK,OAAO,CAAC,EAAE;AAAA,IACtG,EAAE,KAAK,IAAI;AAAA,IACX;AAAA,EACF;AACF;",
6
- "names": ["index"]
7
- }