@narumitw/pi-sync 0.50.2 → 0.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/README.md +4 -1
  2. package/dist/chunks/{chunk-6LP3MCR2.ts → chunk-2JZFHNLM.ts} +3 -5
  3. package/dist/chunks/chunk-2JZFHNLM.ts.map +7 -0
  4. package/dist/chunks/{chunk-LCRI3ABW.ts → chunk-2RZSQWBH.ts} +8 -19
  5. package/dist/chunks/chunk-2RZSQWBH.ts.map +7 -0
  6. package/dist/chunks/{chunk-IJ6FJFA5.ts → chunk-4AIHXRKE.ts} +11 -17
  7. package/dist/chunks/chunk-4AIHXRKE.ts.map +7 -0
  8. package/dist/chunks/{chunk-C7XY5NF5.ts → chunk-4MPIH46N.ts} +29 -51
  9. package/dist/chunks/chunk-4MPIH46N.ts.map +7 -0
  10. package/dist/chunks/{chunk-5B3FXBLE.ts → chunk-6546TS54.ts} +16 -20
  11. package/dist/chunks/chunk-6546TS54.ts.map +7 -0
  12. package/dist/chunks/{chunk-Q2TUM5X6.ts → chunk-6NT3YFGY.ts} +2 -2
  13. package/dist/chunks/chunk-6NT3YFGY.ts.map +7 -0
  14. package/dist/chunks/{chunk-2B2ELUF5.ts → chunk-7D5SF7P3.ts} +1 -1
  15. package/dist/chunks/chunk-7D5SF7P3.ts.map +7 -0
  16. package/dist/chunks/{chunk-4CHTZMEO.ts → chunk-7KHKWL3Q.ts} +37 -55
  17. package/dist/chunks/chunk-7KHKWL3Q.ts.map +7 -0
  18. package/dist/chunks/{chunk-ZI5MXMEX.ts → chunk-BVVP33U5.ts} +2 -4
  19. package/dist/chunks/chunk-BVVP33U5.ts.map +7 -0
  20. package/dist/chunks/{chunk-SZWBGPID.ts → chunk-DM4X4FIA.ts} +8 -13
  21. package/dist/chunks/chunk-DM4X4FIA.ts.map +7 -0
  22. package/dist/chunks/{chunk-SL64RLXR.ts → chunk-DZUSTGQV.ts} +8 -16
  23. package/dist/chunks/chunk-DZUSTGQV.ts.map +7 -0
  24. package/dist/chunks/{chunk-G4RNQQZS.ts → chunk-E42GXD6D.ts} +13 -19
  25. package/dist/chunks/chunk-E42GXD6D.ts.map +7 -0
  26. package/dist/chunks/{chunk-Z4DQF6L3.ts → chunk-ECYCNZOE.ts} +1 -1
  27. package/dist/chunks/chunk-ECYCNZOE.ts.map +7 -0
  28. package/dist/chunks/{chunk-OEX4ABY6.ts → chunk-EEJPYTWE.ts} +11 -21
  29. package/dist/chunks/chunk-EEJPYTWE.ts.map +7 -0
  30. package/dist/chunks/{chunk-CPEHGXJV.ts → chunk-G4RUXRWZ.ts} +3 -5
  31. package/dist/chunks/chunk-G4RUXRWZ.ts.map +7 -0
  32. package/dist/chunks/{chunk-T2B5IU74.ts → chunk-HGJH56KR.ts} +4 -4
  33. package/dist/chunks/chunk-HGJH56KR.ts.map +7 -0
  34. package/dist/chunks/{chunk-JAAKLL6M.ts → chunk-IVXEDPAD.ts} +10 -34
  35. package/dist/chunks/chunk-IVXEDPAD.ts.map +7 -0
  36. package/dist/chunks/chunk-K3RIEL6J.ts +20 -0
  37. package/dist/chunks/chunk-K3RIEL6J.ts.map +7 -0
  38. package/dist/chunks/{chunk-LTBWGSBV.ts → chunk-MSSW6F3R.ts} +1 -1
  39. package/dist/chunks/chunk-MSSW6F3R.ts.map +7 -0
  40. package/dist/chunks/{chunk-T3HH3UEJ.ts → chunk-OVDTF5CH.ts} +4 -10
  41. package/dist/chunks/chunk-OVDTF5CH.ts.map +7 -0
  42. package/dist/chunks/{chunk-NJFUIVYL.ts → chunk-PWMWOJP4.ts} +1 -1
  43. package/dist/chunks/chunk-PWMWOJP4.ts.map +7 -0
  44. package/dist/chunks/{chunk-HUDQATCL.ts → chunk-Q32CQWPM.ts} +6 -8
  45. package/dist/chunks/chunk-Q32CQWPM.ts.map +7 -0
  46. package/dist/chunks/{chunk-ETTRJDNP.ts → chunk-QLSN7AGX.ts} +6 -13
  47. package/dist/chunks/chunk-QLSN7AGX.ts.map +7 -0
  48. package/dist/chunks/{chunk-THMF4BVL.ts → chunk-SWUXA3MH.ts} +1 -1
  49. package/dist/chunks/chunk-SWUXA3MH.ts.map +7 -0
  50. package/dist/chunks/{chunk-TEN2ZBJV.ts → chunk-T2SJD3N7.ts} +2 -4
  51. package/dist/chunks/chunk-T2SJD3N7.ts.map +7 -0
  52. package/dist/chunks/{chunk-AUSDLD6F.ts → chunk-T56RNRZJ.ts} +10 -26
  53. package/dist/chunks/chunk-T56RNRZJ.ts.map +7 -0
  54. package/dist/chunks/{chunk-KW7YQEZN.ts → chunk-UA7RXOIT.ts} +48 -100
  55. package/dist/chunks/chunk-UA7RXOIT.ts.map +7 -0
  56. package/dist/chunks/{chunk-D5X27LCA.ts → chunk-UETBKTDI.ts} +1 -1
  57. package/dist/chunks/chunk-UETBKTDI.ts.map +7 -0
  58. package/dist/chunks/{chunk-CHH26D4F.ts → chunk-YFADF5ZQ.ts} +7 -6
  59. package/dist/chunks/chunk-YFADF5ZQ.ts.map +7 -0
  60. package/dist/chunks/{chunk-CCSN3F47.ts → chunk-YPXGU5OR.ts} +4 -4
  61. package/dist/chunks/chunk-YPXGU5OR.ts.map +7 -0
  62. package/dist/chunks/{file-selection-FTTKAOYX.ts → file-selection-RAVHRYFG.ts} +14 -26
  63. package/dist/chunks/file-selection-RAVHRYFG.ts.map +7 -0
  64. package/dist/chunks/{git-backend-GMVS4PD4.ts → git-backend-IAANDL3K.ts} +41 -104
  65. package/dist/chunks/git-backend-IAANDL3K.ts.map +7 -0
  66. package/dist/chunks/manager-result-dispatcher-OTUMQM26.ts +23 -0
  67. package/dist/chunks/{manager-ui-5KLKVMRC.ts → manager-ui-763NEKJY.ts} +124 -251
  68. package/dist/chunks/manager-ui-763NEKJY.ts.map +7 -0
  69. package/dist/chunks/remote-selection-ui-TZTJF32Y.ts +22 -0
  70. package/dist/chunks/{s3-backend-66O4FGBH.ts → s3-backend-XGXUOPUN.ts} +23 -54
  71. package/dist/chunks/s3-backend-XGXUOPUN.ts.map +7 -0
  72. package/dist/chunks/{setup-switch-IS2PEZ3J.ts → setup-switch-5G2VNJHL.ts} +9 -9
  73. package/dist/chunks/{setup-wizard-IUB6ESEU.ts → setup-wizard-YIEWGX32.ts} +12 -12
  74. package/dist/chunks/setup-wizard-YIEWGX32.ts.map +7 -0
  75. package/dist/chunks/{snapshot-HKEWCVK6.ts → snapshot-JL5DFSXI.ts} +5 -5
  76. package/dist/chunks/sync-inspection-P3ENJLNF.ts +20 -0
  77. package/dist/chunks/{sync-operations-LBX3GKCM.ts → sync-operations-AR76EB6C.ts} +85 -201
  78. package/dist/chunks/sync-operations-AR76EB6C.ts.map +7 -0
  79. package/dist/chunks/{sync-state-Q2FTXTW6.ts → sync-state-VHJUZ4YG.ts} +6 -6
  80. package/dist/chunks/{webdav-backend-ECIKD7SO.ts → webdav-backend-3EGUONAT.ts} +20 -51
  81. package/dist/chunks/webdav-backend-3EGUONAT.ts.map +7 -0
  82. package/dist/index.ts +49 -74
  83. package/dist/index.ts.map +3 -3
  84. package/docs/settings.md +9 -0
  85. package/package.json +61 -62
  86. package/src/backends/backend-factory.ts +15 -15
  87. package/src/backends/backend-identity.ts +31 -31
  88. package/src/backends/backend-types.ts +42 -42
  89. package/src/backends/git/git-backend.ts +714 -788
  90. package/src/backends/git/git-config.ts +104 -111
  91. package/src/backends/git/git-runner.ts +230 -247
  92. package/src/backends/git/git-storage.ts +228 -245
  93. package/src/backends/s3/s3-backend.ts +408 -441
  94. package/src/backends/s3/s3-client.ts +288 -333
  95. package/src/backends/sync-backend.ts +65 -65
  96. package/src/backends/webdav/webdav-backend.ts +542 -589
  97. package/src/backends/webdav/webdav-client.ts +292 -316
  98. package/src/backends/webdav/webdav-config.ts +57 -68
  99. package/src/commands/command-execution.ts +270 -289
  100. package/src/commands/command-handler.ts +160 -163
  101. package/src/commands/command-types.ts +13 -13
  102. package/src/commands/command.ts +190 -196
  103. package/src/commands/setup-completions.ts +1 -1
  104. package/src/paths.ts +47 -47
  105. package/src/settings/config-errors.ts +4 -5
  106. package/src/settings/config-file.ts +473 -506
  107. package/src/settings/config.ts +171 -174
  108. package/src/settings/settings-management.ts +191 -216
  109. package/src/settings/settings-store.ts +63 -77
  110. package/src/settings/settings-types.ts +78 -75
  111. package/src/settings/settings-validation.ts +328 -364
  112. package/src/snapshot/session-paths.ts +41 -55
  113. package/src/snapshot/snapshot-apply.ts +197 -229
  114. package/src/snapshot/snapshot-codec.ts +29 -31
  115. package/src/snapshot/snapshot-paths.ts +4 -6
  116. package/src/snapshot/snapshot-transaction.ts +161 -170
  117. package/src/snapshot/snapshot-types.ts +24 -24
  118. package/src/snapshot/snapshot.ts +310 -343
  119. package/src/state/json-file.ts +11 -11
  120. package/src/state/lock.ts +226 -242
  121. package/src/state/lockfile-fs.ts +20 -20
  122. package/src/state/operation-availability.ts +36 -41
  123. package/src/state/state-directory.ts +171 -173
  124. package/src/state/state-types.ts +15 -15
  125. package/src/state/sync-state-store.ts +23 -23
  126. package/src/sync/automatic-sync.ts +75 -80
  127. package/src/sync/remote-snapshot.ts +52 -60
  128. package/src/sync/setup-switch.ts +99 -114
  129. package/src/sync/signals.ts +3 -5
  130. package/src/sync/startup-check.ts +97 -111
  131. package/src/sync/sync-decision.ts +76 -80
  132. package/src/sync/sync-error-guidance.ts +41 -48
  133. package/src/sync/sync-errors.ts +10 -10
  134. package/src/sync/sync-inspection.ts +29 -33
  135. package/src/sync/sync-loaders.ts +28 -36
  136. package/src/sync/sync-mutations.ts +510 -622
  137. package/src/sync/sync-operations.ts +7 -7
  138. package/src/sync/sync-policy.ts +296 -326
  139. package/src/sync/sync-queries.ts +175 -194
  140. package/src/sync/sync-state.ts +74 -100
  141. package/src/sync-extension.ts +89 -101
  142. package/src/sync.ts +26 -26
  143. package/src/types.ts +37 -37
  144. package/src/ui/automatic-sync-summary.ts +1 -3
  145. package/src/ui/cancellable-operation.ts +92 -112
  146. package/src/ui/file-selection.ts +250 -274
  147. package/src/ui/manager-attention.ts +51 -63
  148. package/src/ui/manager-recovery.ts +48 -57
  149. package/src/ui/manager-result-dispatcher.ts +62 -76
  150. package/src/ui/manager-state.ts +200 -232
  151. package/src/ui/manager-ui.ts +264 -362
  152. package/src/ui/remote-selection-ui.ts +547 -588
  153. package/src/ui/secret-input.ts +198 -214
  154. package/src/ui/settings-ui.ts +175 -172
  155. package/src/ui/setup/git-ui.ts +232 -261
  156. package/src/ui/setup/s3-credentials-ui.ts +58 -65
  157. package/src/ui/setup/s3-ui.ts +171 -195
  158. package/src/ui/setup/setup-actions.ts +91 -101
  159. package/src/ui/setup/setup-location-ui.ts +121 -137
  160. package/src/ui/setup/setup-name-ui.ts +27 -27
  161. package/src/ui/setup/setup-prompts.ts +65 -65
  162. package/src/ui/setup/setup-review.ts +58 -59
  163. package/src/ui/setup/setup-switcher.ts +156 -160
  164. package/src/ui/setup/setup-wizard.ts +28 -28
  165. package/src/ui/setup/text-input.ts +54 -58
  166. package/src/ui/setup/webdav-ui.ts +246 -293
  167. package/src/ui/storage-connections-ui.ts +317 -369
  168. package/src/ui/sync-attention.ts +148 -164
  169. package/src/ui/sync-format.ts +110 -121
  170. package/src/ui/sync-resolution-ui.ts +147 -153
  171. package/src/ui/sync-setups-ui.ts +218 -238
  172. package/src/ui/sync-status.ts +17 -0
  173. package/src/ui/terminal-text.ts +2 -2
  174. package/dist/chunks/chunk-2B2ELUF5.ts.map +0 -7
  175. package/dist/chunks/chunk-4CHTZMEO.ts.map +0 -7
  176. package/dist/chunks/chunk-5B3FXBLE.ts.map +0 -7
  177. package/dist/chunks/chunk-6LP3MCR2.ts.map +0 -7
  178. package/dist/chunks/chunk-AUSDLD6F.ts.map +0 -7
  179. package/dist/chunks/chunk-C7XY5NF5.ts.map +0 -7
  180. package/dist/chunks/chunk-CCSN3F47.ts.map +0 -7
  181. package/dist/chunks/chunk-CHH26D4F.ts.map +0 -7
  182. package/dist/chunks/chunk-CPEHGXJV.ts.map +0 -7
  183. package/dist/chunks/chunk-D5X27LCA.ts.map +0 -7
  184. package/dist/chunks/chunk-ETTRJDNP.ts.map +0 -7
  185. package/dist/chunks/chunk-G4RNQQZS.ts.map +0 -7
  186. package/dist/chunks/chunk-HUDQATCL.ts.map +0 -7
  187. package/dist/chunks/chunk-IJ6FJFA5.ts.map +0 -7
  188. package/dist/chunks/chunk-JAAKLL6M.ts.map +0 -7
  189. package/dist/chunks/chunk-KW7YQEZN.ts.map +0 -7
  190. package/dist/chunks/chunk-LCRI3ABW.ts.map +0 -7
  191. package/dist/chunks/chunk-LTBWGSBV.ts.map +0 -7
  192. package/dist/chunks/chunk-NJFUIVYL.ts.map +0 -7
  193. package/dist/chunks/chunk-OEX4ABY6.ts.map +0 -7
  194. package/dist/chunks/chunk-Q2TUM5X6.ts.map +0 -7
  195. package/dist/chunks/chunk-SL64RLXR.ts.map +0 -7
  196. package/dist/chunks/chunk-SZWBGPID.ts.map +0 -7
  197. package/dist/chunks/chunk-T2B5IU74.ts.map +0 -7
  198. package/dist/chunks/chunk-T3HH3UEJ.ts.map +0 -7
  199. package/dist/chunks/chunk-TEN2ZBJV.ts.map +0 -7
  200. package/dist/chunks/chunk-THMF4BVL.ts.map +0 -7
  201. package/dist/chunks/chunk-Z4DQF6L3.ts.map +0 -7
  202. package/dist/chunks/chunk-ZI5MXMEX.ts.map +0 -7
  203. package/dist/chunks/file-selection-FTTKAOYX.ts.map +0 -7
  204. package/dist/chunks/git-backend-GMVS4PD4.ts.map +0 -7
  205. package/dist/chunks/manager-result-dispatcher-FKIBM3GO.ts +0 -22
  206. package/dist/chunks/manager-ui-5KLKVMRC.ts.map +0 -7
  207. package/dist/chunks/remote-selection-ui-D7RBRJNL.ts +0 -21
  208. package/dist/chunks/s3-backend-66O4FGBH.ts.map +0 -7
  209. package/dist/chunks/setup-wizard-IUB6ESEU.ts.map +0 -7
  210. package/dist/chunks/sync-inspection-CST2KL65.ts +0 -20
  211. package/dist/chunks/sync-operations-LBX3GKCM.ts.map +0 -7
  212. package/dist/chunks/webdav-backend-ECIKD7SO.ts.map +0 -7
  213. /package/dist/chunks/{manager-result-dispatcher-FKIBM3GO.ts.map → manager-result-dispatcher-OTUMQM26.ts.map} +0 -0
  214. /package/dist/chunks/{remote-selection-ui-D7RBRJNL.ts.map → remote-selection-ui-TZTJF32Y.ts.map} +0 -0
  215. /package/dist/chunks/{setup-switch-IS2PEZ3J.ts.map → setup-switch-5G2VNJHL.ts.map} +0 -0
  216. /package/dist/chunks/{snapshot-HKEWCVK6.ts.map → snapshot-JL5DFSXI.ts.map} +0 -0
  217. /package/dist/chunks/{sync-inspection-CST2KL65.ts.map → sync-inspection-P3ENJLNF.ts.map} +0 -0
  218. /package/dist/chunks/{sync-state-Q2FTXTW6.ts.map → sync-state-VHJUZ4YG.ts.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/ui/manager-ui.ts", "../../src/state/operation-availability.ts", "../../src/ui/manager-attention.ts", "../../src/ui/manager-recovery.ts", "../../src/ui/manager-state.ts", "../../src/ui/sync-setups-ui.ts", "../../src/ui/settings-ui.ts", "../../src/ui/storage-connections-ui.ts", "../../src/ui/setup/setup-switcher.ts", "../../src/ui/setup/setup-actions.ts"],
4
- "sourcesContent": ["import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { type ActionMenuItem, defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport { loadConfig } from \"../settings/config.js\";\nimport { operationBlocksChanges, operationCanRecover } from \"../state/operation-availability.js\";\nimport { type RunRoute, runCancellableOperation } from \"./cancellable-operation.js\";\nimport {\n\tattentionMainMenuItems,\n\tblockedSyncMenuItem,\n\ttype SyncManagerAttentionOptions,\n\tshowManagerAttention,\n} from \"./manager-attention.js\";\nimport { recoverSyncAccess } from \"./manager-recovery.js\";\nimport { dispatchManagerResult } from \"./manager-result-dispatcher.js\";\nimport { describeManagerState } from \"./manager-state.js\";\nimport { showSyncSettings } from \"./settings-ui.js\";\nimport { showSyncSetupManager } from \"./setup/setup-actions.js\";\nimport { showSetupSwitcher } from \"./setup/setup-switcher.js\";\nimport { showStorageConnections } from \"./storage-connections-ui.js\";\nimport { observationMatchesConfig } from \"./sync-attention.js\";\n\nexport async function showSyncManager(\n\tctx: ExtensionCommandContext,\n\trunRoute: RunRoute,\n\tsessionSignal?: AbortSignal,\n\toptions: SyncManagerAttentionOptions = {},\n): Promise<void> {\n\tif (!ctx.hasUI) {\n\t\tawait runRoute(\"help\");\n\t\treturn;\n\t}\n\ttype Screen = \"main\" | \"more\" | \"recovery\";\n\ttype Action =\n\t\t| \"review-attention\"\n\t\t| \"sync\"\n\t\t| \"switch\"\n\t\t| \"diff\"\n\t\t| \"settings\"\n\t\t| \"pull\"\n\t\t| \"push\"\n\t\t| \"setups\"\n\t\t| \"connections\"\n\t\t| \"history\"\n\t\t| \"doctor\"\n\t\t| \"unlock\"\n\t\t| \"recover\"\n\t\t| \"refresh\"\n\t\t| \"help\"\n\t\t| \"init\"\n\t\t| \"back\";\n\tinterface State {\n\t\tmanager: Awaited<ReturnType<typeof describeManagerState>>;\n\t}\n\tconst menu = defineMenu<State, Screen, Action, ExtensionCommandContext>({\n\t\tstart: \"main\",\n\t\tscreens: {\n\t\t\tmain: ({ state }) => {\n\t\t\t\tconst attentionItems = attentionMainMenuItems(state.manager);\n\t\t\t\tconst managerItems = state.manager.actions.map(\n\t\t\t\t\t(label) => blockedSyncMenuItem(label, state.manager) ?? syncMainMenuItem(label),\n\t\t\t\t);\n\t\t\t\tconst operationFirst =\n\t\t\t\t\tstate.manager.operation !== undefined && state.manager.operation.kind !== \"free\";\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\ttitle: \"Manage sync\",\n\t\t\t\t\tlines: state.manager.title.split(\"\\n\").slice(1),\n\t\t\t\t\titems: operationFirst\n\t\t\t\t\t\t? [...managerItems, ...attentionItems]\n\t\t\t\t\t\t: [...attentionItems, ...managerItems],\n\t\t\t\t\thint: \"close\",\n\t\t\t\t};\n\t\t\t},\n\t\t\tmore: () => ({\n\t\t\t\tkind: \"actions\",\n\t\t\t\ttitle: \"More options\",\n\t\t\t\titems: [\n\t\t\t\t\t{ id: \"pull\", label: \"Pull from remote\u2026\", action: \"pull\" },\n\t\t\t\t\t{ id: \"push\", label: \"Push to remote\u2026\", action: \"push\" },\n\t\t\t\t\t{ id: \"setups\", label: \"Sync setups\u2026\", action: \"setups\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"connections\",\n\t\t\t\t\t\tlabel: \"Storage connections\u2026\",\n\t\t\t\t\t\taction: \"connections\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"doctor\",\n\t\t\t\t\t\tlabel: \"Check setup\",\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\"Check current setup access. WebDAV also probes writes and repairs history.\",\n\t\t\t\t\t\taction: \"doctor\",\n\t\t\t\t\t},\n\t\t\t\t\t{ id: \"recovery\", label: \"History & recovery\u2026\", to: \"recovery\" },\n\t\t\t\t\t{ id: \"help\", label: \"Help\", action: \"help\" },\n\t\t\t\t\t{ id: \"back\", label: \"Back\", action: \"back\" },\n\t\t\t\t],\n\t\t\t\thint: \"back\",\n\t\t\t}),\n\t\t\trecovery: ({ state }) => ({\n\t\t\t\tkind: \"actions\",\n\t\t\t\ttitle: \"History & recovery\",\n\t\t\t\titems: [\n\t\t\t\t\t{ id: \"history\", label: \"Browse history\", action: \"history\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"doctor\",\n\t\t\t\t\t\tlabel: \"Check setup\",\n\t\t\t\t\t\tdescription: \"WebDAV also probes writes and repairs history.\",\n\t\t\t\t\t\taction: \"doctor\",\n\t\t\t\t\t},\n\t\t\t\t\t...(state.manager.operation && operationCanRecover(state.manager.operation)\n\t\t\t\t\t\t? [{ id: \"unlock\", label: \"Recover stale operation\", action: \"unlock\" as const }]\n\t\t\t\t\t\t: []),\n\t\t\t\t\t{ id: \"back\", label: \"Back\", action: \"back\" },\n\t\t\t\t],\n\t\t\t\thint: \"back\",\n\t\t\t}),\n\t\t},\n\t\tactions: {\n\t\t\t\"review-attention\": async () => {\n\t\t\t\tconst attention = options.getAttention?.();\n\t\t\t\tif (!attention) {\n\t\t\t\t\tconst observation = options.getObservation?.();\n\t\t\t\t\tif (!observation) return { kind: \"stay\" };\n\t\t\t\t\t// A head-only observation is not an authoritative decision. Load a fresh\n\t\t\t\t\t// snapshot only after the user activates the existing review flow.\n\t\t\t\t\tconst { showRemoteSelectionReview } = await import(\"./remote-selection-ui.js\");\n\t\t\t\t\tif (sessionSignal?.aborted) return { kind: \"close\" };\n\t\t\t\t\tconst config = await loadConfig();\n\t\t\t\t\tif (sessionSignal?.aborted) return { kind: \"close\" };\n\t\t\t\t\tif (\n\t\t\t\t\t\toptions.getObservation?.() !== observation ||\n\t\t\t\t\t\t!observationMatchesConfig(observation, config)\n\t\t\t\t\t) {\n\t\t\t\t\t\toptions.onObservationInvalidated?.();\n\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t}\n\t\t\t\t\t// Keep the check-time hint on cancellation or failure. Route commits and\n\t\t\t\t\t// the manager's config/baseline reconciliation own invalidation.\n\t\t\t\t\tconst result = await showRemoteSelectionReview(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tobservation.setupName,\n\t\t\t\t\t\tsessionSignal,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\torigin: \"sync\",\n\t\t\t\t\t\t\trunRoute,\n\t\t\t\t\t\t\tonSelectionResolved: () => {\n\t\t\t\t\t\t\t\tif (!sessionSignal?.aborted && options.getObservation?.() === observation)\n\t\t\t\t\t\t\t\t\toptions.onObservationInvalidated?.();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tif (sessionSignal?.aborted) return { kind: \"close\" };\n\t\t\t\t\tif (result.kind === \"route-result\") {\n\t\t\t\t\t\treturn dispatchManagerResult(ctx, result.result, result.route, runRoute, sessionSignal);\n\t\t\t\t\t}\n\t\t\t\t\treturn { kind: result.kind === \"closed\" || result.kind === \"stale\" ? \"close\" : \"stay\" };\n\t\t\t\t}\n\t\t\t\tconst disposition = await showManagerAttention(\n\t\t\t\t\tctx,\n\t\t\t\t\tattention,\n\t\t\t\t\trunRoute,\n\t\t\t\t\tsessionSignal,\n\t\t\t\t\t() => options.onSelectionResolved?.(attention),\n\t\t\t\t);\n\t\t\t\treturn { kind: disposition };\n\t\t\t},\n\t\t\tsync: async () => {\n\t\t\t\tconst pendingAttention = options.getAttention?.();\n\t\t\t\tif (pendingAttention) {\n\t\t\t\t\tconst activeConfig = await loadConfig();\n\t\t\t\t\tif (sessionSignal?.aborted) return { kind: \"close\" };\n\t\t\t\t\tif (pendingAttention.decision.setupName === activeConfig.setupName) {\n\t\t\t\t\t\tctx.ui.notify(\"Review synced content before starting Sync now.\", \"warning\");\n\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst result = await runCancellableOperation(\n\t\t\t\t\tctx,\n\t\t\t\t\t\"Checking current sync setup\u2026\",\n\t\t\t\t\t\"sync\",\n\t\t\t\t\trunRoute,\n\t\t\t\t\t{\n\t\t\t\t\t\tcommitAware: true,\n\t\t\t\t\t\tsignal: sessionSignal,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst disposition = await dispatchManagerResult(\n\t\t\t\t\tctx,\n\t\t\t\t\tresult,\n\t\t\t\t\t\"sync\",\n\t\t\t\t\trunRoute,\n\t\t\t\t\tsessionSignal,\n\t\t\t\t);\n\t\t\t\treturn disposition.kind === \"close\" ? { kind: \"close\" } : { kind: \"stay\" };\n\t\t\t},\n\t\t\tswitch: async () => {\n\t\t\t\tconst result = await showSetupSwitcher(ctx, runRoute, undefined, sessionSignal);\n\t\t\t\treturn result === \"pull-attempted\" || result === \"closed\"\n\t\t\t\t\t? { kind: \"close\" }\n\t\t\t\t\t: { kind: \"stay\" };\n\t\t\t},\n\t\t\tdiff: async () => {\n\t\t\t\tconst result = await runCancellableOperation(\n\t\t\t\t\tctx,\n\t\t\t\t\t\"Checking current sync setup\u2026\",\n\t\t\t\t\t\"diff\",\n\t\t\t\t\trunRoute,\n\t\t\t\t\t{ signal: sessionSignal },\n\t\t\t\t);\n\t\t\t\treturn result.kind === \"closed\" ? { kind: \"close\" } : { kind: \"stay\" };\n\t\t\t},\n\t\t\tsettings: async () => {\n\t\t\t\tawait showSyncSettings(ctx, runRoute, sessionSignal);\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\tpull: async () => {\n\t\t\t\tconst result = await runCancellableOperation(\n\t\t\t\t\tctx,\n\t\t\t\t\t\"Checking remote changes\u2026\",\n\t\t\t\t\t\"pull\",\n\t\t\t\t\trunRoute,\n\t\t\t\t\t{\n\t\t\t\t\t\tcommitAware: true,\n\t\t\t\t\t\tcancelledMessage: \"Pull check cancelled; no local files were changed.\",\n\t\t\t\t\t\tsignal: sessionSignal,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst disposition = await dispatchManagerResult(\n\t\t\t\t\tctx,\n\t\t\t\t\tresult,\n\t\t\t\t\t\"pull\",\n\t\t\t\t\trunRoute,\n\t\t\t\t\tsessionSignal,\n\t\t\t\t);\n\t\t\t\treturn disposition.kind === \"close\" ? { kind: \"close\" } : { kind: \"stay\" };\n\t\t\t},\n\t\t\tpush: async () => {\n\t\t\t\tconst result = await runCancellableOperation(\n\t\t\t\t\tctx,\n\t\t\t\t\t\"Preparing push preview\u2026\",\n\t\t\t\t\t\"push\",\n\t\t\t\t\trunRoute,\n\t\t\t\t\t{\n\t\t\t\t\t\tcommitAware: true,\n\t\t\t\t\t\tcancelledMessage: \"Push preparation cancelled; no remote files were changed.\",\n\t\t\t\t\t\tsignal: sessionSignal,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst disposition = await dispatchManagerResult(\n\t\t\t\t\tctx,\n\t\t\t\t\tresult,\n\t\t\t\t\t\"push\",\n\t\t\t\t\trunRoute,\n\t\t\t\t\tsessionSignal,\n\t\t\t\t);\n\t\t\t\treturn disposition.kind === \"close\" ? { kind: \"close\" } : { kind: \"stay\" };\n\t\t\t},\n\t\t\tsetups: async () => {\n\t\t\t\tconst result = await showSyncSetupManager(ctx, runRoute, sessionSignal);\n\t\t\t\treturn result === \"exit\" ? { kind: \"close\" } : { kind: \"stay\" };\n\t\t\t},\n\t\t\tconnections: async () => {\n\t\t\t\tawait showStorageConnections(ctx, sessionSignal);\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\thistory: async () => {\n\t\t\t\tawait runRoute(\"history\");\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\tdoctor: async () => {\n\t\t\t\tconst result = await runCancellableOperation(\n\t\t\t\t\tctx,\n\t\t\t\t\t\"Checking setup access\u2026\",\n\t\t\t\t\t\"doctor\",\n\t\t\t\t\trunRoute,\n\t\t\t\t\t{ signal: sessionSignal },\n\t\t\t\t);\n\t\t\t\treturn { kind: result.kind === \"closed\" ? \"close\" : \"stay\" };\n\t\t\t},\n\t\t\tunlock: async ({ state, signal: actionSignal }) => {\n\t\t\t\tconst result = await recoverSyncAccess(\n\t\t\t\t\tctx,\n\t\t\t\t\tstate.manager,\n\t\t\t\t\trunRoute,\n\t\t\t\t\tsessionSignal,\n\t\t\t\t\tactionSignal,\n\t\t\t\t);\n\t\t\t\tif (result === \"close\") return { kind: \"close\" };\n\t\t\t\treturn result === \"restored\" ? { kind: \"to\", screen: \"main\" } : { kind: \"stay\" };\n\t\t\t},\n\t\t\trecover: async ({ state, signal: actionSignal }) => {\n\t\t\t\tconst result = await recoverSyncAccess(\n\t\t\t\t\tctx,\n\t\t\t\t\tstate.manager,\n\t\t\t\t\trunRoute,\n\t\t\t\t\tsessionSignal,\n\t\t\t\t\tactionSignal,\n\t\t\t\t);\n\t\t\t\treturn { kind: result === \"close\" ? \"close\" : \"stay\" };\n\t\t\t},\n\t\t\trefresh: async () => ({ kind: \"stay\" }),\n\t\t\thelp: async () => {\n\t\t\t\tawait runRoute(\"help\");\n\t\t\t\treturn { kind: \"close\" };\n\t\t\t},\n\t\t\tinit: async () => {\n\t\t\t\tawait runRoute(\"init\");\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\tback: async () => ({ kind: \"back\" }),\n\t\t},\n\t});\n\tawait runMenu(ctx, menu, {\n\t\tgetState: async () => {\n\t\t\tconst pendingAttention = options.getAttention?.();\n\t\t\tconst observation = options.getObservation?.();\n\t\t\tconst manager = await describeManagerState(\n\t\t\t\tsessionSignal,\n\t\t\t\tpendingAttention,\n\t\t\t\tundefined,\n\t\t\t\tobservation,\n\t\t\t);\n\t\t\tif (sessionSignal?.aborted) return { manager };\n\t\t\t// A busy operation suppresses baseline reads, not the stored check-time hint.\n\t\t\tif (\n\t\t\t\tobservation &&\n\t\t\t\toptions.getObservation?.() === observation &&\n\t\t\t\t!manager.observation &&\n\t\t\t\t!(manager.operation && operationBlocksChanges(manager.operation))\n\t\t\t) {\n\t\t\t\toptions.onObservationInvalidated?.();\n\t\t\t}\n\t\t\tif (pendingAttention && options.getAttention?.() === pendingAttention && !manager.attention) {\n\t\t\t\toptions.onSelectionResolved?.(pendingAttention);\n\t\t\t}\n\t\t\treturn { manager };\n\t\t},\n\t\tsignal: sessionSignal,\n\t\tisCurrent: () => !sessionSignal?.aborted,\n\t});\n}\n\nfunction syncMainMenuItem(\n\tlabel: string,\n): ActionMenuItem<\n\t\"main\" | \"more\" | \"recovery\",\n\t| \"sync\"\n\t| \"switch\"\n\t| \"diff\"\n\t| \"settings\"\n\t| \"setups\"\n\t| \"connections\"\n\t| \"recover\"\n\t| \"refresh\"\n\t| \"help\"\n\t| \"init\"\n> {\n\tif (label === \"More\u2026\") return { id: \"more\", label, to: \"more\" };\n\tif (label === \"History & recovery\u2026\") return { id: \"recovery\", label, to: \"recovery\" };\n\tconst actions = new Map<\n\t\tstring,\n\t\t| \"sync\"\n\t\t| \"switch\"\n\t\t| \"diff\"\n\t\t| \"settings\"\n\t\t| \"setups\"\n\t\t| \"connections\"\n\t\t| \"recover\"\n\t\t| \"refresh\"\n\t\t| \"help\"\n\t\t| \"init\"\n\t>([\n\t\t[\"Sync now (recommended)\", \"sync\"],\n\t\t[\"Switch sync setup\", \"switch\"],\n\t\t[\"Status & changes\", \"diff\"],\n\t\t[\"Settings\", \"settings\"],\n\t\t[\"Restore sync access\u2026 (recommended)\", \"recover\"],\n\t\t[\"Refresh operation status\", \"refresh\"],\n\t\t[\"Sync setups\u2026\", \"setups\"],\n\t\t[\"Storage connections\u2026\", \"connections\"],\n\t\t[\"Help\", \"help\"],\n\t\t[\"Set up sync\", \"init\"],\n\t\t[\"Use existing settings\", \"init\"],\n\t]);\n\treturn { id: actions.get(label) ?? \"help\", label, action: actions.get(label) ?? \"help\" };\n}\n", "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\t| { kind: \"free\" }\n\t| { kind: \"live\"; lock: LockFile }\n\t| { kind: \"busy\"; lock?: LockFile; metadata: LockInspection[\"status\"] }\n\t| { kind: \"recoverable-stale\"; lock: LockFile }\n\t| { kind: \"recoverable-unreadable\" }\n\t| { kind: \"inspection-error\"; message: string };\n\ninterface OperationInspectionDependencies {\n\tinspectMetadata(): Promise<LockInspection>;\n\tinspectGuard(): Promise<boolean>;\n}\n\nconst DEFAULT_INSPECTION_DEPENDENCIES: OperationInspectionDependencies = {\n\tinspectMetadata: inspectLock,\n\tinspectGuard: isLockGuardHeld,\n};\n\nexport async function inspectOperationAvailability(\n\tdependencies: OperationInspectionDependencies = DEFAULT_INSPECTION_DEPENDENCIES,\n): Promise<OperationAvailability> {\n\ttry {\n\t\tconst metadata = await dependencies.inspectMetadata();\n\t\tconst guardHeld = await dependencies.inspectGuard();\n\t\treturn classifyOperationAvailability(metadata, guardHeld);\n\t} catch (error) {\n\t\treturn { kind: \"inspection-error\", message: errorMessage(error) };\n\t}\n}\n\nexport function classifyOperationAvailability(\n\tmetadata: LockInspection,\n\tguardHeld: boolean,\n): OperationAvailability {\n\tif (metadata.status === \"valid\" && !isStaleLock(metadata.lock)) {\n\t\treturn { kind: \"live\", lock: metadata.lock };\n\t}\n\tif (guardHeld) {\n\t\treturn {\n\t\t\tkind: \"busy\",\n\t\t\tmetadata: metadata.status,\n\t\t\t...(metadata.status === \"valid\" ? { lock: metadata.lock } : {}),\n\t\t};\n\t}\n\tif (metadata.status === \"valid\") {\n\t\treturn { kind: \"recoverable-stale\", lock: metadata.lock };\n\t}\n\tif (metadata.status === \"unreadable\") return { kind: \"recoverable-unreadable\" };\n\treturn { kind: \"free\" };\n}\n\nexport function operationBlocksChanges(availability: OperationAvailability) {\n\treturn availability.kind !== \"free\";\n}\n\nexport function operationCanRecover(availability: OperationAvailability) {\n\treturn (\n\t\tavailability.kind === \"recoverable-stale\" || availability.kind === \"recoverable-unreadable\"\n\t);\n}\n", "import 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\tgetObservation?: () => StartupObservation | undefined;\n\tonObservationInvalidated?: () => void;\n\tgetAttention?: () => SyncAttentionState | undefined;\n\tonSelectionResolved?: (expected: SyncAttentionState) => void;\n}\n\nexport function attentionMainMenuItems(\n\tmanager: ManagerDescription,\n): ActionMenuItem<\"main\" | \"more\" | \"recovery\", \"review-attention\">[] {\n\tif (!manager.attention && manager.observation?.inspection.selectionState?.kind !== \"different\")\n\t\treturn [];\n\tconst disabled = manager.attentionReviewDisabled === true;\n\treturn [\n\t\t{\n\t\t\tid: \"review-attention\",\n\t\t\tlabel: \"Review synced content (recommended)\",\n\t\t\taction: \"review-attention\",\n\t\t\t...(disabled\n\t\t\t\t? {\n\t\t\t\t\t\tdisabled: true,\n\t\t\t\t\t\tdisabledReason: \"Finish or recover the active operation first.\",\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t},\n\t];\n}\n\nexport function blockedSyncMenuItem(\n\tlabel: string,\n\tmanager: ManagerDescription,\n): ActionMenuItem<\"main\" | \"more\" | \"recovery\", \"sync\"> | undefined {\n\tif (label !== \"Sync now (recommended)\" || !manager.attentionBlocksSync) return undefined;\n\treturn {\n\t\tid: \"sync\",\n\t\tlabel,\n\t\tdescription: \"Review first.\",\n\t\taction: \"sync\",\n\t\tdisabled: true,\n\t\tdisabledReason: \"Review synced content first.\",\n\t};\n}\n\nexport async function showManagerAttention(\n\tctx: ExtensionCommandContext,\n\tattention: SyncAttentionState,\n\trunRoute: RunRoute,\n\tsignal: AbortSignal | undefined,\n\tonSelectionResolved: (() => void) | undefined,\n): Promise<\"close\" | \"stay\"> {\n\tconst { showRemoteSelectionReview } = await import(\"./remote-selection-ui.js\");\n\tif (signal?.aborted) return \"close\";\n\tconst review = await showRemoteSelectionReview(\n\t\tctx,\n\t\tattention.decision.setupName,\n\t\tsignal,\n\t\tundefined,\n\t\t{\n\t\t\tdecision: attention.decision,\n\t\t\torigin: attention.origin,\n\t\t\trunRoute,\n\t\t\tonSelectionResolved,\n\t\t},\n\t);\n\tif (review.kind === \"route-result\") {\n\t\tconst disposition = await dispatchManagerResult(\n\t\t\tctx,\n\t\t\treview.result,\n\t\t\treview.route,\n\t\t\trunRoute,\n\t\t\tsignal,\n\t\t\t{ onSelectionResolved },\n\t\t);\n\t\treturn disposition.kind;\n\t}\n\treturn review.kind === \"closed\" || review.kind === \"stale\" ? \"close\" : \"stay\";\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { runConfirmation } from \"@narumitw/pi-tui-kit\";\nimport {\n\tinspectOperationAvailability,\n\toperationCanRecover,\n} 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\tctx: ExtensionCommandContext,\n\tmanager: ManagerDescription,\n\trunRoute: RunRoute,\n\tsessionSignal: AbortSignal | undefined,\n\tactionSignal: AbortSignal,\n): Promise<RecoveryDisposition> {\n\tconst operation = manager.operation;\n\tif (!operation || !operationCanRecover(operation)) {\n\t\tctx.ui.notify(\n\t\t\t\"Operation status changed. Refresh the manager before retrying recovery.\",\n\t\t\t\"warning\",\n\t\t);\n\t\treturn \"stay\";\n\t}\n\tconst signal = sessionSignal ? AbortSignal.any([sessionSignal, actionSignal]) : actionSignal;\n\tif (signal.aborted) return \"close\";\n\tconst unreadable = operation.kind === \"recoverable-unreadable\";\n\tconst details = unreadable\n\t\t? \"Pi-sync cannot verify who owns the unreadable lock. Close other Pi sessions that may be syncing before continuing.\"\n\t\t: `The recorded ${safeTerminalText(operation.lock.command)} operation (pid ${operation.lock.pid}) appears to have stopped. Close other Pi sessions that may still be syncing before continuing.`;\n\tconst confirmation = await runConfirmation(ctx, {\n\t\ttitle: \"Restore sync access?\",\n\t\tmessage: [\n\t\t\tdetails,\n\t\t\t\"\",\n\t\t\t\"This removes only the local operation lock.\",\n\t\t\t\"It does not change settings, local files, sync state, or remote data.\",\n\t\t].join(\"\\n\"),\n\t\tconfirmLabel: \"Remove local lock and continue\",\n\t\tcancelLabel: \"Cancel\",\n\t\tsignal,\n\t\tisCurrent: () => !signal.aborted,\n\t\tonError: (_currentCtx, error) => {\n\t\t\tctx.ui.notify(\n\t\t\t\t`Recovery confirmation failed: ${safeTerminalText(errorMessage(error))}`,\n\t\t\t\t\"error\",\n\t\t\t);\n\t\t},\n\t});\n\tif (confirmation.kind === \"stale\") return \"close\";\n\tif (confirmation.kind === \"closed\") {\n\t\tif (confirmation.reason === \"close\") return \"close\";\n\t\tif (!signal.aborted) {\n\t\t\tctx.ui.notify(\"Recovery cancelled; the local operation lock was not changed.\", \"info\");\n\t\t}\n\t\treturn \"stay\";\n\t}\n\tif (confirmation.kind !== \"confirmed\") return \"stay\";\n\tif (signal.aborted) return \"close\";\n\tawait runRoute(unreadable ? \"unlock --stale\" : \"unlock\", signal);\n\tif (signal.aborted) return \"close\";\n\tconst latest = await inspectOperationAvailability();\n\tif (signal.aborted) return \"close\";\n\treturn latest.kind === \"free\" ? \"restored\" : \"stay\";\n}\n", "import { 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\tinspectOperationAvailability,\n\ttype OperationAvailability,\n\toperationBlocksChanges,\n\toperationCanRecover,\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\tobservationMatchesConfig,\n\tobservationSummary,\n\ttype SyncAttentionState,\n\tsyncAttentionMatchesConfig,\n} from \"./sync-attention.js\";\nimport { countValidSyncSetups } from \"./sync-setups-ui.js\";\nimport { safeTerminalText } from \"./terminal-text.js\";\n\nexport const MAIN_MENU_ACTIONS = [\n\t\"Sync now (recommended)\",\n\t\"Switch sync setup\",\n\t\"Status & changes\",\n\t\"Settings\",\n\t\"More\u2026\",\n] as const;\n\nexport interface ManagerDescription {\n\ttitle: string;\n\tactions: string[];\n\toperation?: OperationAvailability;\n\tattention?: SyncAttentionState;\n\tobservation?: StartupObservation;\n\tattentionBlocksSync?: boolean;\n\tattentionReviewDisabled?: boolean;\n}\n\nexport async function describeManagerState(\n\tsignal?: AbortSignal,\n\tattention?: SyncAttentionState,\n\tinspectOperation: () => Promise<OperationAvailability> = inspectOperationAvailability,\n\tobservation?: StartupObservation,\n): Promise<ManagerDescription> {\n\tlet raw: Record<string, unknown> | undefined;\n\ttry {\n\t\traw = await readLocalConfigObject();\n\t} catch (error) {\n\t\treturn {\n\t\t\ttitle: [\n\t\t\t\t\"Manage sync\",\n\t\t\t\t\"\",\n\t\t\t\t\"Settings file needs repair. Automatic sync and settings writes are paused.\",\n\t\t\t\t`Error: ${safeTerminalText(errorMessage(error))}`,\n\t\t\t\t`File: ${safeTerminalText(await activeLocalConfigPath())}`,\n\t\t\t\t\"\",\n\t\t\t\t\"Repair the JSON file, then reopen /sync.\",\n\t\t\t].join(\"\\n\"),\n\t\t\tactions: [\"Help\"],\n\t\t};\n\t}\n\tif (!raw) {\n\t\treturn {\n\t\t\ttitle: [\"Manage sync\", \"\", \"Not set up.\", \"\", \"What do you want to do?\"].join(\"\\n\"),\n\t\t\tactions: [\"Set up sync\", \"Help\"],\n\t\t};\n\t}\n\tconst configuredTargets = ownRecord(raw.syncSetups);\n\tif (raw.version === 3 && configuredTargets && Object.keys(configuredTargets).length === 0) {\n\t\treturn {\n\t\t\ttitle: [\n\t\t\t\t\"Manage sync\",\n\t\t\t\t\"\",\n\t\t\t\t\"No sync setups are configured.\",\n\t\t\t\t\"Add a sync setup using an existing storage connection.\",\n\t\t\t\t\"\",\n\t\t\t\t\"What do you want to do?\",\n\t\t\t].join(\"\\n\"),\n\t\t\tactions: [\"Sync setups\u2026\", \"Storage connections\u2026\", \"Help\"],\n\t\t};\n\t}\n\ttry {\n\t\tconst config = await loadConfig();\n\t\tconst operation = await inspectOperation();\n\t\tconst changesBlocked = operationBlocksChanges(operation);\n\t\tconst selection = syncIncludeSelection(config.include);\n\t\tlet currentAttention: SyncAttentionState | undefined;\n\t\tif (attention) {\n\t\t\ttry {\n\t\t\t\tconst attentionConfig =\n\t\t\t\t\tattention.decision.setupName === config.setupName\n\t\t\t\t\t\t? config\n\t\t\t\t\t\t: await loadConfig(attention.decision.setupName);\n\t\t\t\tif (syncAttentionMatchesConfig(attention, attentionConfig)) currentAttention = attention;\n\t\t\t} catch {\n\t\t\t\tcurrentAttention = undefined;\n\t\t\t}\n\t\t\tif (signal?.aborted) throw signal.reason;\n\t\t}\n\t\tconst attentionComparison = currentAttention\n\t\t\t? compareSyncInclude(\n\t\t\t\t\tcurrentAttention.decision.localInclude,\n\t\t\t\t\tcurrentAttention.decision.remoteInclude,\n\t\t\t\t)\n\t\t\t: undefined;\n\t\tconst noSyncedContent = config.include.length === 0;\n\t\tconst syncState = changesBlocked\n\t\t\t? undefined\n\t\t\t: await readStateForConfig(config).catch(() => undefined);\n\t\tconst currentObservation =\n\t\t\tobservation &&\n\t\t\tobservationMatchesConfig(observation, config) &&\n\t\t\tsyncState &&\n\t\t\tsyncStateFingerprint(syncState) === observation.inspection.stateIdentity\n\t\t\t\t? observation\n\t\t\t\t: undefined;\n\t\tconst lastAppliedSnapshot = changesBlocked\n\t\t\t? \"Unavailable while operations are locked\"\n\t\t\t: syncState?.lastAppliedSnapshot\n\t\t\t\t? safeTerminalText(syncState.lastAppliedSnapshot)\n\t\t\t\t: syncState\n\t\t\t\t\t? \"Never synced\"\n\t\t\t\t\t: \"Unavailable\";\n\t\tconst canSwitch = (await countValidSyncSetups(configuredTargets, signal)) > 1;\n\t\tconst mainActions = MAIN_MENU_ACTIONS.filter(\n\t\t\t(action) => action !== \"Switch sync setup\" || canSwitch,\n\t\t);\n\t\tconst ordinaryTitle = [\n\t\t\t\"Manage sync\",\n\t\t\t\"\",\n\t\t\t`Current sync setup: ${safeTerminalText(config.setupName)}`,\n\t\t\t`Storage: ${backendStorageDescription(config)}`,\n\t\t\t`Included: ${selection.builtIns.length} built-in group${selection.builtIns.length === 1 ? \"\" : \"s\"} \u00B7 ${selection.custom.length} extra path${selection.custom.length === 1 ? \"\" : \"s\"} \u00B7 Sessions ${selection.sessions ? \"on\" : \"off\"}`,\n\t\t\t`Automatic sync: ${automaticSyncSummary(config.automatic)}`,\n\t\t\t`Last applied: ${lastAppliedSnapshot}`,\n\t\t\t...(currentAttention\n\t\t\t\t? [\n\t\t\t\t\t\tcurrentAttention.decision.setupName === config.setupName\n\t\t\t\t\t\t\t? \"Sync status: Review needed\"\n\t\t\t\t\t\t\t: `Sync status: Review needed for setup ${safeTerminalText(currentAttention.decision.setupName)}`,\n\t\t\t\t\t\tattentionComparison?.remoteOnly.length === 0 &&\n\t\t\t\t\t\tattentionComparison.localOnly.length === 0\n\t\t\t\t\t\t\t? \"Only the synced-content order differs.\"\n\t\t\t\t\t\t\t: `Remote-only paths: ${attentionComparison?.remoteOnly.length ?? 0} \u00B7 Device-only paths: ${attentionComparison?.localOnly.length ?? 0}`,\n\t\t\t\t\t\t\"Nothing has been changed.\",\n\t\t\t\t\t]\n\t\t\t\t: currentObservation\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t`Startup check (${safeTerminalText(currentObservation.checkedAt)}): ${observationSummary(currentObservation)}`,\n\t\t\t\t\t\t\t\"Check-time observation only; synchronization rechecks current content.\",\n\t\t\t\t\t\t]\n\t\t\t\t\t: [\"Remote status: Not checked\"]),\n\t\t\t...(noSyncedContent\n\t\t\t\t? [\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\"No included content is selected. Choose included content in Settings before syncing.\",\n\t\t\t\t\t]\n\t\t\t\t: []),\n\t\t\t\"\",\n\t\t\t\"What do you want to do?\",\n\t\t];\n\t\treturn {\n\t\t\ttitle: (changesBlocked\n\t\t\t\t? [\"Manage sync\", ...operationStatusLines(operation)]\n\t\t\t\t: ordinaryTitle\n\t\t\t).join(\"\\n\"),\n\t\t\tactions: operationActions(operation, noSyncedContent, canSwitch, mainActions),\n\t\t\toperation,\n\t\t\t...(currentObservation ? { observation: currentObservation } : {}),\n\t\t\t...(currentAttention\n\t\t\t\t? {\n\t\t\t\t\t\tattention: currentAttention,\n\t\t\t\t\t\tattentionBlocksSync: currentAttention.decision.setupName === config.setupName,\n\t\t\t\t\t\tattentionReviewDisabled: changesBlocked,\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t};\n\t} catch (error) {\n\t\tif (signal?.aborted) throw error;\n\t\treturn {\n\t\t\ttitle: [\n\t\t\t\t\"Manage sync\",\n\t\t\t\t\"\",\n\t\t\t\t\"Settings need attention. Automatic sync is paused.\",\n\t\t\t\t`Current sync setup: ${safeTerminalText(typeof raw.activeSyncSetup === \"string\" ? raw.activeSyncSetup : \"none\")}`,\n\t\t\t\t`Error: ${safeTerminalText(errorMessage(error))}`,\n\t\t\t\t`File: ${safeTerminalText(await activeLocalConfigPath())}`,\n\t\t\t\t\"\",\n\t\t\t\t\"What do you want to do?\",\n\t\t\t].join(\"\\n\"),\n\t\t\tactions: [\"Sync setups\u2026\", \"Storage connections\u2026\", \"History & recovery\u2026\", \"Help\"],\n\t\t};\n\t}\n}\n\nfunction operationActions(\n\toperation: OperationAvailability,\n\tnoSyncedContent: boolean,\n\tcanSwitch: boolean,\n\tmainActions: string[],\n) {\n\tif (operationCanRecover(operation)) {\n\t\treturn [\n\t\t\t\"Restore sync access\u2026 (recommended)\",\n\t\t\t\"Status & changes\",\n\t\t\t\"History & recovery\u2026\",\n\t\t\t\"Help\",\n\t\t];\n\t}\n\tif (operation.kind !== \"free\") {\n\t\treturn [\"Refresh operation status\", \"Status & changes\", \"History & recovery\u2026\", \"Help\"];\n\t}\n\treturn noSyncedContent\n\t\t? [\"Settings\", ...(canSwitch ? [\"Switch sync setup\"] : []), \"Status & changes\", \"More\u2026\"]\n\t\t: mainActions;\n}\n\nfunction operationStatusLines(operation: OperationAvailability): string[] {\n\tswitch (operation.kind) {\n\t\tcase \"free\":\n\t\t\treturn [];\n\t\tcase \"live\": {\n\t\t\tconst command = truncateToWidth(safeTerminalText(operation.lock.command), 16, \"\u2026\");\n\t\t\treturn [\n\t\t\t\t`Running: ${command} (pid ${operation.lock.pid}). Wait, then refresh; Settings and More return.`,\n\t\t\t];\n\t\t}\n\t\tcase \"busy\":\n\t\t\treturn [\n\t\t\t\t\"Pi-sync may be starting or finishing. Wait, then refresh; Settings and More remain unavailable.\",\n\t\t\t];\n\t\tcase \"recoverable-stale\":\n\t\t\treturn [\n\t\t\t\t\"Sync paused: old lock remains. Close other Pi sessions then restore; Settings and More return.\",\n\t\t\t];\n\t\tcase \"recoverable-unreadable\":\n\t\t\treturn [\n\t\t\t\t\"Sync paused: owner unknown. Close other Pi sessions then restore; Settings and More return.\",\n\t\t\t];\n\t\tcase \"inspection-error\":\n\t\t\treturn [\n\t\t\t\t\"Lock check failed. Fix path access, then refresh; Settings and More remain unavailable.\",\n\t\t\t];\n\t}\n}\n\nexport function backendStorageDescription(config: AnySyncConfig) {\n\tconst connection = safeTerminalText(config.connectionName);\n\tswitch (config.backend.type) {\n\t\tcase \"s3\": {\n\t\t\tconst type =\n\t\t\t\tconfig.backend.profile.kind === \"r2\" ||\n\t\t\t\tisCloudflareR2Endpoint(config.backend.profile.endpoint)\n\t\t\t\t\t? \"Cloudflare R2\"\n\t\t\t\t\t: \"S3-compatible\";\n\t\t\treturn `${type} \u00B7 ${connection} \u00B7 ${safeTerminalText(config.backend.destination.bucket)}`;\n\t\t}\n\t\tcase \"webdav\":\n\t\t\treturn `WebDAV \u00B7 ${connection} \u00B7 ${safeTerminalText(config.backend.destination.path)}`;\n\t\tcase \"git\":\n\t\t\treturn `Git \u00B7 ${connection} \u00B7 ${safeTerminalText(config.backend.destination.branch)}`;\n\t}\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport { loadConfig } from \"../settings/config.js\";\nimport { readLocalConfigObject } from \"../settings/settings-store.js\";\nimport { ownRecord } from \"../settings/settings-validation.js\";\nimport { syncErrorGuidance } from \"../sync/sync-error-guidance.js\";\nimport { syncIncludeSelection } from \"../sync/sync-policy.js\";\nimport { safeTerminalText } from \"./terminal-text.js\";\n\nexport async function countValidSyncSetups(\n\tsetups: Record<string, unknown> | undefined,\n\tsignal?: AbortSignal,\n) {\n\tlet count = 0;\n\tfor (const name of Object.keys(setups ?? {})) {\n\t\tthrowIfAborted(signal);\n\t\tlet valid = false;\n\t\ttry {\n\t\t\tawait loadConfig(name);\n\t\t\tvalid = true;\n\t\t} catch {\n\t\t\t// Invalid setups stay visible in management but are not switchable.\n\t\t}\n\t\tthrowIfAborted(signal);\n\t\tif (valid) count += 1;\n\t}\n\treturn count;\n}\n\nfunction throwIfAborted(signal?: AbortSignal) {\n\tif (!signal?.aborted) return;\n\tthrow signal.reason instanceof Error\n\t\t? signal.reason\n\t\t: new DOMException(\"The operation was aborted\", \"AbortError\");\n}\n\ntype SyncSetupActions = {\n\tadd(signal?: AbortSignal): Promise<void>;\n\tedit(name: string, signal?: AbortSignal): Promise<void>;\n\tmakeCurrent(name: string, signal?: AbortSignal): Promise<\"exit\" | undefined>;\n\tremove(name: string, signal?: AbortSignal): Promise<void>;\n};\n\ninterface SetupMenuState {\n\tsetups: Record<string, unknown>;\n\tactive?: string;\n\tselected?: {\n\t\tname: string;\n\t\tdetail: string[];\n\t\tvalid: boolean;\n\t\tremoveUnavailable: boolean;\n\t};\n}\n\nexport async function showSyncSetups(\n\tctx: ExtensionCommandContext,\n\tactions: SyncSetupActions,\n\tsignal?: AbortSignal,\n): Promise<\"exit\" | undefined> {\n\tlet selectedName: string | undefined;\n\tlet exit = false;\n\tconst nameById = new Map<string, string>();\n\ttype Screen = \"list\" | \"detail\";\n\ttype Action = \"add\" | \"select\" | \"make-current\" | \"edit\" | \"remove\" | \"back\";\n\tconst menu = defineMenu<SetupMenuState, Screen, Action, ExtensionCommandContext>({\n\t\tstart: \"list\",\n\t\tscreens: {\n\t\t\tlist: ({ state }) => {\n\t\t\t\tnameById.clear();\n\t\t\t\tconst names = Object.keys(state.setups).sort((left, right) => left.localeCompare(right));\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\ttitle: \"Sync setups\",\n\t\t\t\t\tlines: [\"What to sync, where to store it, and when to sync.\"],\n\t\t\t\t\titems: [\n\t\t\t\t\t\t{ id: \"add\", label: \"Add sync setup\", action: \"add\" },\n\t\t\t\t\t\t...names.map((name, index) => {\n\t\t\t\t\t\t\tconst id = `setup:${index}`;\n\t\t\t\t\t\t\tnameById.set(id, name);\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\tlabel: `${safeTerminalText(name)}${name === state.active ? \" (current)\" : \"\"}`,\n\t\t\t\t\t\t\t\tdescription: setupSummary(state.setups[name]),\n\t\t\t\t\t\t\t\taction: \"select\" as const,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}),\n\t\t\t\t\t],\n\t\t\t\t\thint: \"back\",\n\t\t\t\t};\n\t\t\t},\n\t\t\tdetail: ({ state }) => ({\n\t\t\t\tkind: \"actions\",\n\t\t\t\ttitle: state.selected\n\t\t\t\t\t? `Sync setup \u201C${safeTerminalText(state.selected.name)}\u201D`\n\t\t\t\t\t: \"Sync setup\",\n\t\t\t\tlines: state.selected?.detail ?? [\"This sync setup no longer exists.\"],\n\t\t\t\titems: state.selected\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t...(!state.selected.name ||\n\t\t\t\t\t\t\tstate.selected.name === state.active ||\n\t\t\t\t\t\t\t!state.selected.valid\n\t\t\t\t\t\t\t\t? []\n\t\t\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"make-current\",\n\t\t\t\t\t\t\t\t\t\t\tlabel: \"Make current\u2026\",\n\t\t\t\t\t\t\t\t\t\t\taction: \"make-current\" as const,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t{ id: \"edit\", label: \"Edit storage location\u2026\", action: \"edit\" },\n\t\t\t\t\t\t\t...(state.selected.removeUnavailable\n\t\t\t\t\t\t\t\t? []\n\t\t\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"remove\",\n\t\t\t\t\t\t\t\t\t\t\tlabel: \"Remove sync setup\u2026\",\n\t\t\t\t\t\t\t\t\t\t\taction: \"remove\" as const,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t{ id: \"back\", label: \"Back\", action: \"back\" },\n\t\t\t\t\t\t]\n\t\t\t\t\t: [{ id: \"back\", label: \"Back\", action: \"back\" }],\n\t\t\t\thint: \"back\",\n\t\t\t}),\n\t\t},\n\t\tactions: {\n\t\t\tadd: async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait actions.add(signal);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!signal?.aborted) {\n\t\t\t\t\t\tctx.ui.notify(`Sync setup was not added: ${menuErrorMessage(error)}`, \"error\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\tselect: async ({ itemId }) => {\n\t\t\t\tselectedName = nameById.get(itemId);\n\t\t\t\treturn selectedName ? { kind: \"to\", screen: \"detail\" } : { kind: \"rejected\" };\n\t\t\t},\n\t\t\t\"make-current\": async () => {\n\t\t\t\tif (!selectedName) return { kind: \"rejected\" };\n\t\t\t\ttry {\n\t\t\t\t\texit = (await actions.makeCurrent(selectedName, signal)) === \"exit\";\n\t\t\t\t\treturn exit ? { kind: \"close\" } : { kind: \"stay\" };\n\t\t\t\t} catch (error) {\n\t\t\t\t\tnotifySetupChangeError(ctx, selectedName, error, signal);\n\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t}\n\t\t\t},\n\t\t\tedit: async () => {\n\t\t\t\tif (!selectedName) return { kind: \"rejected\" };\n\t\t\t\ttry {\n\t\t\t\t\tawait actions.edit(selectedName, signal);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tnotifySetupChangeError(ctx, selectedName, error, signal);\n\t\t\t\t}\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\tremove: async () => {\n\t\t\t\tif (!selectedName) return { kind: \"rejected\" };\n\t\t\t\tconst name = selectedName;\n\t\t\t\ttry {\n\t\t\t\t\tawait actions.remove(name, signal);\n\t\t\t\t\tselectedName = undefined;\n\t\t\t\t\treturn { kind: \"back\" };\n\t\t\t\t} catch (error) {\n\t\t\t\t\tnotifySetupChangeError(ctx, name, error, signal);\n\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t}\n\t\t\t},\n\t\t\tback: async () => {\n\t\t\t\tselectedName = undefined;\n\t\t\t\treturn { kind: \"back\" };\n\t\t\t},\n\t\t},\n\t});\n\tawait runMenu(ctx, menu, {\n\t\tgetState: async () => loadSetupMenuState(selectedName, signal),\n\t\tsignal,\n\t\tisCurrent: () => !signal?.aborted,\n\t});\n\treturn exit ? \"exit\" : undefined;\n}\n\nasync function loadSetupMenuState(\n\tselectedName: string | undefined,\n\tsignal?: AbortSignal,\n): Promise<SetupMenuState> {\n\tconst raw = await readLocalConfigObject();\n\tthrowIfAborted(signal);\n\tconst setups = ownRecord(raw?.syncSetups) ?? {};\n\tconst active = typeof raw?.activeSyncSetup === \"string\" ? raw.activeSyncSetup : undefined;\n\tif (!selectedName || !ownRecord(setups[selectedName])) return { setups, active };\n\tconst setupCount = Object.keys(setups).length;\n\tconst isCurrent = selectedName === active;\n\tlet detail: string[];\n\tlet valid = true;\n\ttry {\n\t\tconst config = await loadConfig(selectedName);\n\t\tthrowIfAborted(signal);\n\t\tconst selection = syncIncludeSelection(config.include);\n\t\tdetail = [\n\t\t\t`Status: ${isCurrent ? \"Current\" : \"Not current\"}`,\n\t\t\t`Storage connection: ${safeTerminalText(config.connectionName)}`,\n\t\t\t`Endpoint: ${storageEndpoint(config)}`,\n\t\t\t`Storage location: ${storageLocation(config)}`,\n\t\t\t`Included content: ${selection.builtIns.length} built-in groups \u00B7 ${selection.custom.length} extra paths`,\n\t\t\t`Sessions: ${selection.sessions ? \"On \u2014 privacy-sensitive\" : \"Off\"}`,\n\t\t\t`Automatic sync: ${config.automatic ? \"On\" : \"Off\"}`,\n\t\t\tisCurrent\n\t\t\t\t? \"Edit included content and automatic sync in /sync \u2192 Settings.\"\n\t\t\t\t: \"To edit included content or automatic sync, make this setup current, then open /sync \u2192 Settings.\",\n\t\t];\n\t} catch (error) {\n\t\tvalid = false;\n\t\tdetail = [\n\t\t\t`Status: Invalid${isCurrent ? \" current setup\" : \"\"}`,\n\t\t\t`Reason: ${menuErrorMessage(error)}`,\n\t\t\t\"Make current and sync are unavailable until this setup is repaired.\",\n\t\t];\n\t}\n\tconst removeUnavailable = isCurrent && setupCount > 1;\n\tif (removeUnavailable) detail.push(\"Remove unavailable: switch to another setup first.\");\n\treturn {\n\t\tsetups,\n\t\tactive,\n\t\tselected: { name: selectedName, detail, valid, removeUnavailable },\n\t};\n}\n\nfunction notifySetupChangeError(\n\tctx: ExtensionCommandContext,\n\tname: string,\n\terror: unknown,\n\tsignal?: AbortSignal,\n) {\n\tif (signal?.aborted) return;\n\tctx.ui.notify(\n\t\t`Sync setup \u201C${safeTerminalText(name)}\u201D was not changed: ${menuErrorMessage(error)}`,\n\t\t\"error\",\n\t);\n}\n\nfunction menuErrorMessage(error: unknown) {\n\treturn syncErrorGuidance(error);\n}\n\nfunction setupSummary(value: unknown) {\n\tconst storage = ownRecord(ownRecord(value)?.storage);\n\tif (!storage || typeof storage.connection !== \"string\") return \"Invalid storage reference\";\n\treturn safeTerminalText(\n\t\t`${storage.connection} \u00B7 ${storage.bucket ?? storage.branch ?? \"WebDAV\"} \u00B7 ${storage.path ?? \"missing path\"}`,\n\t);\n}\n\nfunction storageEndpoint(config: Awaited<ReturnType<typeof loadConfig>>) {\n\tswitch (config.backend.type) {\n\t\tcase \"s3\":\n\t\t\treturn safeTerminalText(config.backend.profile.endpoint);\n\t\tcase \"git\":\n\t\t\treturn safeTerminalText(config.backend.profile.remote);\n\t\tcase \"webdav\":\n\t\t\treturn safeTerminalText(config.backend.profile.url);\n\t}\n}\n\nfunction storageLocation(config: Awaited<ReturnType<typeof loadConfig>>) {\n\tswitch (config.backend.type) {\n\t\tcase \"s3\":\n\t\t\treturn safeTerminalText(`${config.backend.destination.bucket}/${config.storagePath}`);\n\t\tcase \"git\":\n\t\t\treturn safeTerminalText(`Git \u00B7 ${config.backend.destination.branch}:${config.storagePath}`);\n\t\tcase \"webdav\":\n\t\t\treturn safeTerminalText(`WebDAV \u00B7 ${config.storagePath}`);\n\t}\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport { loadConfig } from \"../settings/config.js\";\nimport { localConfigPath } from \"../settings/config-file.js\";\nimport { updateSyncSetup } from \"../settings/settings-management.js\";\nimport { updateLocalConfig } from \"../settings/settings-store.js\";\nimport {\n\tSETUP_SWITCH_ACTION_OPTIONS,\n\tsaveOnSwitch,\n\tsetupSwitchActionFromLabel,\n\tsetupSwitchActionLabel,\n} from \"../sync/setup-switch.js\";\nimport type { RunRoute } from \"./cancellable-operation.js\";\nimport { dispatchManagerResult } from \"./manager-result-dispatcher.js\";\nimport { AUTOMATIC_SYNC_DESCRIPTION } from \"./setup/setup-prompts.js\";\nimport { safeTerminalText } from \"./terminal-text.js\";\n\nexport type SyncSettingsRoute = RunRoute;\n\nexport async function showSyncSettings(\n\tctx: ExtensionCommandContext,\n\trunRoute: SyncSettingsRoute,\n\tsignal?: AbortSignal,\n) {\n\tif (ctx.mode !== \"tui\") {\n\t\tctx.ui.notify(`Edit pi-sync settings manually: ${safeTerminalText(localConfigPath())}`, \"info\");\n\t\treturn;\n\t}\n\tconst initial = await loadConfig();\n\tif (signal?.aborted) return;\n\tconst setupName = initial.setupName;\n\ttype Action = \"automatic\" | \"skip-secret-scan\" | \"on-switch\" | \"include\" | \"remote-include\";\n\tconst menu = defineMenu<\n\t\tAwaited<ReturnType<typeof loadConfig>>,\n\t\t\"settings\",\n\t\tAction,\n\t\tExtensionCommandContext\n\t>({\n\t\tstart: \"settings\",\n\t\tscreens: {\n\t\t\tsettings: ({ state }) => ({\n\t\t\t\tkind: \"settings\",\n\t\t\t\ttitle: \"Pi Sync Settings\",\n\t\t\t\tlines: [\n\t\t\t\t\t`Sync setup: ${safeTerminalText(state.setupName)} \u00B7 Storage connection: ${safeTerminalText(state.connectionName)}`,\n\t\t\t\t],\n\t\t\t\titems: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"automatic\",\n\t\t\t\t\t\tlabel: \"Automatic sync\",\n\t\t\t\t\t\tdescription: AUTOMATIC_SYNC_DESCRIPTION,\n\t\t\t\t\t\tcurrentValue: state.automatic ? \"On\" : \"Off\",\n\t\t\t\t\t\tvalues: [\"On\", \"Off\"],\n\t\t\t\t\t\taction: \"automatic\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"skipSecretScan\",\n\t\t\t\t\t\tlabel: \"Skip secret scan (all setups)\",\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\"All setups: allow pushes without checking managed local files for possible secrets.\",\n\t\t\t\t\t\tcurrentValue: state.skipSecretScan ? \"On\" : \"Off\",\n\t\t\t\t\t\tvalues: [\"On\", \"Off\"],\n\t\t\t\t\t\taction: \"skip-secret-scan\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"onSwitch\",\n\t\t\t\t\t\tlabel: \"After switching setup (all setups)\",\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\"All setups: ask before a pull review, open it automatically, or switch without pulling.\",\n\t\t\t\t\t\tcurrentValue: setupSwitchActionLabel(state.onSwitch),\n\t\t\t\t\t\tvalues: SETUP_SWITCH_ACTION_OPTIONS.map(({ label }) => label),\n\t\t\t\t\t\taction: \"on-switch\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"include\",\n\t\t\t\t\t\tlabel: \"Included content\",\n\t\t\t\t\t\tdescription: `${state.include.length} selected path${state.include.length === 1 ? \"\" : \"s\"}. Choose which paths this setup syncs.`,\n\t\t\t\t\t\tcurrentValue: \"Open editor\",\n\t\t\t\t\t\taction: \"include\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"remoteInclude\",\n\t\t\t\t\t\tlabel: \"Compare synced content\",\n\t\t\t\t\t\tdescription: \"Review this device and remote content lists before choosing either one.\",\n\t\t\t\t\t\tcurrentValue: \"Review\",\n\t\t\t\t\t\taction: \"remote-include\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t}),\n\t\t},\n\t\tactions: {\n\t\t\tautomatic: async ({ value, signal: actionSignal }) => {\n\t\t\t\tconst automatic = value === \"On\";\n\t\t\t\tconst mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n\t\t\t\ttry {\n\t\t\t\t\tconst latest = await loadConfig(setupName);\n\t\t\t\t\tif (mutationSignal.aborted) return { kind: \"rejected\" };\n\t\t\t\t\tif (latest.automatic === automatic) return { kind: \"stay\" };\n\t\t\t\t\tawait updateSyncSetup(\n\t\t\t\t\t\tsetupName,\n\t\t\t\t\t\t(setup) => ({ ...setup, sync: { ...setup.sync, automatic } }),\n\t\t\t\t\t\t{ signal: mutationSignal },\n\t\t\t\t\t);\n\t\t\t\t\tif (mutationSignal.aborted) return { kind: \"rejected\" };\n\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t`Automatic sync ${automatic ? \"enabled\" : \"disabled\"} for \u201C${safeTerminalText(setupName)}\u201D.`,\n\t\t\t\t\t\t\"info\",\n\t\t\t\t\t);\n\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n\t\t\t\t\treturn { kind: \"rejected\" };\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"skip-secret-scan\": async ({ value, signal: actionSignal }) => {\n\t\t\t\tconst skipSecretScan = value === \"On\";\n\t\t\t\tconst mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n\t\t\t\ttry {\n\t\t\t\t\tconst latest = await loadConfig(setupName);\n\t\t\t\t\tif (mutationSignal.aborted) return { kind: \"rejected\" };\n\t\t\t\t\tif (latest.skipSecretScan === skipSecretScan) return { kind: \"stay\" };\n\t\t\t\t\tawait updateLocalConfig((settings) => ({ ...settings, skipSecretScan }), mutationSignal);\n\t\t\t\t\tif (mutationSignal.aborted) return { kind: \"rejected\" };\n\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t`Secret scan ${skipSecretScan ? \"disabled\" : \"enabled\"} for pushes in all setups.`,\n\t\t\t\t\t\t\"info\",\n\t\t\t\t\t);\n\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n\t\t\t\t\treturn { kind: \"rejected\" };\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"on-switch\": async ({ value, signal: actionSignal }) => {\n\t\t\t\tconst action = value ? setupSwitchActionFromLabel(value) : undefined;\n\t\t\t\tif (!action) return { kind: \"rejected\" };\n\t\t\t\tconst mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n\t\t\t\ttry {\n\t\t\t\t\tconst latest = await loadConfig(setupName);\n\t\t\t\t\tif (mutationSignal.aborted) return { kind: \"rejected\" };\n\t\t\t\t\tif (latest.onSwitch === action) return { kind: \"stay\" };\n\t\t\t\t\tawait saveOnSwitch(action, mutationSignal);\n\t\t\t\t\tif (mutationSignal.aborted) return { kind: \"rejected\" };\n\t\t\t\t\tctx.ui.notify(`After switching setup: ${value}.`, \"info\");\n\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n\t\t\t\t\treturn { kind: \"rejected\" };\n\t\t\t\t}\n\t\t\t},\n\t\t\tinclude: async ({ signal: actionSignal }) => {\n\t\t\t\tconst editorSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n\t\t\t\tawait runRoute(\"files\", editorSignal, undefined, setupName);\n\t\t\t\treturn editorSignal.aborted ? { kind: \"rejected\" } : { kind: \"stay\" };\n\t\t\t},\n\t\t\t\"remote-include\": async ({ signal: actionSignal }) => {\n\t\t\t\tconst reviewSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n\t\t\t\tconst { showRemoteSelectionReview } = await import(\"./remote-selection-ui.js\");\n\t\t\t\tif (reviewSignal.aborted) return { kind: \"rejected\" };\n\t\t\t\tconst review = await showRemoteSelectionReview(ctx, setupName, reviewSignal, undefined, {\n\t\t\t\t\torigin: \"settings\",\n\t\t\t\t\trunRoute,\n\t\t\t\t});\n\t\t\t\tif (reviewSignal.aborted) return { kind: \"rejected\" };\n\t\t\t\tif (review.kind === \"route-result\") {\n\t\t\t\t\tconst disposition = await dispatchManagerResult(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\treview.result,\n\t\t\t\t\t\treview.route,\n\t\t\t\t\t\trunRoute,\n\t\t\t\t\t\treviewSignal,\n\t\t\t\t\t);\n\t\t\t\t\treturn disposition.kind === \"close\" ? { kind: \"close\" } : { kind: \"stay\" };\n\t\t\t\t}\n\t\t\t\treturn review.kind === \"closed\" || review.kind === \"stale\"\n\t\t\t\t\t? { kind: \"close\" }\n\t\t\t\t\t: { kind: \"stay\" };\n\t\t\t},\n\t\t},\n\t});\n\tawait runMenu(ctx, menu, {\n\t\tgetState: () => loadConfig(setupName),\n\t\tsignal,\n\t\tisCurrent: () => !signal?.aborted,\n\t});\n}\n\nfunction notifySaveFailure(ctx: ExtensionCommandContext, error: unknown) {\n\tctx.ui.notify(\n\t\t`Pi Sync settings save failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\"error\",\n\t);\n}\n", "import { isDeepStrictEqual } from \"node:util\";\nimport type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport {\n\taddStorageConnection,\n\tremoveStorageConnection,\n\tupdateStorageConnection,\n} from \"../settings/settings-management.js\";\nimport { readLocalConfigObject } from \"../settings/settings-store.js\";\nimport {\n\tisCloudflareR2Endpoint,\n\tnormalizeS3Endpoint,\n\townRecord,\n} from \"../settings/settings-validation.js\";\nimport { syncErrorGuidance } from \"../sync/sync-error-guidance.js\";\nimport { showAddGitStorageProfile, showEditGitStorageProfile } from \"./setup/git-ui.js\";\nimport {\n\tapplyS3CredentialUpdate,\n\tchooseS3Credentials,\n\tchooseS3CredentialUpdate,\n} 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\tlet selectedName: string | undefined;\n\tconst nameById = new Map<string, string>();\n\ttype Screen = \"list\" | \"detail\";\n\ttype Action = \"add\" | \"select\" | \"edit\" | \"remove\" | \"back\";\n\tconst menu = defineMenu<\n\t\tAwaited<ReturnType<typeof loadStorageMenuState>>,\n\t\tScreen,\n\t\tAction,\n\t\tExtensionCommandContext\n\t>({\n\t\tstart: \"list\",\n\t\tscreens: {\n\t\t\tlist: ({ state }) => {\n\t\t\t\tnameById.clear();\n\t\t\t\tconst names = Object.keys(state.profiles).sort((left, right) => left.localeCompare(right));\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\ttitle: \"Storage connections\",\n\t\t\t\t\tlines: state.version3\n\t\t\t\t\t\t? [\"Server addresses and sign-in details, reusable across sync setups.\"]\n\t\t\t\t\t\t: [\"Create version 3 settings before managing storage connections.\"],\n\t\t\t\t\titems: state.version3\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t{ id: \"add\", label: \"Add storage connection\", action: \"add\" as const },\n\t\t\t\t\t\t\t\t...names.map((name, index) => {\n\t\t\t\t\t\t\t\t\tconst id = `connection:${index}`;\n\t\t\t\t\t\t\t\t\tnameById.set(id, name);\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\t\tlabel: safeTerminalText(name),\n\t\t\t\t\t\t\t\t\t\tdescription: connectionSummary(ownRecord(state.profiles[name]) ?? {}),\n\t\t\t\t\t\t\t\t\t\taction: \"select\" as const,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: [],\n\t\t\t\t\thint: \"back\",\n\t\t\t\t};\n\t\t\t},\n\t\t\tdetail: ({ state }) => ({\n\t\t\t\tkind: \"actions\",\n\t\t\t\ttitle: state.selected\n\t\t\t\t\t? `Storage connection \u201C${safeTerminalText(state.selected.name)}\u201D`\n\t\t\t\t\t: \"Storage connection\",\n\t\t\t\tlines: state.selected?.lines ?? [\"This storage connection no longer exists.\"],\n\t\t\t\titems: state.selected\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t{ id: \"edit\", label: \"Edit storage connection\u2026\", action: \"edit\" },\n\t\t\t\t\t\t\t...(state.selected.usedBy.length === 0\n\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: \"remove\",\n\t\t\t\t\t\t\t\t\t\t\tlabel: \"Remove storage connection\u2026\",\n\t\t\t\t\t\t\t\t\t\t\taction: \"remove\" as const,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t: []),\n\t\t\t\t\t\t\t{ id: \"back\", label: \"Back\", action: \"back\" },\n\t\t\t\t\t\t]\n\t\t\t\t\t: [{ id: \"back\", label: \"Back\", action: \"back\" }],\n\t\t\t\thint: \"back\",\n\t\t\t}),\n\t\t},\n\t\tactions: {\n\t\t\tadd: async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait showAddStorageConnection(ctx, signal);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!signal?.aborted) {\n\t\t\t\t\t\tctx.ui.notify(`Storage connection was not added: ${syncErrorGuidance(error)}`, \"error\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\tselect: async ({ itemId }) => {\n\t\t\t\tselectedName = nameById.get(itemId);\n\t\t\t\treturn selectedName ? { kind: \"to\", screen: \"detail\" } : { kind: \"rejected\" };\n\t\t\t},\n\t\t\tedit: async ({ state }) => {\n\t\t\t\tif (!state.selected || state.selected.name !== selectedName) return { kind: \"rejected\" };\n\t\t\t\ttry {\n\t\t\t\t\tawait editStorageConnection(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tstate.selected.name,\n\t\t\t\t\t\tstate.selected.profile,\n\t\t\t\t\t\tstate.selected.usedBy,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tnotifyConnectionError(ctx, state.selected.name, error, signal);\n\t\t\t\t}\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\tremove: async ({ state }) => {\n\t\t\t\tif (!state.selected || state.selected.name !== selectedName) return { kind: \"rejected\" };\n\t\t\t\tconst name = state.selected.name;\n\t\t\t\tconst confirmed = await ctx.ui.confirm(\n\t\t\t\t\t\"Remove storage connection?\",\n\t\t\t\t\t`Remove local storage connection \u201C${safeTerminalText(name)}\u201D? Remote data and history are not deleted.`,\n\t\t\t\t\t{ signal },\n\t\t\t\t);\n\t\t\t\tif (!confirmed || signal?.aborted) return { kind: \"rejected\" };\n\t\t\t\ttry {\n\t\t\t\t\tawait removeStorageConnection(name, signal);\n\t\t\t\t\tctx.ui.notify(`Removed storage connection \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n\t\t\t\t\tselectedName = undefined;\n\t\t\t\t\treturn { kind: \"back\" };\n\t\t\t\t} catch (error) {\n\t\t\t\t\tnotifyConnectionError(ctx, name, error, signal);\n\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t}\n\t\t\t},\n\t\t\tback: async () => {\n\t\t\t\tselectedName = undefined;\n\t\t\t\treturn { kind: \"back\" };\n\t\t\t},\n\t\t},\n\t});\n\tawait runMenu(ctx, menu, {\n\t\tgetState: () => loadStorageMenuState(selectedName, signal),\n\t\tsignal,\n\t\tisCurrent: () => !signal?.aborted,\n\t});\n}\n\nasync function loadStorageMenuState(selectedName: string | undefined, signal?: AbortSignal) {\n\tconst raw = await readLocalConfigObject();\n\tif (signal?.aborted) throw signal.reason;\n\tconst profiles = ownRecord(raw?.storageConnections) ?? {};\n\tconst profile = selectedName ? ownRecord(profiles[selectedName]) : undefined;\n\tif (!selectedName || !profile) {\n\t\treturn { version3: raw?.version === 3, profiles, selected: undefined };\n\t}\n\tconst usedBy = referencingSetups(raw, selectedName);\n\treturn {\n\t\tversion3: raw?.version === 3,\n\t\tprofiles,\n\t\tselected: {\n\t\t\tname: selectedName,\n\t\t\tprofile,\n\t\t\tusedBy,\n\t\t\tlines: [\n\t\t\t\t`Type: ${connectionType(profile)}`,\n\t\t\t\t`Endpoint: ${connectionEndpoint(profile)}`,\n\t\t\t\t`Credentials: ${credentialSource(profile)}`,\n\t\t\t\t`Used by: ${usedBy.length > 0 ? usedBy.map(safeTerminalText).join(\", \") : \"No sync setups\"}`,\n\t\t\t\t...(usedBy.length > 0\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t\"Remove unavailable: remove the listed sync setups first. Switch away from a current setup before removing it if other setups remain.\",\n\t\t\t\t\t\t]\n\t\t\t\t\t: []),\n\t\t\t],\n\t\t},\n\t};\n}\n\nfunction notifyConnectionError(\n\tctx: ExtensionCommandContext,\n\tname: string,\n\terror: unknown,\n\tsignal?: AbortSignal,\n) {\n\tif (signal?.aborted) return;\n\tctx.ui.notify(\n\t\t`Storage connection \u201C${safeTerminalText(name)}\u201D was not changed: ${syncErrorGuidance(error)}`,\n\t\t\"error\",\n\t);\n}\n\nasync function editStorageConnection(\n\tctx: ExtensionCommandContext,\n\tname: string,\n\tprofile: Record<string, unknown>,\n\tusedBy: string[],\n\tsignal?: AbortSignal,\n) {\n\tif (ctx.mode !== \"tui\") {\n\t\tctx.ui.notify(\n\t\t\t\"Editing storage connections requires TUI mode for safe credential handling. Edit the private version 3 settings file instead.\",\n\t\t\t\"warning\",\n\t\t);\n\t\treturn;\n\t}\n\tif (profile.type === \"webdav\") {\n\t\tawait showEditWebDavStorageProfile(\n\t\t\tctx,\n\t\t\tname,\n\t\t\t{ ...profile, kind: \"webdav\", ...(ownRecord(profile.credentials) ?? {}) },\n\t\t\tsignal,\n\t\t\tusedBy,\n\t\t);\n\t\treturn;\n\t}\n\tif (profile.type === \"git\") {\n\t\tawait showEditGitStorageProfile(ctx, name, { ...profile, kind: \"git\" }, signal, usedBy);\n\t\treturn;\n\t}\n\tconst endpoint = await requiredInput(\n\t\tctx,\n\t\t\"Endpoint\",\n\t\tString(profile.endpoint ?? \"https://s3.example.com\"),\n\t\tsignal,\n\t\tnormalizeS3Endpoint,\n\t);\n\tif (!endpoint || signal?.aborted) return;\n\tconst region = await requiredInput(\n\t\tctx,\n\t\t\"Region\\n\\nUse your bucket's region; Cloudflare R2 uses auto.\",\n\t\tString(profile.region ?? \"auto\"),\n\t\tsignal,\n\t);\n\tif (!region || signal?.aborted) return;\n\tconst storedCredentials = ownRecord(profile.credentials) ?? {};\n\tconst credentials = await chooseS3CredentialUpdate(\n\t\tctx,\n\t\t{ ...profile, ...storedCredentials },\n\t\tsignal,\n\t);\n\tif (!credentials || signal?.aborted) return;\n\tconst saved = await saveReviewedDraft(\n\t\tctx,\n\t\t\"Review storage connection\",\n\t\t[\n\t\t\t`Storage connection: ${safeTerminalText(name)}`,\n\t\t\t`Endpoint: ${safeTerminalText(String(profile.endpoint ?? \"missing\"))} \u2192 ${safeTerminalText(endpoint)}`,\n\t\t\t`Region: ${safeTerminalText(String(profile.region ?? \"auto\"))} \u2192 ${safeTerminalText(region)}`,\n\t\t\t`Credentials: ${safeTerminalText(credentials.summary)}`,\n\t\t\t`Affected sync setups: ${usedBy.length > 0 ? usedBy.map(safeTerminalText).join(\", \") : \"None\"}`,\n\t\t\t\"Saving changes future storage access for every affected setup; it does not move remote data.\",\n\t\t],\n\t\t\"Save storage connection\",\n\t\t(saveSignal) =>\n\t\t\tupdateStorageConnection(\n\t\t\t\tname,\n\t\t\t\t(current) => {\n\t\t\t\t\tif (current.type !== \"s3\" || !isDeepStrictEqual(current, profile)) {\n\t\t\t\t\t\tthrow new Error(\"Storage connection changed while it was open; reopen it.\");\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...current,\n\t\t\t\t\t\tendpoint,\n\t\t\t\t\t\tregion,\n\t\t\t\t\t\tcredentials: applyS3CredentialUpdate(\n\t\t\t\t\t\t\tcurrent.credentials,\n\t\t\t\t\t\t\tcredentials,\n\t\t\t\t\t\t) as typeof current.credentials,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tusedBy,\n\t\t\t\tsaveSignal,\n\t\t\t),\n\t\tsignal,\n\t);\n\tif (!saved || signal?.aborted) return;\n\tctx.ui.notify(`Saved storage connection \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n}\n\nexport async function showAddStorageConnection(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n\tif (ctx.mode !== \"tui\") {\n\t\tctx.ui.notify(\n\t\t\t\"Adding storage connections requires TUI mode for safe credential handling. Edit the private version 3 settings file instead.\",\n\t\t\t\"warning\",\n\t\t);\n\t\treturn false;\n\t}\n\tconst preset = await ctx.ui.select(\n\t\t\"Storage type\",\n\t\t[\"Cloudflare R2\", \"Other S3-compatible storage\", \"WebDAV\", \"Git\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tif (signal?.aborted || !preset || preset === \"Cancel\") return false;\n\tif (preset === \"WebDAV\") return showAddWebDavStorageProfile(ctx, signal);\n\tif (preset === \"Git\") return showAddGitStorageProfile(ctx, signal);\n\tconst name = await promptResourceName(\n\t\tctx,\n\t\t\"storage connection\",\n\t\tpreset === \"Cloudflare R2\" ? \"r2\" : \"s3\",\n\t\tsignal,\n\t);\n\tif (!name || signal?.aborted) return false;\n\tconst endpoint = await requiredValueInput(\n\t\tctx,\n\t\t\"S3 API endpoint\\n\\nUse the API URL from your storage provider, not its web console.\",\n\t\tpreset === \"Cloudflare R2\"\n\t\t\t? \"https://<account-id>.r2.cloudflarestorage.com\"\n\t\t\t: \"https://s3.example.com\",\n\t\tsignal,\n\t\tnormalizeS3Endpoint,\n\t);\n\tif (!endpoint || signal?.aborted) return false;\n\tconst region =\n\t\tpreset === \"Cloudflare R2\"\n\t\t\t? \"auto\"\n\t\t\t: await requiredInput(\n\t\t\t\t\tctx,\n\t\t\t\t\t\"Region\\n\\nUse the region assigned to your bucket by the provider.\",\n\t\t\t\t\t\"us-east-1\",\n\t\t\t\t\tsignal,\n\t\t\t\t);\n\tif (!region || signal?.aborted) return false;\n\tconst credentials = await chooseS3Credentials(ctx, signal);\n\tif (!credentials || signal?.aborted) return false;\n\tconst saved = await saveReviewedDraft(\n\t\tctx,\n\t\t\"Review storage connection\",\n\t\t[\n\t\t\t`Name: ${safeTerminalText(name)}`,\n\t\t\t`Type: ${preset}`,\n\t\t\t`Endpoint: ${safeTerminalText(endpoint)}`,\n\t\t\t`Region: ${safeTerminalText(region)}`,\n\t\t\t`Credentials: ${safeTerminalText(credentials.summary)}`,\n\t\t\t\"Adding a connection does not contact remote storage or start syncing.\",\n\t\t],\n\t\t\"Add storage connection\",\n\t\t(saveSignal) =>\n\t\t\taddStorageConnection(\n\t\t\t\tname,\n\t\t\t\t{\n\t\t\t\t\ttype: \"s3\",\n\t\t\t\t\tendpoint,\n\t\t\t\t\tregion,\n\t\t\t\t\tcredentials: {\n\t\t\t\t\t\taccessKeyId: credentials.profileFields.accessKeyId ?? \"\",\n\t\t\t\t\t\tsecretAccessKey: credentials.profileFields.secretAccessKey ?? \"\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tsaveSignal,\n\t\t\t),\n\t\tsignal,\n\t);\n\tif (!saved) return false;\n\tif (signal?.aborted) return true;\n\tctx.ui.notify(`Added storage connection \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n\treturn true;\n}\n\nfunction referencingSetups(raw: Record<string, unknown> | undefined, connection: string) {\n\treturn Object.entries(ownRecord(raw?.syncSetups) ?? {})\n\t\t.filter(([, value]) => ownRecord(ownRecord(value)?.storage)?.connection === connection)\n\t\t.map(([name]) => name)\n\t\t.sort((left, right) => left.localeCompare(right));\n}\n\nexport function connectionSummary(profile: Record<string, unknown>) {\n\treturn `${connectionType(profile)} \u00B7 ${connectionEndpoint(profile)}`;\n}\n\nfunction connectionType(profile: Record<string, unknown>) {\n\tif (profile.type === \"git\") return \"Git\";\n\tif (profile.type === \"webdav\") return \"WebDAV\";\n\tif (\n\t\tprofile.type === \"s3\" &&\n\t\ttypeof profile.endpoint === \"string\" &&\n\t\tisCloudflareR2Endpoint(profile.endpoint)\n\t) {\n\t\treturn \"Cloudflare R2\";\n\t}\n\treturn \"S3-compatible\";\n}\n\nfunction connectionEndpoint(profile: Record<string, unknown>) {\n\tconst value =\n\t\tprofile.type === \"git\"\n\t\t\t? profile.remote\n\t\t\t: profile.type === \"webdav\"\n\t\t\t\t? profile.url\n\t\t\t\t: profile.endpoint;\n\tif (typeof value !== \"string\" || value.length === 0) return \"Missing\";\n\tif (profile.type === \"git\") return safeTerminalText(value);\n\ttry {\n\t\tconst url = new URL(value);\n\t\treturn safeTerminalText(`${url.origin}${url.pathname}`);\n\t} catch {\n\t\treturn \"Invalid\";\n\t}\n}\n\nfunction credentialSource(profile: Record<string, unknown>) {\n\tif (profile.type === \"git\") return \"Git credential helper or SSH configuration\";\n\tconst credentials = ownRecord(profile.credentials);\n\tif (profile.type === \"webdav\") return credentials?.password ? \"Settings file\" : \"Missing\";\n\tif (credentials?.accessKeyId && credentials.secretAccessKey) return \"Settings file\";\n\treturn \"Missing\";\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { 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\tctx: ExtensionCommandContext,\n\traw: Record<string, unknown>,\n\ttargets: Record<string, unknown>,\n\tactive: string | undefined,\n\tsignal?: AbortSignal,\n) {\n\tlet selectedName: string | undefined;\n\tconst nameById = new Map<string, string>();\n\tconst profiles = ownRecord(raw.storageConnections);\n\tconst menu = defineMenu<undefined, \"setups\", \"select\", ExtensionCommandContext>({\n\t\tstart: \"setups\",\n\t\tscreens: {\n\t\t\tsetups: () => ({\n\t\t\t\tkind: \"actions\",\n\t\t\t\ttitle: \"Switch sync setup\",\n\t\t\t\tlines: [`Current sync setup: ${safeTerminalText(active ?? \"none\")}`],\n\t\t\t\titems: Object.keys(targets)\n\t\t\t\t\t.sort((left, right) => left.localeCompare(right))\n\t\t\t\t\t.map((candidate, index) => {\n\t\t\t\t\t\tconst target = ownRecord(targets[candidate]);\n\t\t\t\t\t\tconst storage = ownRecord(target?.storage);\n\t\t\t\t\t\tconst profileName =\n\t\t\t\t\t\t\ttypeof storage?.connection === \"string\" ? storage.connection : undefined;\n\t\t\t\t\t\tconst profile = profileName && profiles ? ownRecord(profiles[profileName]) : undefined;\n\t\t\t\t\t\tconst location = profile\n\t\t\t\t\t\t\t? profile.type === \"git\"\n\t\t\t\t\t\t\t\t? `${String(storage?.branch ?? \"missing branch\")}:${String(storage?.path ?? \"missing path\")}`\n\t\t\t\t\t\t\t\t: profile.type === \"s3\"\n\t\t\t\t\t\t\t\t\t? `${String(storage?.bucket ?? \"missing bucket\")}/${String(storage?.path ?? \"missing path\")}`\n\t\t\t\t\t\t\t\t\t: String(storage?.path ?? \"missing path\")\n\t\t\t\t\t\t\t: `invalid: missing connection ${profileName ?? \"reference\"}`;\n\t\t\t\t\t\tconst id = `setup:${index}`;\n\t\t\t\t\t\tnameById.set(id, candidate);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\tlabel: `${safeTerminalText(candidate)}${candidate === active ? \" (current)\" : \"\"}`,\n\t\t\t\t\t\t\tdescription: `${safeTerminalText(profileName ?? \"unknown\")} \u00B7 ${safeTerminalText(location)}`,\n\t\t\t\t\t\t\taction: \"select\" as const,\n\t\t\t\t\t\t};\n\t\t\t\t\t}),\n\t\t\t\thint: \"close\",\n\t\t\t}),\n\t\t},\n\t\tactions: {\n\t\t\tselect: async ({ itemId }) => {\n\t\t\t\tselectedName = nameById.get(itemId);\n\t\t\t\treturn { kind: \"close\" };\n\t\t\t},\n\t\t},\n\t});\n\tawait runMenu(ctx, menu, {\n\t\tgetState: () => undefined,\n\t\tsignal,\n\t\tisCurrent: () => !signal?.aborted,\n\t});\n\treturn selectedName;\n}\n\nexport async function showSetupSwitcher(\n\tctx: ExtensionCommandContext,\n\trunRoute: RunRoute,\n\tselectedName?: string,\n\tsignal?: AbortSignal,\n) {\n\tconst raw = await readLocalConfigObject();\n\tif (signal?.aborted) return false;\n\tif (raw?.version !== 3) {\n\t\tctx.ui.notify(\"Add a second sync setup before switching setups.\", \"info\");\n\t\treturn false;\n\t}\n\tconst targets = ownRecord(raw.syncSetups);\n\tif (!targets) {\n\t\tctx.ui.notify(\"No sync setups are configured.\", \"warning\");\n\t\treturn false;\n\t}\n\tconst active = typeof raw.activeSyncSetup === \"string\" ? raw.activeSyncSetup : undefined;\n\tlet name = selectedName;\n\tif (!name) {\n\t\tname = await selectSetupForSwitch(ctx, raw, targets, active, signal);\n\t\tif (!name) return false;\n\t}\n\tif (!name || !Object.hasOwn(targets, name)) {\n\t\tctx.ui.notify(\n\t\t\t`Sync setup \u201C${safeTerminalText(name ?? \"unknown\")}\u201D no longer exists.`,\n\t\t\t\"warning\",\n\t\t);\n\t\treturn false;\n\t}\n\tif (name === active) {\n\t\tctx.ui.notify(`Sync setup \u201C${safeTerminalText(name)}\u201D is already current.`, \"info\");\n\t\treturn false;\n\t}\n\tlet config: AnySyncConfig;\n\ttry {\n\t\tconfig = await loadConfig(name);\n\t\tif (signal?.aborted) return false;\n\t} catch (error) {\n\t\tctx.ui.notify(\n\t\t\t`Cannot use sync setup \u201C${safeTerminalText(name)}\u201D: ${safeTerminalText(errorMessage(error))}`,\n\t\t\t\"error\",\n\t\t);\n\t\treturn false;\n\t}\n\tconst onSwitch = await loadOnSwitch();\n\tif (signal?.aborted) return false;\n\tconst switchEffect =\n\t\tonSwitch === \"ask-before-pull\"\n\t\t\t? \"After switching, pi-sync will ask whether to review a pull for this setup.\"\n\t\t\t: onSwitch === \"pull-after-switch\"\n\t\t\t\t? \"After switching, pi-sync will check this setup and show exact changes before applying them.\"\n\t\t\t\t: \"After switching, pi-sync will not pull or modify synced files.\";\n\tconst confirmed = await ctx.ui.confirm(\n\t\t\"Switch sync setup?\",\n\t\t[\n\t\t\t`From: ${safeTerminalText(active ?? \"none\")}`,\n\t\t\t`To: ${safeTerminalText(name)}`,\n\t\t\t`Storage: ${backendStorageDescription(config)}`,\n\t\t\t`Included content: ${config.include.length} paths`,\n\t\t\t`Automatic sync: ${automaticSyncSummary(config.automatic)} \u00B7 Sessions: ${config.include.includes(\"sessions\") ? \"On\" : \"Off\"}`,\n\t\t\t\"\",\n\t\t\tswitchEffect,\n\t\t].join(\"\\n\"),\n\t\t{ signal },\n\t);\n\tif (signal?.aborted || !confirmed) return false;\n\ttry {\n\t\tlet pullClosed = false;\n\t\tconst result = await useSyncSetup(\n\t\t\tctx,\n\t\t\tname,\n\t\t\tasync (selectedTarget) => {\n\t\t\t\tconst pullResult = await runCancellableOperation(\n\t\t\t\t\tctx,\n\t\t\t\t\t`Pulling sync setup \u201C${safeTerminalText(name)}\u201D\u2026`,\n\t\t\t\t\t\"pull\",\n\t\t\t\t\trunRoute,\n\t\t\t\t\t{\n\t\t\t\t\t\tcommitAware: true,\n\t\t\t\t\t\tcancelledMessage: null,\n\t\t\t\t\t\ttarget: selectedTarget,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst disposition = await dispatchManagerResult(ctx, pullResult, \"pull\", runRoute, signal);\n\t\t\t\tif (pullResult.kind === \"closed\" || pullResult.kind.endsWith(\"required\")) {\n\t\t\t\t\tpullClosed = disposition.kind === \"close\";\n\t\t\t\t}\n\t\t\t\tif (disposition.appliedRoute === \"pull\") return \"applied\";\n\t\t\t\tif (pullResult.kind === \"completed\") return pullResult.outcome;\n\t\t\t\treturn pullResult.kind === \"cancelled\" ? \"cancelled\" : undefined;\n\t\t\t},\n\t\t\tonSwitch,\n\t\t\tsignal,\n\t\t\tsyncConfigReviewIdentity(config),\n\t\t);\n\t\tif (pullClosed) return \"closed\";\n\t\treturn result.pullApplied ? \"pull-attempted\" : \"switched\";\n\t} catch (error) {\n\t\tif (signal?.aborted) return false;\n\t\tctx.ui.notify(\n\t\t\t`Sync setup \u201C${safeTerminalText(name)}\u201D was not switched: ${safeTerminalText(errorMessage(error))}`,\n\t\t\t\"error\",\n\t\t);\n\t\treturn false;\n\t}\n}\n", "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(\n\tctx: ExtensionCommandContext,\n\trunRoute: RunRoute,\n\tsignal?: AbortSignal,\n) {\n\treturn showSyncSetups(\n\t\tctx,\n\t\t{\n\t\t\tadd: async (setupSignal) => {\n\t\t\t\tawait showAddTarget(ctx, setupSignal);\n\t\t\t},\n\t\t\tedit: async (name, setupSignal) => {\n\t\t\t\tawait showEditTarget(ctx, name, setupSignal);\n\t\t\t},\n\t\t\tmakeCurrent: async (name, setupSignal) => {\n\t\t\t\tconst result = await showSetupSwitcher(ctx, runRoute, name, setupSignal);\n\t\t\t\treturn result === \"pull-attempted\" || result === \"closed\" ? \"exit\" : undefined;\n\t\t\t},\n\t\t\tremove: async (name, setupSignal) => {\n\t\t\t\tawait showRemoveTarget(ctx, name, setupSignal);\n\t\t\t},\n\t\t},\n\t\tsignal,\n\t);\n}\n\nasync function showAddTarget(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n\tlet raw = await readLocalConfigObject();\n\tif (signal?.aborted) return;\n\tif (!raw) return void ctx.ui.notify(\"Set up the first sync setup before adding another.\", \"info\");\n\tif (raw.version !== 3) {\n\t\tctx.ui.notify(\n\t\t\t\"Version 1 and version 2 settings are unsupported and are never migrated.\",\n\t\t\t\"error\",\n\t\t);\n\t\treturn;\n\t}\n\tlet profiles = ownRecord(raw.storageConnections) ?? {};\n\tconst name = await promptResourceName(ctx, \"sync setup\", \"work\", signal);\n\tif (!name) return;\n\tconst createConnection = \"Add a new storage connection\u2026\";\n\tlet profile = await ctx.ui.select(\n\t\t\"Choose a storage connection\\n\\nReuse a server address and sign-in details. A new connection is saved separately and remains if you cancel this setup.\",\n\t\t[...Object.keys(profiles).sort(), createConnection, \"Cancel\"],\n\t\t{ signal },\n\t);\n\tif (signal?.aborted || !profile || profile === \"Cancel\") return;\n\tif (profile === createConnection) {\n\t\tconst previousNames = new Set(Object.keys(profiles));\n\t\tif (!(await showAddStorageConnection(ctx, signal))) return;\n\t\tif (signal?.aborted) return;\n\t\traw = (await readLocalConfigObject()) ?? raw;\n\t\tif (signal?.aborted) return;\n\t\tprofiles = ownRecord(raw.storageConnections) ?? {};\n\t\tprofile = Object.keys(profiles).find((candidate) => !previousNames.has(candidate));\n\t\tif (!profile) return;\n\t\tctx.ui.notify(\n\t\t\t`Connection \u201C${safeTerminalText(profile)}\u201D saved. Cancelling setup will keep this connection.`,\n\t\t\t\"info\",\n\t\t);\n\t}\n\tconst storageKind = ownRecord(profiles[profile])?.type;\n\tif (storageKind === \"webdav\") {\n\t\tconst saved = await showAddWebDavTarget(ctx, name, profile, signal);\n\t\tif (signal?.aborted) return;\n\t\tif (saved) await refreshTargetCompletions();\n\t\treturn;\n\t}\n\tif (storageKind === \"git\") {\n\t\tconst saved = await showAddGitTarget(ctx, name, profile, signal);\n\t\tif (signal?.aborted) return;\n\t\tif (saved) await refreshTargetCompletions();\n\t\treturn;\n\t}\n\tawait showAddS3Target(ctx, raw, profile, name, signal);\n}\n\nasync function showEditTarget(ctx: ExtensionCommandContext, name: string, signal?: AbortSignal) {\n\tconst partial = await loadPartialConfig(name);\n\tif (signal?.aborted) return;\n\tif (!partial.setupName) {\n\t\tctx.ui.notify(\"Create version 3 settings before editing a named sync setup.\", \"info\");\n\t\treturn;\n\t}\n\tif (partial.storageKind === \"webdav\") {\n\t\tawait showEditWebDavTarget(ctx, partial, signal);\n\t\treturn;\n\t}\n\tif (partial.storageKind === \"git\") {\n\t\tawait showEditGitTarget(ctx, partial, signal);\n\t\treturn;\n\t}\n\tawait showEditS3Target(ctx, partial, signal);\n}\n\nasync function showRemoveTarget(ctx: ExtensionCommandContext, name: string, signal?: AbortSignal) {\n\tconst confirmed = await ctx.ui.confirm(\n\t\t\"Remove sync setup?\",\n\t\t`Remove local sync setup \u201C${safeTerminalText(name)}\u201D? Remote data and history are not deleted.`,\n\t\t{ signal },\n\t);\n\tif (signal?.aborted || !confirmed) return;\n\tawait removeSyncSetup(name, signal);\n\tif (signal?.aborted) return;\n\tawait refreshTargetCompletions();\n\tif (signal?.aborted) return;\n\tctx.ui.notify(\n\t\t`Removed sync setup \u201C${safeTerminalText(name)}\u201D; remote data was not deleted.`,\n\t\t\"info\",\n\t);\n}\n"],
5
- "mappings": "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",
6
- "names": ["defineMenu", "runMenu", "defineMenu", "runMenu", "defineMenu", "runMenu", "defineMenu", "runMenu", "defineMenu", "runMenu", "defineMenu", "runMenu", "defineMenu", "runMenu", "defineMenu", "runMenu"]
7
- }
@@ -1,21 +0,0 @@
1
- // @generated by scripts/build-runtime.mjs; do not edit.
2
- // @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
3
- import {
4
- showRemoteSelectionReview
5
- } from "./chunk-4CHTZMEO.ts";
6
- import "./chunk-HUDQATCL.ts";
7
- import "./chunk-T2B5IU74.ts";
8
- import "./chunk-LTBWGSBV.ts";
9
- import "./chunk-LCRI3ABW.ts";
10
- import "./chunk-C7XY5NF5.ts";
11
- import "./chunk-6LP3MCR2.ts";
12
- import "./chunk-TEN2ZBJV.ts";
13
- import "./chunk-2B2ELUF5.ts";
14
- import "./chunk-OEX4ABY6.ts";
15
- import "./chunk-THMF4BVL.ts";
16
- import "./chunk-T3HH3UEJ.ts";
17
- import "./chunk-JAAKLL6M.ts";
18
- export {
19
- showRemoteSelectionReview
20
- };
21
- //# sourceMappingURL=remote-selection-ui-D7RBRJNL.ts.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/backends/s3/s3-backend.ts", "../../src/backends/s3/s3-client.ts"],
4
- "sourcesContent": ["import { createHash } from \"node:crypto\";\nimport { encodeKey, posixJoin } from \"../../paths.js\";\nimport { sessionTokenWarnings } from \"../../settings/config.js\";\nimport { decodeSnapshot, encodeSnapshot } from \"../../snapshot/snapshot-codec.js\";\nimport type { Snapshot } from \"../../snapshot/snapshot-types.js\";\nimport { syncErrorGuidance } from \"../../sync/sync-error-guidance.js\";\nimport { portableSnapshotSelection } from \"../../sync/sync-policy.js\";\nimport type { LatestPointer, RemoteObject, ResolvedS3Backend } from \"../backend-types.js\";\nimport {\n\ttype BackendDiagnostic,\n\ttype ExpectedRemoteHead,\n\ttype PublishSnapshotOptions,\n\ttype PublishSnapshotResult,\n\ttype RemoteHead,\n\ttype RemoteHistoryEntry,\n\ttype SyncBackend,\n\tSyncBackendConflictError,\n\tSyncBackendPublicationOutcomeUnknownError,\n} from \"../sync-backend.js\";\nimport { S3Client, S3ObjectAlreadyExistsError } from \"./s3-client.js\";\n\nconst VERSION = 1;\nconst POST_COMMIT_TIMEOUT_MS = 30_000;\n\nexport class S3SyncBackend implements SyncBackend {\n\treadonly identity: string;\n\treadonly destination: string;\n\treadonly capability = \"read-check-write-verify\" as const;\n\tprivate readonly checksums = new Map<string, string>();\n\n\tconstructor(\n\t\tprivate readonly config: ResolvedS3Backend,\n\t\tprivate readonly postCommitTimeoutMs = POST_COMMIT_TIMEOUT_MS,\n\t) {\n\t\tassertSafeDestination(config);\n\t\tthis.identity = s3BackendIdentity(config);\n\t\tthis.destination = s3Destination(config);\n\t}\n\n\tsameRevision(left: string, right: string) {\n\t\treturn left === right;\n\t}\n\n\tasync readHead(signal?: AbortSignal): Promise<RemoteHead | undefined> {\n\t\tconst object = await new S3Client(this.config, signal).getJson<LatestPointer>(\n\t\t\tlatestKey(this.config),\n\t\t);\n\t\tthrowIfAborted(signal);\n\t\tif (object.missing) return undefined;\n\t\tconst pointer = requirePointer(\n\t\t\tobject.value,\n\t\t\t\"Remote latest pointer is malformed.\",\n\t\t\tthis.config.destination.namespace,\n\t\t);\n\t\tthis.registerChecksum(pointer.snapshot, pointer.sha256);\n\t\treturn remoteHead(pointer, this.identity, object.etag);\n\t}\n\n\tasync readSnapshot(reference: string, signal?: AbortSignal): Promise<Snapshot> {\n\t\tconst expectedChecksum =\n\t\t\tthis.checksums.get(reference) ?? (await this.resolveChecksum(reference, signal));\n\t\tconst object = await new S3Client(this.config, signal).getBuffer(\n\t\t\tsnapshotKey(this.config, reference),\n\t\t);\n\t\tthrowIfAborted(signal);\n\t\tif (!object.value) throw new Error(`Snapshot not found: ${reference}`);\n\t\tif (expectedChecksum && sha256(object.value) !== expectedChecksum) {\n\t\t\tthrow new Error(\"Remote snapshot checksum mismatch.\");\n\t\t}\n\t\tconst snapshot = await decodeSnapshot(object.value, { signal });\n\t\tif (snapshot.id !== reference || snapshot.profile !== this.config.destination.namespace) {\n\t\t\tthrow new Error(\"Remote snapshot identity mismatch.\");\n\t\t}\n\t\tvalidateSnapshotBundle(snapshot);\n\t\treturn snapshot;\n\t}\n\n\tasync publishSnapshot(\n\t\tsnapshot: Snapshot,\n\t\texpected: ExpectedRemoteHead,\n\t\toptions: PublishSnapshotOptions = {},\n\t): Promise<PublishSnapshotResult> {\n\t\tthrowIfAborted(options.signal);\n\t\tassertSnapshotIdentity(snapshot, this.config.destination.namespace);\n\t\tconst stagedKey = snapshotKey(this.config, snapshot.id);\n\t\tconst encoded = await encodeSnapshot(snapshot);\n\t\tthrowIfAborted(options.signal);\n\t\tconst pointer = pointerFor(this.config, snapshot, sha256(encoded));\n\t\tconst cancellableClient = new S3Client(this.config, options.signal);\n\t\ttry {\n\t\t\tawait cancellableClient.putBuffer(stagedKey, encoded, \"application/gzip\", {\n\t\t\t\tifAbsent: true,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof S3ObjectAlreadyExistsError)) throw error;\n\t\t\tconst existing = await cancellableClient.getBuffer(stagedKey);\n\t\t\tif (!existing.value || sha256(existing.value) !== pointer.sha256) {\n\t\t\t\tthrow new SyncBackendConflictError(\n\t\t\t\t\t`Immutable snapshot id already exists with different content: ${snapshot.id}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst currentObject = await cancellableClient.getJson<LatestPointer>(latestKey(this.config));\n\t\tthrowIfAborted(options.signal);\n\t\tlet current: RemoteHead | undefined;\n\t\tif (!currentObject.missing) {\n\t\t\tconst currentPointer = requirePointer(\n\t\t\t\tcurrentObject.value,\n\t\t\t\t\"Remote latest pointer is malformed.\",\n\t\t\t\tthis.config.destination.namespace,\n\t\t\t);\n\t\t\tthis.registerChecksum(currentPointer.snapshot, currentPointer.sha256);\n\t\t\tcurrent = remoteHead(currentPointer, this.identity, currentObject.etag);\n\t\t}\n\t\tif (!matchesExpected(current, expected)) {\n\t\t\tthrow new SyncBackendConflictError(\n\t\t\t\t\"Remote changed while pushing. Run /sync pull first, then retry.\",\n\t\t\t\t{ currentHead: current },\n\t\t\t);\n\t\t}\n\t\tthrowIfAborted(options.signal);\n\t\toptions.onCommit?.();\n\n\t\t// The active-head PUT is the publication boundary. Do not bind it or its\n\t\t// verification to a user-cancellation signal after the boundary begins.\n\t\tconst commitClient = new S3Client(this.config, AbortSignal.timeout(this.postCommitTimeoutMs));\n\t\ttry {\n\t\t\tawait commitClient.putJson(latestKey(this.config), pointer);\n\t\t} catch (error) {\n\t\t\tthrow new SyncBackendPublicationOutcomeUnknownError(\n\t\t\t\t`Remote publication outcome is unknown: ${errorMessage(error)}`,\n\t\t\t\t{ cause: error },\n\t\t\t);\n\t\t}\n\n\t\tlet verifiedObject: RemoteObject<LatestPointer>;\n\t\ttry {\n\t\t\tverifiedObject = await commitClient.getJson<LatestPointer>(latestKey(this.config));\n\t\t} catch (error) {\n\t\t\tthrow new SyncBackendPublicationOutcomeUnknownError(\n\t\t\t\t`Remote snapshot may be active, but publication could not be verified: ${errorMessage(error)}`,\n\t\t\t\t{ cause: error },\n\t\t\t);\n\t\t}\n\t\tlet verifiedPointer: LatestPointer;\n\t\ttry {\n\t\t\tverifiedPointer = requirePointer(\n\t\t\t\tverifiedObject.value,\n\t\t\t\t\"Remote latest pointer is malformed after publication.\",\n\t\t\t\tthis.config.destination.namespace,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tthrow new SyncBackendPublicationOutcomeUnknownError(\n\t\t\t\t`Remote snapshot may be active, but publication verification was malformed: ${errorMessage(error)}`,\n\t\t\t\t{ cause: error },\n\t\t\t);\n\t\t}\n\t\tif (!samePointer(verifiedPointer, pointer)) {\n\t\t\tthrow new SyncBackendConflictError(\n\t\t\t\t\"Remote latest changed immediately after push. Run /sync status before continuing.\",\n\t\t\t\t{\n\t\t\t\t\tphase: \"after-commit\",\n\t\t\t\t\tcurrentHead: remoteHead(verifiedPointer, this.identity, verifiedObject.etag),\n\t\t\t\t\tcandidateMayHaveBeenActive: true,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\tthis.registerChecksum(verifiedPointer.snapshot, verifiedPointer.sha256);\n\t\tconst head = remoteHead(verifiedPointer, this.identity, verifiedObject.etag);\n\t\tconst warning = await this.updateHistorySafely(commitClient, pointer);\n\t\treturn { head, warnings: warning ? [warning] : [] };\n\t}\n\n\tasync listHistory(signal?: AbortSignal): Promise<RemoteHistoryEntry[]> {\n\t\tconst object = await new S3Client(this.config, signal).getJson<{\n\t\t\tversion: number;\n\t\t\tsnapshots: LatestPointer[];\n\t\t}>(historyKey(this.config));\n\t\tthrowIfAborted(signal);\n\t\tif (object.missing) return [];\n\t\tconst pointers = requireHistory(object.value, this.config.destination.namespace);\n\t\tfor (const pointer of pointers) {\n\t\t\tconst known = this.checksums.get(pointer.snapshot);\n\t\t\tif (known && known !== pointer.sha256) {\n\t\t\t\tthrow new Error(\"Remote history conflicts with an already observed snapshot checksum.\");\n\t\t\t}\n\t\t}\n\t\tfor (const pointer of pointers) this.registerChecksum(pointer.snapshot, pointer.sha256);\n\t\treturn pointers.map(remoteHistoryEntry);\n\t}\n\n\tasync diagnose(signal?: AbortSignal): Promise<BackendDiagnostic[]> {\n\t\tthrowIfAborted(signal);\n\t\tconst diagnostics: BackendDiagnostic[] = [\n\t\t\t{\n\t\t\t\tkey: \"s3-config\",\n\t\t\t\tlevel: \"info\",\n\t\t\t\tmessage: `s3 config: ok (${this.config.destination.bucket}/${storageRoot(this.config)})`,\n\t\t\t},\n\t\t\t...sessionTokenWarnings(this.config.profile).map((message) => ({\n\t\t\t\tkey: \"s3-session-token\",\n\t\t\t\tlevel: \"warning\" as const,\n\t\t\t\tmessage,\n\t\t\t})),\n\t\t];\n\t\tconst deadline = AbortSignal.timeout(10_000);\n\t\tconst probeSignal = signal ? AbortSignal.any([signal, deadline]) : deadline;\n\t\ttry {\n\t\t\tconst result = await new S3Client(this.config, probeSignal).diagnoseRead(\n\t\t\t\tlatestKey(this.config),\n\t\t\t);\n\t\t\tthrowIfAborted(probeSignal);\n\t\t\tconst messages = {\n\t\t\t\treadable:\n\t\t\t\t\t\"s3 remote read: HTTP success. Snapshot contents and write access are not tested.\",\n\t\t\t\t\"missing-key\":\n\t\t\t\t\t\"s3 remote read: no snapshot at this path (NoSuchKey). Write access is not tested; verify the bucket and path before first sync.\",\n\t\t\t\t\"missing-bucket\":\n\t\t\t\t\t\"s3 remote read: bucket not found (NoSuchBucket). Create the bucket with your provider or edit the setup's bucket name.\",\n\t\t\t\t\"unknown-404\":\n\t\t\t\t\t\"s3 remote read: HTTP 404; cannot confirm whether the bucket or snapshot is missing. Verify the endpoint, bucket, and path with your provider. Write access is not tested.\",\n\t\t\t};\n\t\t\tdiagnostics.push({\n\t\t\t\tkey: \"s3-read\",\n\t\t\t\tlevel: result === \"readable\" ? \"info\" : \"warning\",\n\t\t\t\tmessage: messages[result],\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthrowIfAborted(signal);\n\t\t\tdiagnostics.push({\n\t\t\t\tkey: \"s3-read\",\n\t\t\t\tlevel: \"warning\",\n\t\t\t\tmessage: syncErrorGuidance(\n\t\t\t\t\tdeadline.aborted ? new Error(\"S3 diagnostic request timed out.\") : error,\n\t\t\t\t),\n\t\t\t});\n\t\t}\n\t\treturn diagnostics;\n\t}\n\n\tprivate async resolveChecksum(reference: string, signal?: AbortSignal) {\n\t\tawait this.readHead(signal);\n\t\tconst headChecksum = this.checksums.get(reference);\n\t\tif (headChecksum) return headChecksum;\n\t\tawait this.listHistory(signal);\n\t\treturn this.checksums.get(reference);\n\t}\n\n\tprivate registerChecksum(reference: string, checksum: string) {\n\t\tconst known = this.checksums.get(reference);\n\t\tif (known && known !== checksum) {\n\t\t\tthrow new Error(\"Remote snapshot reference was rebound to a different checksum.\");\n\t\t}\n\t\tthis.checksums.set(reference, checksum);\n\t}\n\n\tprivate async updateHistorySafely(client: S3Client, pointer: LatestPointer) {\n\t\ttry {\n\t\t\tawait this.updateHistory(client, pointer);\n\t\t\treturn undefined;\n\t\t} catch (error) {\n\t\t\treturn `Remote snapshot is active, but history could not be updated: ${errorMessage(error)}. Run /sync doctor before relying on history.`;\n\t\t}\n\t}\n\n\tprivate async updateHistory(client: S3Client, pointer: LatestPointer) {\n\t\tconst object = await client.getJson<{ version: number; snapshots: LatestPointer[] }>(\n\t\t\thistoryKey(this.config),\n\t\t);\n\t\tconst snapshots = object.missing\n\t\t\t? []\n\t\t\t: requireHistory(object.value, this.config.destination.namespace);\n\t\tconst next = [\n\t\t\t...snapshots.filter((snapshot) => snapshot.snapshot !== pointer.snapshot),\n\t\t\tpointer,\n\t\t].slice(-100);\n\t\tawait client.putJson(historyKey(this.config), { version: VERSION, snapshots: next });\n\t}\n}\n\nexport function latestKey(config: ResolvedS3Backend) {\n\treturn posixJoin(storageRoot(config), \"latest.json\");\n}\n\nexport function historyKey(config: ResolvedS3Backend) {\n\treturn posixJoin(storageRoot(config), \"history.json\");\n}\n\nexport function snapshotKey(config: ResolvedS3Backend, id: string) {\n\trequireSnapshotReference(id);\n\treturn posixJoin(storageRoot(config), \"snapshots\", `${id}.json.gz`);\n}\n\nexport function storageRoot(config: ResolvedS3Backend) {\n\treturn config.destination.prefix === \"./\" ? \"\" : config.destination.prefix;\n}\n\nexport function pointerFor(\n\tconfig: ResolvedS3Backend,\n\tsnapshot: Snapshot,\n\tchecksum: string,\n): LatestPointer {\n\treturn {\n\t\tversion: VERSION,\n\t\tprofile: config.destination.namespace,\n\t\tsnapshot: snapshot.id,\n\t\tsha256: checksum,\n\t\tcreatedAt: snapshot.createdAt,\n\t\tmachine: snapshot.machine,\n\t\tsyncSessions:\n\t\t\tsnapshot.syncSessions === true ||\n\t\t\tsnapshot.files.some((file) => file.path.startsWith(\"sessions/\")),\n\t\t...(snapshot.selection === undefined ? {} : { selection: snapshot.selection }),\n\t};\n}\n\nexport function s3BackendIdentity(config: ResolvedS3Backend) {\n\tconst destination = JSON.stringify([\n\t\tsecretFreeEndpoint(config.profile.endpoint),\n\t\ttrimSlashes(config.destination.bucket),\n\t\ttrimSlashes(config.destination.prefix),\n\t]);\n\treturn `s3:${sha256(Buffer.from(destination))}`;\n}\n\nfunction s3Destination(config: ResolvedS3Backend) {\n\tlet host = secretFreeEndpoint(config.profile.endpoint);\n\ttry {\n\t\thost = new URL(host).hostname;\n\t} catch {\n\t\thost = \"invalid S3 endpoint\";\n\t}\n\treturn `${host} \u00B7 ${config.destination.bucket}/${storageRoot(config)}`;\n}\n\nfunction secretFreeEndpoint(value: string) {\n\tconst normalized = value.trim();\n\ttry {\n\t\tconst url = new URL(normalized);\n\t\turl.username = \"\";\n\t\turl.password = \"\";\n\t\treturn url.toString();\n\t} catch {\n\t\treturn normalized.replace(/\\/\\/[^/@\\s]+@/u, \"//\");\n\t}\n}\n\nfunction trimSlashes(value: string) {\n\treturn value.replace(/^\\/+|\\/+$/g, \"\");\n}\n\nfunction remoteHistoryEntry(pointer: LatestPointer): RemoteHistoryEntry {\n\treturn {\n\t\tsnapshotRef: pointer.snapshot,\n\t\tsnapshotId: pointer.snapshot,\n\t\tcreatedAt: pointer.createdAt,\n\t\tmachine: pointer.machine,\n\t\tsyncSessions: pointer.syncSessions === true,\n\t};\n}\n\nfunction remoteHead(pointer: LatestPointer, identity: string, etag?: string): RemoteHead {\n\treturn {\n\t\tsnapshotRef: pointer.snapshot,\n\t\tsnapshotId: pointer.snapshot,\n\t\trevision: `s3:${sha256(Buffer.from(canonicalJson([identity, etag ?? null, pointer])))}`,\n\t\tcreatedAt: pointer.createdAt,\n\t\tmachine: pointer.machine,\n\t\tsyncSessions: pointer.syncSessions === true,\n\t\t...(pointer.selection === undefined ? {} : { selection: pointer.selection }),\n\t};\n}\n\nfunction samePointer(left: LatestPointer, right: LatestPointer) {\n\treturn canonicalJson(left) === canonicalJson(right);\n}\n\nfunction canonicalJson(value: unknown) {\n\treturn JSON.stringify(canonicalValue(value));\n}\n\nfunction canonicalValue(value: unknown): unknown {\n\tif (Array.isArray(value)) return value.map(canonicalValue);\n\tif (!value || typeof value !== \"object\") return value;\n\treturn Object.fromEntries(\n\t\tObject.keys(value)\n\t\t\t.sort()\n\t\t\t.map((key) => [key, canonicalValue((value as Record<string, unknown>)[key])]),\n\t);\n}\n\nfunction matchesExpected(head: RemoteHead | undefined, expected: ExpectedRemoteHead) {\n\tif (expected.kind === \"missing\") return head === undefined;\n\treturn head?.revision === expected.revision;\n}\n\nfunction requirePointer(\n\tvalue: LatestPointer | undefined,\n\tmessage: string,\n\texpectedProfile: string,\n) {\n\tif (\n\t\t!value ||\n\t\tvalue.version !== VERSION ||\n\t\tvalue.profile !== expectedProfile ||\n\t\ttypeof value.snapshot !== \"string\" ||\n\t\t!isSafeSnapshotReference(value.snapshot) ||\n\t\ttypeof value.sha256 !== \"string\" ||\n\t\t!/^[0-9a-f]{64}$/.test(value.sha256) ||\n\t\ttypeof value.createdAt !== \"string\" ||\n\t\t!isSafeMetadata(value.createdAt, 64) ||\n\t\ttypeof value.machine !== \"string\" ||\n\t\t!isSafeMetadata(value.machine, 256) ||\n\t\t(value.syncSessions !== undefined && typeof value.syncSessions !== \"boolean\")\n\t) {\n\t\tthrow new Error(message);\n\t}\n\tif (value.selection !== undefined) portableSnapshotSelection(value.selection);\n\treturn value;\n}\n\nfunction requireHistory(\n\tvalue: { version: number; snapshots: LatestPointer[] } | undefined,\n\texpectedProfile: string,\n) {\n\tif (!value || value.version !== VERSION || !Array.isArray(value.snapshots)) {\n\t\tthrow new Error(\"Remote history is malformed.\");\n\t}\n\tconst pointers = value.snapshots.map((pointer) =>\n\t\trequirePointer(pointer, \"Remote history entry is malformed.\", expectedProfile),\n\t);\n\tconst references = new Set<string>();\n\tfor (const pointer of pointers) {\n\t\tif (references.has(pointer.snapshot)) {\n\t\t\tthrow new Error(\"Remote history contains duplicate snapshot references.\");\n\t\t}\n\t\treferences.add(pointer.snapshot);\n\t}\n\treturn pointers;\n}\n\nfunction assertSnapshotIdentity(snapshot: Snapshot, expectedProfile: string) {\n\tif (\n\t\tsnapshot.version !== VERSION ||\n\t\tsnapshot.profile !== expectedProfile ||\n\t\t!isSafeSnapshotReference(snapshot.id) ||\n\t\t!isSafeMetadata(snapshot.createdAt, 64) ||\n\t\t!isSafeMetadata(snapshot.machine, 256) ||\n\t\t!Array.isArray(snapshot.files)\n\t) {\n\t\tthrow new Error(\"Invalid snapshot identity for S3 publication.\");\n\t}\n}\n\nfunction validateSnapshotBundle(snapshot: Snapshot) {\n\tconst paths = new Set<string>();\n\tfor (const file of snapshot.files) {\n\t\tif (\n\t\t\t!file ||\n\t\t\ttypeof file.path !== \"string\" ||\n\t\t\ttypeof file.contentBase64 !== \"string\" ||\n\t\t\ttypeof file.sha256 !== \"string\" ||\n\t\t\t!/^[0-9a-f]{64}$/.test(file.sha256) ||\n\t\t\tpaths.has(file.path)\n\t\t) {\n\t\t\tthrow new Error(\"Remote snapshot bundle is malformed.\");\n\t\t}\n\t\tconst content = Buffer.from(file.contentBase64, \"base64\");\n\t\tif (content.toString(\"base64\") !== file.contentBase64 || sha256(content) !== file.sha256) {\n\t\t\tthrow new Error(\"Remote snapshot file checksum mismatch.\");\n\t\t}\n\t\tpaths.add(file.path);\n\t}\n}\n\nfunction assertSafeDestination(config: ResolvedS3Backend) {\n\tfor (const [label, value, allowEmpty] of [\n\t\t[\"bucket\", config.destination.bucket, false],\n\t\t[\"prefix\", config.destination.prefix, true],\n\t\t[\"namespace\", config.destination.namespace, false],\n\t] as const) {\n\t\tif (label === \"prefix\" && value === \"./\") continue;\n\t\tif (\n\t\t\t(!allowEmpty && value.length === 0) ||\n\t\t\tvalue.includes(\"\\\\\") ||\n\t\t\thasControlCharacter(value) ||\n\t\t\tvalue.split(\"/\").some((segment) => segment === \".\" || segment === \"..\")\n\t\t) {\n\t\t\tthrow new Error(`Invalid S3 storage location ${label}.`);\n\t\t}\n\t}\n}\n\nfunction requireSnapshotReference(reference: string) {\n\tif (!isSafeSnapshotReference(reference)) {\n\t\tthrow new Error(\"Invalid S3 snapshot reference.\");\n\t}\n}\n\nfunction isSafeSnapshotReference(reference: string) {\n\treturn (\n\t\treference.length > 0 &&\n\t\treference.length <= 512 &&\n\t\treference !== \".\" &&\n\t\treference !== \"..\" &&\n\t\t!reference.includes(\"/\") &&\n\t\t!reference.includes(\"\\\\\") &&\n\t\t!hasControlCharacter(reference)\n\t);\n}\n\nfunction isSafeMetadata(value: string, maxLength: number) {\n\treturn value.length > 0 && value.length <= maxLength && !hasControlCharacter(value);\n}\n\nfunction hasControlCharacter(value: string) {\n\treturn [...value].some((character) => {\n\t\tconst code = character.codePointAt(0) ?? 0;\n\t\treturn code < 0x20 || code === 0x7f;\n\t});\n}\n\nfunction throwIfAborted(signal?: AbortSignal) {\n\tif (!signal?.aborted) return;\n\tthrow signal.reason instanceof Error\n\t\t? signal.reason\n\t\t: new DOMException(\"The operation was aborted\", \"AbortError\");\n}\n\nfunction sha256(value: Buffer) {\n\treturn createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction errorMessage(error: unknown) {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nexport { encodeKey };\n", "import { createHash, createHmac } from \"node:crypto\";\nimport { setTimeout as sleep } from \"node:timers/promises\";\nimport { encodeKey, posixJoin } from \"../../paths.js\";\nimport type { RemoteObject, ResolvedS3Backend } from \"../backend-types.js\";\n\nconst MAX_JSON_RESPONSE_BYTES = 1024 * 1024;\nconst MAX_SNAPSHOT_RESPONSE_BYTES = 256 * 1024 * 1024;\nconst MAX_ERROR_RESPONSE_BYTES = 64 * 1024;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 30_000;\n\nfunction iso8601Basic(date: Date) {\n\treturn date.toISOString().replace(/[:-]|\\.\\d{3}/g, \"\");\n}\n\nfunction isCloudflareR2Endpoint(endpoint: string | undefined) {\n\tconst value = endpoint?.trim();\n\tif (!value) return false;\n\ttry {\n\t\tconst hostname = new URL(value).hostname.toLowerCase();\n\t\treturn (\n\t\t\thostname === \"r2.cloudflarestorage.com\" || hostname.endsWith(\".r2.cloudflarestorage.com\")\n\t\t);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport class S3ObjectAlreadyExistsError extends Error {\n\tconstructor(readonly key: string) {\n\t\tsuper(`S3 object already exists: ${key}`);\n\t\tthis.name = \"S3ObjectAlreadyExistsError\";\n\t}\n}\n\nexport class S3HttpError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\treadonly status: number,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"S3HttpError\";\n\t}\n}\n\nexport class S3Client {\n\tprivate config: ResolvedS3Backend;\n\tprivate endpoint: URL;\n\tprivate signal?: AbortSignal;\n\tprivate requestTimeoutMs: number;\n\tprivate omitSessionTokenAfterRejection = false;\n\n\tconstructor(\n\t\tconfig: ResolvedS3Backend,\n\t\tsignal?: AbortSignal,\n\t\trequestTimeoutMs = DEFAULT_REQUEST_TIMEOUT_MS,\n\t) {\n\t\tthis.config = config;\n\t\tthis.endpoint = new URL(config.profile.endpoint);\n\t\tthis.signal = signal;\n\t\tthis.requestTimeoutMs = requestTimeoutMs;\n\t}\n\n\t/** Read-only access probe. A bare 404 cannot distinguish a missing key from a missing bucket. */\n\tasync diagnoseRead(\n\t\tkey: string,\n\t): Promise<\"readable\" | \"missing-key\" | \"missing-bucket\" | \"unknown-404\"> {\n\t\tthis.signal?.throwIfAborted();\n\t\tconst response = await this.request(\"GET\", key);\n\t\tif (response.ok) {\n\t\t\tawait response.body?.cancel();\n\t\t\tthis.signal?.throwIfAborted();\n\t\t\treturn \"readable\";\n\t\t}\n\t\tconst detail = await this.readErrorText(response);\n\t\tthis.signal?.throwIfAborted();\n\t\tif (response.status === 404) {\n\t\t\tconst code = /<Code>\\s*([A-Za-z]+)\\s*<\\/Code>/u.exec(detail)?.[1];\n\t\t\tif (code === \"NoSuchBucket\") return \"missing-bucket\";\n\t\t\tif (code === \"NoSuchKey\") return \"missing-key\";\n\t\t\treturn \"unknown-404\";\n\t\t}\n\t\tthrow new S3HttpError(`S3 remote read failed (HTTP ${response.status}).`, response.status);\n\t}\n\n\tasync getJson<T>(key: string): Promise<RemoteObject<T>> {\n\t\tconst maxAttempts = 3;\n\t\tlet lastError: unknown;\n\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\t\tconst object = await this.request(\"GET\", key);\n\t\t\tif (object.status === 404) return { missing: true };\n\t\t\tif (!object.ok) {\n\t\t\t\tthrow new S3HttpError(\n\t\t\t\t\t`S3 GET failed (${object.status}): ${await this.readErrorText(object)}`,\n\t\t\t\t\tobject.status,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst body = await readBoundedText(object, MAX_JSON_RESPONSE_BYTES, \"S3 JSON response\");\n\t\t\t// R2 can intermittently return an empty 200 body (read-after-write\n\t\t\t// inconsistency on a long-lived keep-alive connection), which makes\n\t\t\t// response.json() throw \"JSON Parse error: Unexpected EOF\" under Bun.\n\t\t\t// Retry so the transient blip is absorbed instead of surfacing as a\n\t\t\t// \"pi-sync auto sync skipped\" warning on every session start.\n\t\t\tif (body.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tvalue: JSON.parse(body) as T,\n\t\t\t\t\tetag: normalizeEtag(object.headers.get(\"etag\")),\n\t\t\t\t\tmissing: false,\n\t\t\t\t};\n\t\t\t}\n\t\t\tlastError = new Error(`S3 GET returned an empty body for ${key}`);\n\t\t\tif (attempt < maxAttempts) {\n\t\t\t\tawait sleep(250 * attempt, undefined, { signal: this.signal });\n\t\t\t}\n\t\t}\n\t\tthrow lastError;\n\t}\n\n\tasync getBuffer(key: string): Promise<RemoteObject<Buffer>> {\n\t\tconst maxAttempts = 3;\n\t\tlet lastError: unknown;\n\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\t\tconst object = await this.request(\"GET\", key);\n\t\t\tif (object.status === 404) return { missing: true };\n\t\t\tif (!object.ok) {\n\t\t\t\tthrow new S3HttpError(\n\t\t\t\t\t`S3 GET failed (${object.status}): ${await this.readErrorText(object)}`,\n\t\t\t\t\tobject.status,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst buffer = await readBoundedBuffer(\n\t\t\t\tobject,\n\t\t\t\tMAX_SNAPSHOT_RESPONSE_BYTES,\n\t\t\t\t\"S3 snapshot response\",\n\t\t\t);\n\t\t\t// R2 can intermittently return an empty 200 body on a long-lived\n\t\t\t// keep-alive connection (same root cause as the getJson retry\n\t\t\t// above). getBuffer is only used for snapshot .json.gz payloads,\n\t\t\t// which are always non-empty, so an empty body is a transient\n\t\t\t// blip, not a legitimate response. Retry so the checksum guard\n\t\t\t// downstream doesn't surface it as \"Remote snapshot checksum\n\t\t\t// mismatch\".\n\t\t\tif (buffer.length > 0) {\n\t\t\t\treturn { value: buffer, etag: normalizeEtag(object.headers.get(\"etag\")), missing: false };\n\t\t\t}\n\t\t\tlastError = new Error(`S3 GET returned an empty body for ${key}`);\n\t\t\tif (attempt < maxAttempts) {\n\t\t\t\tawait sleep(250 * attempt, undefined, { signal: this.signal });\n\t\t\t}\n\t\t}\n\t\tthrow lastError;\n\t}\n\n\tasync putJson(key: string, value: unknown) {\n\t\tconst body = Buffer.from(JSON.stringify(value, null, \"\\t\"), \"utf8\");\n\t\tawait this.putBuffer(key, body, \"application/json\");\n\t}\n\n\tasync putBuffer(\n\t\tkey: string,\n\t\tbody: Buffer,\n\t\tcontentType: string,\n\t\toptions: { ifAbsent?: boolean } = {},\n\t) {\n\t\tconst headers: Record<string, string> = { \"content-type\": contentType };\n\t\tif (options.ifAbsent) headers[\"if-none-match\"] = \"*\";\n\t\tconst response = await this.request(\"PUT\", key, body, headers);\n\t\tif (options.ifAbsent && response.status === 412) {\n\t\t\tthrow new S3ObjectAlreadyExistsError(key);\n\t\t}\n\t\tif (!response.ok) {\n\t\t\tthrow new S3HttpError(\n\t\t\t\t`S3 PUT failed (${response.status}): ${await this.readErrorText(response)}`,\n\t\t\t\tresponse.status,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate async request(\n\t\tmethod: \"GET\" | \"PUT\",\n\t\tkey: string,\n\t\tbody?: Buffer,\n\t\textraHeaders: Record<string, string> = {},\n\t) {\n\t\tconst url = new URL(this.endpoint.toString());\n\t\turl.pathname = posixJoin(url.pathname, this.config.destination.bucket, encodeKey(key));\n\t\tconst send = async (sessionToken: string | undefined) => {\n\t\t\tconst transportSignal = this.transportSignal();\n\t\t\tconst headers = await signedHeaders({\n\t\t\t\tmethod,\n\t\t\t\turl,\n\t\t\t\tbody,\n\t\t\t\textraHeaders,\n\t\t\t\taccessKeyId: this.config.profile.accessKeyId,\n\t\t\t\tsecretAccessKey: this.config.profile.secretAccessKey,\n\t\t\t\tsessionToken,\n\t\t\t\tregion: this.config.profile.region,\n\t\t\t});\n\t\t\ttry {\n\t\t\t\treturn await fetch(url, {\n\t\t\t\t\tmethod,\n\t\t\t\t\theaders,\n\t\t\t\t\tbody: body ? new Uint8Array(body) : undefined,\n\t\t\t\t\tsignal: transportSignal,\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof Error && error.name === \"AbortError\") throw error;\n\t\t\t\tif (error instanceof Error && error.name === \"TimeoutError\") {\n\t\t\t\t\tthrow new Error(\"S3 request timed out.\", { cause: error });\n\t\t\t\t}\n\t\t\t\tthrow new Error(`S3 request failed: ${this.redact(errorMessage(error))}`, { cause: error });\n\t\t\t}\n\t\t};\n\t\tconst sessionToken = this.omitSessionTokenAfterRejection\n\t\t\t? undefined\n\t\t\t: this.config.profile.sessionToken;\n\t\tconst response = await send(sessionToken);\n\t\ttry {\n\t\t\tif (!(await this.shouldRetryWithoutSessionToken(response, sessionToken))) return response;\n\t\t} catch (error) {\n\t\t\tawait response.body?.cancel().catch(() => undefined);\n\t\t\tthrow error;\n\t\t}\n\t\tawait response.body?.cancel();\n\t\tconst retry = await send(undefined);\n\t\tif (retry.ok || retry.status === 404) this.omitSessionTokenAfterRejection = true;\n\t\treturn retry;\n\t}\n\n\tprivate transportSignal() {\n\t\tconst timeout = AbortSignal.timeout(this.requestTimeoutMs);\n\t\treturn this.signal ? AbortSignal.any([this.signal, timeout]) : timeout;\n\t}\n\n\tprivate async shouldRetryWithoutSessionToken(\n\t\tresponse: Response,\n\t\tsessionToken: string | undefined,\n\t) {\n\t\tif (\n\t\t\t!sessionToken ||\n\t\t\t!isCloudflareR2Endpoint(this.config.profile.endpoint) ||\n\t\t\tresponse.ok ||\n\t\t\tresponse.status !== 400\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\treturn isSecurityTokenInvalidArgument(\n\t\t\tawait readBoundedText(response.clone(), MAX_ERROR_RESPONSE_BYTES, \"S3 error response\"),\n\t\t);\n\t}\n\n\tprivate async readErrorText(response: Response) {\n\t\ttry {\n\t\t\treturn this.redact(\n\t\t\t\tawait readBoundedText(response, MAX_ERROR_RESPONSE_BYTES, \"S3 error response\"),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\treturn this.redact(errorMessage(error));\n\t\t}\n\t}\n\n\tprivate redact(value: string) {\n\t\tlet redacted = value;\n\t\tlet endpointUsername: string | undefined;\n\t\tlet endpointPassword: string | undefined;\n\t\tlet endpointQueryValues: string[] = [];\n\t\ttry {\n\t\t\tconst endpoint = new URL(this.config.profile.endpoint);\n\t\t\tendpointUsername = endpoint.username;\n\t\t\tendpointPassword = endpoint.password;\n\t\t\tendpointQueryValues = [...endpoint.searchParams.values()];\n\t\t} catch {\n\t\t\t// The constructor already validates normal runtime endpoints.\n\t\t}\n\t\tfor (const secret of [\n\t\t\tthis.config.profile.accessKeyId,\n\t\t\tthis.config.profile.secretAccessKey,\n\t\t\tthis.config.profile.sessionToken,\n\t\t\tendpointUsername,\n\t\t\tendpointPassword,\n\t\t\t...endpointQueryValues,\n\t\t]) {\n\t\t\tif (secret) redacted = redacted.replaceAll(secret, \"[REDACTED]\");\n\t\t}\n\t\treturn redacted;\n\t}\n}\n\nasync function readBoundedText(response: Response, limit: number, label: string) {\n\treturn (await readBoundedBuffer(response, limit, label)).toString(\"utf8\");\n}\n\nasync function readBoundedBuffer(response: Response, limit: number, label: string) {\n\tconst contentLength = Number(response.headers.get(\"content-length\"));\n\tif (Number.isFinite(contentLength) && contentLength > limit) {\n\t\t// Do not await cancellation of a cloned stream before its sibling can be released.\n\t\tvoid response.body?.cancel().catch(() => undefined);\n\t\tthrow new Error(`${label} exceeds the ${limit}-byte limit.`);\n\t}\n\tif (!response.body) return Buffer.alloc(0);\n\tconst reader = response.body.getReader();\n\tconst chunks: Buffer[] = [];\n\tlet total = 0;\n\ttry {\n\t\twhile (true) {\n\t\t\tconst { done, value } = await reader.read();\n\t\t\tif (done) break;\n\t\t\ttotal += value.byteLength;\n\t\t\tif (total > limit) {\n\t\t\t\tvoid reader.cancel().catch(() => undefined);\n\t\t\t\tthrow new Error(`${label} exceeds the ${limit}-byte limit.`);\n\t\t\t}\n\t\t\tchunks.push(Buffer.from(value));\n\t\t}\n\t} finally {\n\t\treader.releaseLock();\n\t}\n\treturn Buffer.concat(chunks, total);\n}\n\nfunction errorMessage(error: unknown) {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nasync function signedHeaders(input: {\n\tmethod: string;\n\turl: URL;\n\tbody?: Buffer;\n\textraHeaders: Record<string, string>;\n\taccessKeyId: string;\n\tsecretAccessKey: string;\n\tsessionToken?: string;\n\tregion: string;\n}) {\n\tconst now = new Date();\n\tconst amzDate = iso8601Basic(now);\n\tconst dateStamp = amzDate.slice(0, 8);\n\tconst payloadHash = sha256(input.body ?? Buffer.alloc(0));\n\tconst headers: Record<string, string> = {\n\t\t...lowercaseKeys(input.extraHeaders),\n\t\thost: input.url.host,\n\t\t\"x-amz-content-sha256\": payloadHash,\n\t\t\"x-amz-date\": amzDate,\n\t};\n\tif (input.sessionToken) headers[\"x-amz-security-token\"] = input.sessionToken;\n\tconst signedHeaderNames = Object.keys(headers).sort();\n\tconst canonicalHeaders = signedHeaderNames\n\t\t.map((name) => `${name}:${headers[name]?.trim()}\\n`)\n\t\t.join(\"\");\n\tconst canonicalRequest = [\n\t\tinput.method,\n\t\tinput.url.pathname,\n\t\tinput.url.searchParams.toString(),\n\t\tcanonicalHeaders,\n\t\tsignedHeaderNames.join(\";\"),\n\t\tpayloadHash,\n\t].join(\"\\n\");\n\tconst scope = `${dateStamp}/${input.region}/s3/aws4_request`;\n\tconst stringToSign = [\n\t\t\"AWS4-HMAC-SHA256\",\n\t\tamzDate,\n\t\tscope,\n\t\tsha256(Buffer.from(canonicalRequest)),\n\t].join(\"\\n\");\n\tconst signingKey = hmac(\n\t\thmac(hmac(hmac(Buffer.from(`AWS4${input.secretAccessKey}`), dateStamp), input.region), \"s3\"),\n\t\t\"aws4_request\",\n\t);\n\tconst signature = createHmac(\"sha256\", signingKey).update(stringToSign).digest(\"hex\");\n\treturn {\n\t\t...headers,\n\t\tauthorization: `AWS4-HMAC-SHA256 Credential=${input.accessKeyId}/${scope}, SignedHeaders=${signedHeaderNames.join(\";\")}, Signature=${signature}`,\n\t};\n}\n\nfunction hmac(key: Buffer, value: string) {\n\treturn createHmac(\"sha256\", key).update(value).digest();\n}\n\nfunction sha256(value: Buffer) {\n\treturn createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction lowercaseKeys(value: Record<string, string>) {\n\treturn Object.fromEntries(Object.entries(value).map(([key, item]) => [key.toLowerCase(), item]));\n}\n\nfunction normalizeEtag(value: string | null) {\n\treturn value ?? undefined;\n}\n\nfunction isSecurityTokenInvalidArgument(text: string) {\n\treturn (\n\t\ttext.includes(\"<Code>InvalidArgument</Code>\") &&\n\t\ttext.includes(\"<Message>X-Amz-Security-Token</Message>\")\n\t);\n}\n"],
5
- "mappings": "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",
6
- "names": ["createHash", "sessionToken", "sha256", "errorMessage", "createHash"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/ui/setup/setup-name-ui.ts", "../../src/ui/setup/setup-wizard.ts"],
4
- "sourcesContent": ["import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { validateConfigName } from \"../../settings/settings-validation.js\";\nimport { errorMessage } from \"../../sync/sync-errors.js\";\nimport { safeTerminalText } from \"../terminal-text.js\";\n\nexport async function promptInitialSetupName(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n\twhile (!signal?.aborted) {\n\t\tconst hint = \"For example: home or work. Leave blank for default.\";\n\t\t// Pi styles the whole input title as accent; give only the guidance a muted role.\n\t\tconst guidance = ctx.mode === \"tui\" ? ctx.ui.theme.fg(\"muted\", hint) : hint;\n\t\t// This compact prompt owns its default hint; the general helper would repeat it.\n\t\tconst value = await ctx.ui.input(`Sync setup name\\n${guidance}`, undefined, { signal });\n\t\tif (signal?.aborted) {\n\t\t\tthrow signal.reason instanceof Error\n\t\t\t\t? signal.reason\n\t\t\t\t: new DOMException(\"The operation was aborted\", \"AbortError\");\n\t\t}\n\t\tif (value === undefined) return undefined;\n\t\tconst name = value.trim() || \"default\";\n\t\ttry {\n\t\t\tif (name.includes(\"<\") || name.includes(\">\")) {\n\t\t\t\tthrow new Error(\"Replace example placeholders with your own name.\");\n\t\t\t}\n\t\t\tvalidateConfigName(name, \"sync setup\");\n\t\t\treturn name;\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(\n\t\t\t\t`This name cannot be used for the sync setup. ${safeTerminalText(errorMessage(error))} Enter another name (for example, default).`,\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t}\n\t}\n\treturn undefined;\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { refreshTargetCompletions } from \"../../commands/setup-completions.js\";\nimport { localConfigPath } from \"../../settings/config-file.js\";\nimport { safeTerminalText } from \"../terminal-text.js\";\nimport { showGitSetup } from \"./git-ui.js\";\nimport { showS3Setup } from \"./s3-ui.js\";\nimport { promptInitialSetupName } from \"./setup-name-ui.js\";\nimport { showWebDavSetup } from \"./webdav-ui.js\";\n\nexport async function showSetupWizard(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n\tif (ctx.mode !== \"tui\") {\n\t\tctx.ui.notify(\n\t\t\t`Guided sync setup requires TUI mode for masked credential input. Create version 3 settings in ${safeTerminalText(localConfigPath())}.`,\n\t\t\t\"warning\",\n\t\t);\n\t\treturn false;\n\t}\n\tconst preset = await ctx.ui.select(\n\t\t\"Set up sync\\n\\nWhere will Pi settings be stored?\",\n\t\t[\"Cloudflare R2\", \"Other S3-compatible storage\", \"WebDAV\", \"Git\", \"Cancel\"],\n\t\t{ signal },\n\t);\n\tif (signal?.aborted || !preset || preset === \"Cancel\") return false;\n\tconst targetName = await promptInitialSetupName(ctx, signal);\n\tif (!targetName) return false;\n\tif (preset === \"WebDAV\") {\n\t\tconst saved = await showWebDavSetup(ctx, targetName, signal);\n\t\tif (signal?.aborted) return false;\n\t\tif (saved) await refreshTargetCompletions();\n\t\treturn saved;\n\t}\n\tif (preset === \"Git\") {\n\t\tconst saved = await showGitSetup(ctx, targetName, signal);\n\t\tif (signal?.aborted) return false;\n\t\tif (saved) await refreshTargetCompletions();\n\t\treturn saved;\n\t}\n\treturn showS3Setup(ctx, preset, targetName, signal);\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,eAAsB,uBAAuB,KAA8B,QAAsB;AAChG,SAAO,CAAC,QAAQ,SAAS;AACxB,UAAM,OAAO;AAEb,UAAM,WAAW,IAAI,SAAS,QAAQ,IAAI,GAAG,MAAM,GAAG,SAAS,IAAI,IAAI;AAEvE,UAAM,QAAQ,MAAM,IAAI,GAAG,MAAM;AAAA,EAAoB,QAAQ,IAAI,QAAW,EAAE,OAAO,CAAC;AACtF,QAAI,QAAQ,SAAS;AACpB,YAAM,OAAO,kBAAkB,QAC5B,OAAO,SACP,IAAI,aAAa,6BAA6B,YAAY;AAAA,IAC9D;AACA,QAAI,UAAU,OAAW,QAAO;AAChC,UAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,QAAI;AACH,UAAI,KAAK,SAAS,GAAG,KAAK,KAAK,SAAS,GAAG,GAAG;AAC7C,cAAM,IAAI,MAAM,kDAAkD;AAAA,MACnE;AACA,yBAAmB,MAAM,YAAY;AACrC,aAAO;AAAA,IACR,SAAS,OAAO;AACf,UAAI,GAAG;AAAA,QACN,gDAAgD,iBAAiB,aAAa,KAAK,CAAC,CAAC;AAAA,QACrF;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACA,SAAO;AACR;;;ACxBA,eAAsB,gBAAgB,KAA8B,QAAsB;AACzF,MAAI,IAAI,SAAS,OAAO;AACvB,QAAI,GAAG;AAAA,MACN,iGAAiG,iBAAiB,gBAAgB,CAAC,CAAC;AAAA,MACpI;AAAA,IACD;AACA,WAAO;AAAA,EACR;AACA,QAAM,SAAS,MAAM,IAAI,GAAG;AAAA,IAC3B;AAAA,IACA,CAAC,iBAAiB,+BAA+B,UAAU,OAAO,QAAQ;AAAA,IAC1E,EAAE,OAAO;AAAA,EACV;AACA,MAAI,QAAQ,WAAW,CAAC,UAAU,WAAW,SAAU,QAAO;AAC9D,QAAM,aAAa,MAAM,uBAAuB,KAAK,MAAM;AAC3D,MAAI,CAAC,WAAY,QAAO;AACxB,MAAI,WAAW,UAAU;AACxB,UAAM,QAAQ,MAAM,gBAAgB,KAAK,YAAY,MAAM;AAC3D,QAAI,QAAQ,QAAS,QAAO;AAC5B,QAAI,MAAO,OAAM,yBAAyB;AAC1C,WAAO;AAAA,EACR;AACA,MAAI,WAAW,OAAO;AACrB,UAAM,QAAQ,MAAM,aAAa,KAAK,YAAY,MAAM;AACxD,QAAI,QAAQ,QAAS,QAAO;AAC5B,QAAI,MAAO,OAAM,yBAAyB;AAC1C,WAAO;AAAA,EACR;AACA,SAAO,YAAY,KAAK,QAAQ,YAAY,MAAM;AACnD;",
6
- "names": []
7
- }
@@ -1,20 +0,0 @@
1
- // @generated by scripts/build-runtime.mjs; do not edit.
2
- // @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
3
- import {
4
- inspectSync
5
- } from "./chunk-SZWBGPID.ts";
6
- import "./chunk-T2B5IU74.ts";
7
- import "./chunk-AUSDLD6F.ts";
8
- import "./chunk-NJFUIVYL.ts";
9
- import "./chunk-CCSN3F47.ts";
10
- import "./chunk-6LP3MCR2.ts";
11
- import "./chunk-ZI5MXMEX.ts";
12
- import "./chunk-TEN2ZBJV.ts";
13
- import "./chunk-OEX4ABY6.ts";
14
- import "./chunk-THMF4BVL.ts";
15
- import "./chunk-T3HH3UEJ.ts";
16
- import "./chunk-JAAKLL6M.ts";
17
- export {
18
- inspectSync
19
- };
20
- //# sourceMappingURL=sync-inspection-CST2KL65.ts.map