@narumitw/pi-sync 0.51.1 → 0.52.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 (181) hide show
  1. package/README.md +30 -5
  2. package/dist/chunks/{chunk-7KHKWL3Q.ts → chunk-2CBF6SMT.ts} +8 -7
  3. package/dist/chunks/chunk-2CBF6SMT.ts.map +7 -0
  4. package/dist/chunks/{chunk-YFADF5ZQ.ts → chunk-2DI6PDZV.ts} +5 -1
  5. package/dist/chunks/chunk-2DI6PDZV.ts.map +7 -0
  6. package/dist/chunks/chunk-2GUXI2XT.ts +1702 -0
  7. package/dist/chunks/chunk-2GUXI2XT.ts.map +7 -0
  8. package/dist/chunks/{chunk-4MPIH46N.ts → chunk-3B4Z2SKV.ts} +40 -6
  9. package/dist/chunks/chunk-3B4Z2SKV.ts.map +7 -0
  10. package/dist/chunks/{chunk-YPXGU5OR.ts → chunk-4QVPTIZB.ts} +16 -6
  11. package/dist/chunks/{chunk-YPXGU5OR.ts.map → chunk-4QVPTIZB.ts.map} +2 -2
  12. package/dist/chunks/{chunk-UA7RXOIT.ts → chunk-4SBTAVFL.ts} +6 -6
  13. package/dist/chunks/{chunk-6546TS54.ts → chunk-5RZPINUQ.ts} +7 -4
  14. package/dist/chunks/{chunk-6546TS54.ts.map → chunk-5RZPINUQ.ts.map} +2 -2
  15. package/dist/chunks/chunk-76NB4R7U.ts +107 -0
  16. package/dist/chunks/chunk-76NB4R7U.ts.map +7 -0
  17. package/dist/chunks/{chunk-DM4X4FIA.ts → chunk-7D6RDCVC.ts} +8 -10
  18. package/dist/chunks/{chunk-DM4X4FIA.ts.map → chunk-7D6RDCVC.ts.map} +2 -2
  19. package/dist/chunks/chunk-A6HU4ERM.ts +124 -0
  20. package/dist/chunks/chunk-A6HU4ERM.ts.map +7 -0
  21. package/dist/chunks/chunk-AMJRUXFT.ts +17 -0
  22. package/dist/chunks/chunk-AMJRUXFT.ts.map +7 -0
  23. package/dist/chunks/chunk-ANWNQIR7.ts +1013 -0
  24. package/dist/chunks/chunk-ANWNQIR7.ts.map +7 -0
  25. package/dist/chunks/{chunk-T56RNRZJ.ts → chunk-BDB4IDM3.ts} +19 -10
  26. package/dist/chunks/chunk-BDB4IDM3.ts.map +7 -0
  27. package/dist/chunks/{chunk-2RZSQWBH.ts → chunk-CHSIAC4N.ts} +5 -5
  28. package/dist/chunks/{chunk-2RZSQWBH.ts.map → chunk-CHSIAC4N.ts.map} +2 -2
  29. package/dist/chunks/chunk-HUZ5CR4W.ts +110 -0
  30. package/dist/chunks/chunk-HUZ5CR4W.ts.map +7 -0
  31. package/dist/chunks/{chunk-QLSN7AGX.ts → chunk-IJ6VV6FN.ts} +81 -19
  32. package/dist/chunks/chunk-IJ6VV6FN.ts.map +7 -0
  33. package/dist/chunks/chunk-ORQRHEEO.ts +362 -0
  34. package/dist/chunks/chunk-ORQRHEEO.ts.map +7 -0
  35. package/dist/chunks/chunk-QE7NZZWT.ts +380 -0
  36. package/dist/chunks/chunk-QE7NZZWT.ts.map +7 -0
  37. package/dist/chunks/{chunk-HGJH56KR.ts → chunk-QHSQCK7L.ts} +4 -4
  38. package/dist/chunks/chunk-QOFMXPM5.ts +735 -0
  39. package/dist/chunks/chunk-QOFMXPM5.ts.map +7 -0
  40. package/dist/chunks/{chunk-DZUSTGQV.ts → chunk-UQ3ALBIB.ts} +4 -4
  41. package/dist/chunks/{chunk-Q32CQWPM.ts → chunk-V6VZ5TLG.ts} +13 -6
  42. package/dist/chunks/chunk-V6VZ5TLG.ts.map +7 -0
  43. package/dist/chunks/{chunk-E42GXD6D.ts → chunk-WKPX2SIC.ts} +4 -4
  44. package/dist/chunks/chunk-ZW5ZLGBI.ts +154 -0
  45. package/dist/chunks/chunk-ZW5ZLGBI.ts.map +7 -0
  46. package/dist/chunks/{chunk-6NT3YFGY.ts → chunk-ZX2Q6THB.ts} +8 -3
  47. package/dist/chunks/{chunk-6NT3YFGY.ts.map → chunk-ZX2Q6THB.ts.map} +2 -2
  48. package/dist/chunks/conflict-artifacts-BB2FZMIE.ts +27 -0
  49. package/dist/chunks/conflict-review-T3PB7ZSD.ts +175 -0
  50. package/dist/chunks/conflict-review-T3PB7ZSD.ts.map +7 -0
  51. package/dist/chunks/{file-selection-RAVHRYFG.ts → file-selection-WZX7HAY2.ts} +8 -7
  52. package/dist/chunks/{file-selection-RAVHRYFG.ts.map → file-selection-WZX7HAY2.ts.map} +1 -1
  53. package/dist/chunks/{git-backend-IAANDL3K.ts → git-backend-HLGKUQJT.ts} +19 -7
  54. package/dist/chunks/git-backend-HLGKUQJT.ts.map +7 -0
  55. package/dist/chunks/local-fields-6DGYOOIK.ts +22 -0
  56. package/dist/chunks/manager-result-dispatcher-VIDT3QBU.ts +23 -0
  57. package/dist/chunks/{manager-ui-763NEKJY.ts → manager-ui-HSMHS3OK.ts} +236 -57
  58. package/dist/chunks/manager-ui-HSMHS3OK.ts.map +7 -0
  59. package/dist/chunks/merge-baseline-store-EVQAAML6.ts +22 -0
  60. package/dist/chunks/remote-selection-ui-SMF5CLFO.ts +22 -0
  61. package/dist/chunks/{s3-backend-XGXUOPUN.ts → s3-backend-DJ2NT3SZ.ts} +16 -9
  62. package/dist/chunks/s3-backend-DJ2NT3SZ.ts.map +7 -0
  63. package/dist/chunks/{setup-switch-5G2VNJHL.ts → setup-switch-KTUWL6DE.ts} +9 -6
  64. package/dist/chunks/{setup-wizard-YIEWGX32.ts → setup-wizard-GSDPDFC4.ts} +10 -7
  65. package/dist/chunks/{setup-wizard-YIEWGX32.ts.map → setup-wizard-GSDPDFC4.ts.map} +1 -1
  66. package/dist/chunks/{snapshot-JL5DFSXI.ts → snapshot-THS5EY2L.ts} +6 -9
  67. package/dist/chunks/snapshot-THS5EY2L.ts.map +7 -0
  68. package/dist/chunks/{sync-inspection-P3ENJLNF.ts → sync-inspection-VBJF2FWC.ts} +10 -10
  69. package/dist/chunks/sync-inspection-VBJF2FWC.ts.map +7 -0
  70. package/dist/chunks/{sync-operations-AR76EB6C.ts → sync-operations-27VQUDH2.ts} +309 -508
  71. package/dist/chunks/sync-operations-27VQUDH2.ts.map +7 -0
  72. package/dist/chunks/{sync-state-VHJUZ4YG.ts → sync-state-CFL4RRRB.ts} +6 -6
  73. package/dist/chunks/sync-state-CFL4RRRB.ts.map +7 -0
  74. package/dist/chunks/{webdav-backend-3EGUONAT.ts → webdav-backend-ETQGSI6I.ts} +13 -7
  75. package/dist/chunks/webdav-backend-ETQGSI6I.ts.map +7 -0
  76. package/dist/index.ts +142 -43
  77. package/dist/index.ts.map +2 -2
  78. package/docs/content-merge-audit.md +156 -0
  79. package/docs/merge-implementation-audit.md +312 -0
  80. package/docs/settings-merge-audit.md +153 -0
  81. package/docs/settings.md +36 -0
  82. package/package.json +5 -5
  83. package/src/backends/git/git-backend.ts +2 -0
  84. package/src/backends/git/git-storage.ts +8 -3
  85. package/src/backends/s3/s3-backend.ts +2 -1
  86. package/src/backends/webdav/webdav-backend.ts +2 -1
  87. package/src/commands/command-execution.ts +10 -0
  88. package/src/commands/command.ts +4 -0
  89. package/src/settings/config.ts +12 -0
  90. package/src/settings/settings-management.ts +2 -2
  91. package/src/settings/settings-types.ts +14 -1
  92. package/src/settings/settings-validation.ts +24 -3
  93. package/src/snapshot/session-paths.ts +34 -7
  94. package/src/snapshot/snapshot-apply.ts +81 -32
  95. package/src/snapshot/snapshot-case-replacement.ts +80 -0
  96. package/src/snapshot/snapshot-codec.ts +6 -1
  97. package/src/snapshot/snapshot-root-transition.ts +154 -0
  98. package/src/snapshot/snapshot-transaction-plan.ts +72 -0
  99. package/src/snapshot/snapshot-transaction.ts +844 -102
  100. package/src/snapshot/snapshot-types.ts +5 -0
  101. package/src/state/json-file.ts +32 -5
  102. package/src/state/merge-baseline-store.ts +182 -0
  103. package/src/state/mutation-directory-sync.ts +34 -0
  104. package/src/state/state-types.ts +4 -0
  105. package/src/state/sync-state-store.ts +14 -1
  106. package/src/sync/automatic-sync.ts +11 -3
  107. package/src/sync/conflict-artifact-ownership.ts +63 -0
  108. package/src/sync/conflict-artifacts.ts +195 -0
  109. package/src/sync/conflict-groups.ts +68 -0
  110. package/src/sync/conflict-preview.ts +56 -0
  111. package/src/sync/conflict-resolution.ts +93 -0
  112. package/src/sync/conflict-retention.ts +72 -0
  113. package/src/sync/conflict-review.ts +95 -0
  114. package/src/sync/content-conflicts.ts +73 -0
  115. package/src/sync/field-migration.ts +39 -0
  116. package/src/sync/file-merge-planner.ts +143 -0
  117. package/src/sync/json-document.ts +184 -0
  118. package/src/sync/local-fields.ts +134 -0
  119. package/src/sync/merge-apply.ts +380 -0
  120. package/src/sync/merge-journal.ts +219 -0
  121. package/src/sync/merged-sync.ts +723 -0
  122. package/src/sync/partial-progress.ts +54 -0
  123. package/src/sync/remote-snapshot.ts +6 -0
  124. package/src/sync/session-merge.ts +194 -0
  125. package/src/sync/settings-conflicts.ts +52 -0
  126. package/src/sync/settings-merge.ts +57 -0
  127. package/src/sync/startup-check.ts +90 -5
  128. package/src/sync/sync-inspection.ts +1 -0
  129. package/src/sync/sync-local.ts +61 -0
  130. package/src/sync/sync-mutations.ts +256 -114
  131. package/src/sync/sync-queries.ts +6 -2
  132. package/src/sync/sync-state.ts +14 -5
  133. package/src/sync/text-merge.ts +133 -0
  134. package/src/sync-extension.ts +8 -0
  135. package/src/ui/manager-state.ts +12 -1
  136. package/src/ui/manager-ui.ts +10 -0
  137. package/src/ui/merge-review.ts +28 -0
  138. package/src/ui/remote-selection-ui.ts +1 -0
  139. package/src/ui/settings-ui.ts +183 -2
  140. package/src/ui/setup/setup-actions.ts +2 -2
  141. package/src/ui/setup/setup-switcher.ts +2 -1
  142. package/src/ui/storage-connections-ui.ts +11 -7
  143. package/src/ui/sync-attention.ts +3 -0
  144. package/src/ui/sync-format.ts +16 -12
  145. package/src/ui/sync-setups-ui.ts +1 -0
  146. package/src/ui/terminal-text.ts +9 -2
  147. package/dist/chunks/chunk-4AIHXRKE.ts +0 -197
  148. package/dist/chunks/chunk-4AIHXRKE.ts.map +0 -7
  149. package/dist/chunks/chunk-4MPIH46N.ts.map +0 -7
  150. package/dist/chunks/chunk-7KHKWL3Q.ts.map +0 -7
  151. package/dist/chunks/chunk-EEJPYTWE.ts +0 -348
  152. package/dist/chunks/chunk-EEJPYTWE.ts.map +0 -7
  153. package/dist/chunks/chunk-IVXEDPAD.ts +0 -370
  154. package/dist/chunks/chunk-IVXEDPAD.ts.map +0 -7
  155. package/dist/chunks/chunk-MSSW6F3R.ts +0 -12
  156. package/dist/chunks/chunk-MSSW6F3R.ts.map +0 -7
  157. package/dist/chunks/chunk-OVDTF5CH.ts +0 -90
  158. package/dist/chunks/chunk-OVDTF5CH.ts.map +0 -7
  159. package/dist/chunks/chunk-Q32CQWPM.ts.map +0 -7
  160. package/dist/chunks/chunk-QLSN7AGX.ts.map +0 -7
  161. package/dist/chunks/chunk-SWUXA3MH.ts +0 -18
  162. package/dist/chunks/chunk-SWUXA3MH.ts.map +0 -7
  163. package/dist/chunks/chunk-T56RNRZJ.ts.map +0 -7
  164. package/dist/chunks/chunk-YFADF5ZQ.ts.map +0 -7
  165. package/dist/chunks/git-backend-IAANDL3K.ts.map +0 -7
  166. package/dist/chunks/manager-result-dispatcher-OTUMQM26.ts +0 -23
  167. package/dist/chunks/manager-ui-763NEKJY.ts.map +0 -7
  168. package/dist/chunks/remote-selection-ui-TZTJF32Y.ts +0 -22
  169. package/dist/chunks/s3-backend-XGXUOPUN.ts.map +0 -7
  170. package/dist/chunks/sync-operations-AR76EB6C.ts.map +0 -7
  171. package/dist/chunks/webdav-backend-3EGUONAT.ts.map +0 -7
  172. /package/dist/chunks/{chunk-UA7RXOIT.ts.map → chunk-4SBTAVFL.ts.map} +0 -0
  173. /package/dist/chunks/{chunk-HGJH56KR.ts.map → chunk-QHSQCK7L.ts.map} +0 -0
  174. /package/dist/chunks/{chunk-DZUSTGQV.ts.map → chunk-UQ3ALBIB.ts.map} +0 -0
  175. /package/dist/chunks/{chunk-E42GXD6D.ts.map → chunk-WKPX2SIC.ts.map} +0 -0
  176. /package/dist/chunks/{manager-result-dispatcher-OTUMQM26.ts.map → conflict-artifacts-BB2FZMIE.ts.map} +0 -0
  177. /package/dist/chunks/{remote-selection-ui-TZTJF32Y.ts.map → local-fields-6DGYOOIK.ts.map} +0 -0
  178. /package/dist/chunks/{setup-switch-5G2VNJHL.ts.map → manager-result-dispatcher-VIDT3QBU.ts.map} +0 -0
  179. /package/dist/chunks/{snapshot-JL5DFSXI.ts.map → merge-baseline-store-EVQAAML6.ts.map} +0 -0
  180. /package/dist/chunks/{sync-inspection-P3ENJLNF.ts.map → remote-selection-ui-SMF5CLFO.ts.map} +0 -0
  181. /package/dist/chunks/{sync-state-VHJUZ4YG.ts.map → setup-switch-KTUWL6DE.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 attentionMainMenuItems,\n blockedSyncMenuItem,\n type SyncManagerAttentionOptions,\n showManagerAttention,\n} from \"./manager-attention.js\";\nimport { recoverSyncAccess } from \"./manager-recovery.js\";\nimport { dispatchManagerResult } from \"./manager-result-dispatcher.js\";\nimport { describeManagerState } from \"./manager-state.js\";\nimport { showSyncSettings } from \"./settings-ui.js\";\nimport { showSyncSetupManager } from \"./setup/setup-actions.js\";\nimport { showSetupSwitcher } from \"./setup/setup-switcher.js\";\nimport { showStorageConnections } from \"./storage-connections-ui.js\";\nimport { observationMatchesConfig } from \"./sync-attention.js\";\n\nexport async function showSyncManager(\n ctx: ExtensionCommandContext,\n runRoute: RunRoute,\n sessionSignal?: AbortSignal,\n options: SyncManagerAttentionOptions = {},\n): Promise<void> {\n if (!ctx.hasUI) {\n await runRoute(\"help\");\n return;\n }\n type Screen = \"main\" | \"more\" | \"recovery\";\n type Action =\n | \"review-attention\"\n | \"sync\"\n | \"switch\"\n | \"diff\"\n | \"settings\"\n | \"pull\"\n | \"push\"\n | \"setups\"\n | \"connections\"\n | \"history\"\n | \"doctor\"\n | \"unlock\"\n | \"recover\"\n | \"refresh\"\n | \"help\"\n | \"init\"\n | \"back\";\n interface State {\n manager: Awaited<ReturnType<typeof describeManagerState>>;\n }\n const menu = defineMenu<State, Screen, Action, ExtensionCommandContext>({\n start: \"main\",\n screens: {\n main: ({ state }) => {\n const attentionItems = attentionMainMenuItems(state.manager);\n const managerItems = state.manager.actions.map(\n (label) => blockedSyncMenuItem(label, state.manager) ?? syncMainMenuItem(label),\n );\n const operationFirst = state.manager.operation !== undefined && state.manager.operation.kind !== \"free\";\n return {\n kind: \"actions\",\n title: \"Manage sync\",\n lines: state.manager.title.split(\"\\n\").slice(1),\n items: operationFirst ? [...managerItems, ...attentionItems] : [...attentionItems, ...managerItems],\n hint: \"close\",\n };\n },\n more: () => ({\n kind: \"actions\",\n title: \"More options\",\n items: [\n { id: \"pull\", label: \"Pull from remote\u2026\", action: \"pull\" },\n { id: \"push\", label: \"Push to remote\u2026\", action: \"push\" },\n { id: \"setups\", label: \"Sync setups\u2026\", action: \"setups\" },\n {\n id: \"connections\",\n label: \"Storage connections\u2026\",\n action: \"connections\",\n },\n {\n id: \"doctor\",\n label: \"Check setup\",\n description: \"Check current setup access. WebDAV also probes writes and repairs history.\",\n action: \"doctor\",\n },\n { id: \"recovery\", label: \"History & recovery\u2026\", to: \"recovery\" },\n { id: \"help\", label: \"Help\", action: \"help\" },\n { id: \"back\", label: \"Back\", action: \"back\" },\n ],\n hint: \"back\",\n }),\n recovery: ({ state }) => ({\n kind: \"actions\",\n title: \"History & recovery\",\n items: [\n { id: \"history\", label: \"Browse history\", action: \"history\" },\n {\n id: \"doctor\",\n label: \"Check setup\",\n description: \"WebDAV also probes writes and repairs history.\",\n action: \"doctor\",\n },\n ...(state.manager.operation && operationCanRecover(state.manager.operation)\n ? [{ id: \"unlock\", label: \"Recover stale operation\", action: \"unlock\" as const }]\n : []),\n { id: \"back\", label: \"Back\", action: \"back\" },\n ],\n hint: \"back\",\n }),\n },\n actions: {\n \"review-attention\": async () => {\n const attention = options.getAttention?.();\n if (!attention) {\n const observation = options.getObservation?.();\n if (!observation) return { kind: \"stay\" };\n // A head-only observation is not an authoritative decision. Load a fresh\n // snapshot only after the user activates the existing review flow.\n const { showRemoteSelectionReview } = await import(\"./remote-selection-ui.js\");\n if (sessionSignal?.aborted) return { kind: \"close\" };\n const config = await loadConfig();\n if (sessionSignal?.aborted) return { kind: \"close\" };\n if (options.getObservation?.() !== observation || !observationMatchesConfig(observation, config)) {\n options.onObservationInvalidated?.();\n return { kind: \"stay\" };\n }\n // Keep the check-time hint on cancellation or failure. Route commits and\n // the manager's config/baseline reconciliation own invalidation.\n const result = await showRemoteSelectionReview(ctx, observation.setupName, sessionSignal, undefined, {\n origin: \"sync\",\n runRoute,\n onSelectionResolved: () => {\n if (!sessionSignal?.aborted && options.getObservation?.() === observation)\n options.onObservationInvalidated?.();\n },\n });\n if (sessionSignal?.aborted) return { kind: \"close\" };\n if (result.kind === \"route-result\") {\n return dispatchManagerResult(ctx, result.result, result.route, runRoute, sessionSignal);\n }\n return { kind: result.kind === \"closed\" || result.kind === \"stale\" ? \"close\" : \"stay\" };\n }\n const disposition = await showManagerAttention(ctx, attention, runRoute, sessionSignal, () =>\n options.onSelectionResolved?.(attention),\n );\n return { kind: disposition };\n },\n sync: async () => {\n const pendingAttention = options.getAttention?.();\n if (pendingAttention) {\n const activeConfig = await loadConfig();\n if (sessionSignal?.aborted) return { kind: \"close\" };\n if (pendingAttention.decision.setupName === activeConfig.setupName) {\n ctx.ui.notify(\"Review synced content before starting Sync now.\", \"warning\");\n return { kind: \"stay\" };\n }\n }\n const result = await runCancellableOperation(ctx, \"Checking current sync setup\u2026\", \"sync\", runRoute, {\n commitAware: true,\n signal: sessionSignal,\n });\n const disposition = await dispatchManagerResult(ctx, result, \"sync\", runRoute, sessionSignal);\n return disposition.kind === \"close\" ? { kind: \"close\" } : { kind: \"stay\" };\n },\n switch: async () => {\n const result = await showSetupSwitcher(ctx, runRoute, undefined, sessionSignal);\n return result === \"pull-attempted\" || result === \"closed\" ? { kind: \"close\" } : { kind: \"stay\" };\n },\n diff: async () => {\n const result = await runCancellableOperation(ctx, \"Checking current sync setup\u2026\", \"diff\", runRoute, {\n signal: sessionSignal,\n });\n return result.kind === \"closed\" ? { kind: \"close\" } : { kind: \"stay\" };\n },\n settings: async () => {\n await showSyncSettings(ctx, runRoute, sessionSignal);\n return { kind: \"stay\" };\n },\n pull: async () => {\n const result = await runCancellableOperation(ctx, \"Checking remote changes\u2026\", \"pull\", runRoute, {\n commitAware: true,\n cancelledMessage: \"Pull check cancelled; no local files were changed.\",\n signal: sessionSignal,\n });\n const disposition = await dispatchManagerResult(ctx, result, \"pull\", runRoute, sessionSignal);\n return disposition.kind === \"close\" ? { kind: \"close\" } : { kind: \"stay\" };\n },\n push: async () => {\n const result = await runCancellableOperation(ctx, \"Preparing push preview\u2026\", \"push\", runRoute, {\n commitAware: true,\n cancelledMessage: \"Push preparation cancelled; no remote files were changed.\",\n signal: sessionSignal,\n });\n const disposition = await dispatchManagerResult(ctx, result, \"push\", runRoute, sessionSignal);\n return disposition.kind === \"close\" ? { kind: \"close\" } : { kind: \"stay\" };\n },\n setups: async () => {\n const result = await showSyncSetupManager(ctx, runRoute, sessionSignal);\n return result === \"exit\" ? { kind: \"close\" } : { kind: \"stay\" };\n },\n connections: async () => {\n await showStorageConnections(ctx, sessionSignal);\n return { kind: \"stay\" };\n },\n history: async () => {\n await runRoute(\"history\");\n return { kind: \"stay\" };\n },\n doctor: async () => {\n const result = await runCancellableOperation(ctx, \"Checking setup access\u2026\", \"doctor\", runRoute, {\n signal: sessionSignal,\n });\n return { kind: result.kind === \"closed\" ? \"close\" : \"stay\" };\n },\n unlock: async ({ state, signal: actionSignal }) => {\n const result = await recoverSyncAccess(ctx, state.manager, runRoute, sessionSignal, actionSignal);\n if (result === \"close\") return { kind: \"close\" };\n return result === \"restored\" ? { kind: \"to\", screen: \"main\" } : { kind: \"stay\" };\n },\n recover: async ({ state, signal: actionSignal }) => {\n const result = await recoverSyncAccess(ctx, state.manager, runRoute, sessionSignal, actionSignal);\n return { kind: result === \"close\" ? \"close\" : \"stay\" };\n },\n refresh: async () => ({ kind: \"stay\" }),\n help: async () => {\n await runRoute(\"help\");\n return { kind: \"close\" };\n },\n init: async () => {\n await runRoute(\"init\");\n return { kind: \"stay\" };\n },\n back: async () => ({ kind: \"back\" }),\n },\n });\n await runMenu(ctx, menu, {\n getState: async () => {\n const pendingAttention = options.getAttention?.();\n const observation = options.getObservation?.();\n const manager = await describeManagerState(sessionSignal, pendingAttention, undefined, observation);\n if (sessionSignal?.aborted) return { manager };\n // A busy operation suppresses baseline reads, not the stored check-time hint.\n if (\n observation &&\n options.getObservation?.() === observation &&\n !manager.observation &&\n !(manager.operation && operationBlocksChanges(manager.operation))\n ) {\n options.onObservationInvalidated?.();\n }\n if (pendingAttention && options.getAttention?.() === pendingAttention && !manager.attention) {\n options.onSelectionResolved?.(pendingAttention);\n }\n return { manager };\n },\n signal: sessionSignal,\n isCurrent: () => !sessionSignal?.aborted,\n });\n}\n\nfunction syncMainMenuItem(\n label: string,\n): ActionMenuItem<\n \"main\" | \"more\" | \"recovery\",\n \"sync\" | \"switch\" | \"diff\" | \"settings\" | \"setups\" | \"connections\" | \"recover\" | \"refresh\" | \"help\" | \"init\"\n> {\n if (label === \"More\u2026\") return { id: \"more\", label, to: \"more\" };\n if (label === \"History & recovery\u2026\") return { id: \"recovery\", label, to: \"recovery\" };\n const actions = new Map<\n string,\n \"sync\" | \"switch\" | \"diff\" | \"settings\" | \"setups\" | \"connections\" | \"recover\" | \"refresh\" | \"help\" | \"init\"\n >([\n [\"Sync now (recommended)\", \"sync\"],\n [\"Switch sync setup\", \"switch\"],\n [\"Status & changes\", \"diff\"],\n [\"Settings\", \"settings\"],\n [\"Restore sync access\u2026 (recommended)\", \"recover\"],\n [\"Refresh operation status\", \"refresh\"],\n [\"Sync setups\u2026\", \"setups\"],\n [\"Storage connections\u2026\", \"connections\"],\n [\"Help\", \"help\"],\n [\"Set up sync\", \"init\"],\n [\"Use existing settings\", \"init\"],\n ]);\n return { 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 | { kind: \"free\" }\n | { kind: \"live\"; lock: LockFile }\n | { kind: \"busy\"; lock?: LockFile; metadata: LockInspection[\"status\"] }\n | { kind: \"recoverable-stale\"; lock: LockFile }\n | { kind: \"recoverable-unreadable\" }\n | { kind: \"inspection-error\"; message: string };\n\ninterface OperationInspectionDependencies {\n inspectMetadata(): Promise<LockInspection>;\n inspectGuard(): Promise<boolean>;\n}\n\nconst DEFAULT_INSPECTION_DEPENDENCIES: OperationInspectionDependencies = {\n inspectMetadata: inspectLock,\n inspectGuard: isLockGuardHeld,\n};\n\nexport async function inspectOperationAvailability(\n dependencies: OperationInspectionDependencies = DEFAULT_INSPECTION_DEPENDENCIES,\n): Promise<OperationAvailability> {\n try {\n const metadata = await dependencies.inspectMetadata();\n const guardHeld = await dependencies.inspectGuard();\n return classifyOperationAvailability(metadata, guardHeld);\n } catch (error) {\n return { kind: \"inspection-error\", message: errorMessage(error) };\n }\n}\n\nexport function classifyOperationAvailability(metadata: LockInspection, guardHeld: boolean): OperationAvailability {\n if (metadata.status === \"valid\" && !isStaleLock(metadata.lock)) {\n return { kind: \"live\", lock: metadata.lock };\n }\n if (guardHeld) {\n return {\n kind: \"busy\",\n metadata: metadata.status,\n ...(metadata.status === \"valid\" ? { lock: metadata.lock } : {}),\n };\n }\n if (metadata.status === \"valid\") {\n return { kind: \"recoverable-stale\", lock: metadata.lock };\n }\n if (metadata.status === \"unreadable\") return { kind: \"recoverable-unreadable\" };\n return { kind: \"free\" };\n}\n\nexport function operationBlocksChanges(availability: OperationAvailability) {\n return availability.kind !== \"free\";\n}\n\nexport function operationCanRecover(availability: OperationAvailability) {\n return availability.kind === \"recoverable-stale\" || availability.kind === \"recoverable-unreadable\";\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport type { ActionMenuItem } from \"@narumitw/pi-tui-kit\";\nimport type { StartupObservation } from \"../sync/sync-inspection.js\";\nimport type { RunRoute } from \"./cancellable-operation.js\";\nimport { dispatchManagerResult } from \"./manager-result-dispatcher.js\";\nimport type { ManagerDescription } from \"./manager-state.js\";\nimport type { SyncAttentionState } from \"./sync-attention.js\";\n\nexport interface SyncManagerAttentionOptions {\n getObservation?: () => StartupObservation | undefined;\n onObservationInvalidated?: () => void;\n getAttention?: () => SyncAttentionState | undefined;\n onSelectionResolved?: (expected: SyncAttentionState) => void;\n}\n\nexport function attentionMainMenuItems(\n manager: ManagerDescription,\n): ActionMenuItem<\"main\" | \"more\" | \"recovery\", \"review-attention\">[] {\n if (!manager.attention && manager.observation?.inspection.selectionState?.kind !== \"different\") return [];\n const disabled = manager.attentionReviewDisabled === true;\n return [\n {\n id: \"review-attention\",\n label: \"Review synced content (recommended)\",\n action: \"review-attention\",\n ...(disabled\n ? {\n disabled: true,\n disabledReason: \"Finish or recover the active operation first.\",\n }\n : {}),\n },\n ];\n}\n\nexport function blockedSyncMenuItem(\n label: string,\n manager: ManagerDescription,\n): ActionMenuItem<\"main\" | \"more\" | \"recovery\", \"sync\"> | undefined {\n if (label !== \"Sync now (recommended)\" || !manager.attentionBlocksSync) return undefined;\n return {\n id: \"sync\",\n label,\n description: \"Review first.\",\n action: \"sync\",\n disabled: true,\n disabledReason: \"Review synced content first.\",\n };\n}\n\nexport async function showManagerAttention(\n ctx: ExtensionCommandContext,\n attention: SyncAttentionState,\n runRoute: RunRoute,\n signal: AbortSignal | undefined,\n onSelectionResolved: (() => void) | undefined,\n): Promise<\"close\" | \"stay\"> {\n const { showRemoteSelectionReview } = await import(\"./remote-selection-ui.js\");\n if (signal?.aborted) return \"close\";\n const review = await showRemoteSelectionReview(ctx, attention.decision.setupName, signal, undefined, {\n decision: attention.decision,\n origin: attention.origin,\n runRoute,\n onSelectionResolved,\n });\n if (review.kind === \"route-result\") {\n const disposition = await dispatchManagerResult(ctx, review.result, review.route, runRoute, signal, {\n onSelectionResolved,\n });\n return disposition.kind;\n }\n return review.kind === \"closed\" || review.kind === \"stale\" ? \"close\" : \"stay\";\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { runConfirmation } from \"@narumitw/pi-tui-kit\";\nimport { inspectOperationAvailability, operationCanRecover } from \"../state/operation-availability.js\";\nimport { errorMessage } from \"../sync/sync-errors.js\";\nimport type { RunRoute } from \"./cancellable-operation.js\";\nimport type { ManagerDescription } from \"./manager-state.js\";\nimport { safeTerminalText } from \"./terminal-text.js\";\n\nexport type RecoveryDisposition = \"restored\" | \"stay\" | \"close\";\n\nexport async function recoverSyncAccess(\n ctx: ExtensionCommandContext,\n manager: ManagerDescription,\n runRoute: RunRoute,\n sessionSignal: AbortSignal | undefined,\n actionSignal: AbortSignal,\n): Promise<RecoveryDisposition> {\n const operation = manager.operation;\n if (!operation || !operationCanRecover(operation)) {\n ctx.ui.notify(\"Operation status changed. Refresh the manager before retrying recovery.\", \"warning\");\n return \"stay\";\n }\n const signal = sessionSignal ? AbortSignal.any([sessionSignal, actionSignal]) : actionSignal;\n if (signal.aborted) return \"close\";\n const unreadable = operation.kind === \"recoverable-unreadable\";\n const details = unreadable\n ? \"Pi-sync cannot verify who owns the unreadable lock. Close other Pi sessions that may be syncing before continuing.\"\n : `The recorded ${safeTerminalText(operation.lock.command)} operation (pid ${operation.lock.pid}) appears to have stopped. Close other Pi sessions that may still be syncing before continuing.`;\n const confirmation = await runConfirmation(ctx, {\n title: \"Restore sync access?\",\n message: [\n details,\n \"\",\n \"This removes only the local operation lock.\",\n \"It does not change settings, local files, sync state, or remote data.\",\n ].join(\"\\n\"),\n confirmLabel: \"Remove local lock and continue\",\n cancelLabel: \"Cancel\",\n signal,\n isCurrent: () => !signal.aborted,\n onError: (_currentCtx, error) => {\n ctx.ui.notify(`Recovery confirmation failed: ${safeTerminalText(errorMessage(error))}`, \"error\");\n },\n });\n if (confirmation.kind === \"stale\") return \"close\";\n if (confirmation.kind === \"closed\") {\n if (confirmation.reason === \"close\") return \"close\";\n if (!signal.aborted) {\n ctx.ui.notify(\"Recovery cancelled; the local operation lock was not changed.\", \"info\");\n }\n return \"stay\";\n }\n if (confirmation.kind !== \"confirmed\") return \"stay\";\n if (signal.aborted) return \"close\";\n await runRoute(unreadable ? \"unlock --stale\" : \"unlock\", signal);\n if (signal.aborted) return \"close\";\n const latest = await inspectOperationAvailability();\n if (signal.aborted) return \"close\";\n return latest.kind === \"free\" ? \"restored\" : \"stay\";\n}\n", "import { truncateToWidth } from \"@earendil-works/pi-tui\";\nimport { loadConfig } from \"../settings/config.js\";\nimport { activeLocalConfigPath } from \"../settings/config-file.js\";\nimport { readLocalConfigObject } from \"../settings/settings-store.js\";\nimport type { AnySyncConfig } from \"../settings/settings-types.js\";\nimport { isCloudflareR2Endpoint, ownRecord } from \"../settings/settings-validation.js\";\nimport {\n inspectOperationAvailability,\n type OperationAvailability,\n operationBlocksChanges,\n operationCanRecover,\n} from \"../state/operation-availability.js\";\nimport { readStateForConfig, syncStateFingerprint } from \"../state/sync-state-store.js\";\nimport { errorMessage } from \"../sync/sync-errors.js\";\nimport type { StartupObservation } from \"../sync/sync-inspection.js\";\nimport { compareSyncInclude, syncIncludeSelection } from \"../sync/sync-policy.js\";\nimport { automaticSyncSummary } from \"./automatic-sync-summary.js\";\nimport {\n observationMatchesConfig,\n observationSummary,\n type SyncAttentionState,\n syncAttentionMatchesConfig,\n} from \"./sync-attention.js\";\nimport { countValidSyncSetups } from \"./sync-setups-ui.js\";\nimport { safeTerminalText } from \"./terminal-text.js\";\n\nexport const MAIN_MENU_ACTIONS = [\n \"Sync now (recommended)\",\n \"Switch sync setup\",\n \"Status & changes\",\n \"Settings\",\n \"More\u2026\",\n] as const;\n\nexport interface ManagerDescription {\n title: string;\n actions: string[];\n operation?: OperationAvailability;\n attention?: SyncAttentionState;\n observation?: StartupObservation;\n attentionBlocksSync?: boolean;\n attentionReviewDisabled?: boolean;\n}\n\nexport async function describeManagerState(\n signal?: AbortSignal,\n attention?: SyncAttentionState,\n inspectOperation: () => Promise<OperationAvailability> = inspectOperationAvailability,\n observation?: StartupObservation,\n): Promise<ManagerDescription> {\n let raw: Record<string, unknown> | undefined;\n try {\n raw = await readLocalConfigObject();\n } catch (error) {\n return {\n title: [\n \"Manage sync\",\n \"\",\n \"Settings file needs repair. Automatic sync and settings writes are paused.\",\n `Error: ${safeTerminalText(errorMessage(error))}`,\n `File: ${safeTerminalText(await activeLocalConfigPath())}`,\n \"\",\n \"Repair the JSON file, then reopen /sync.\",\n ].join(\"\\n\"),\n actions: [\"Help\"],\n };\n }\n if (!raw) {\n return {\n title: [\"Manage sync\", \"\", \"Not set up.\", \"\", \"What do you want to do?\"].join(\"\\n\"),\n actions: [\"Set up sync\", \"Help\"],\n };\n }\n const configuredTargets = ownRecord(raw.syncSetups);\n if (raw.version === 3 && configuredTargets && Object.keys(configuredTargets).length === 0) {\n return {\n title: [\n \"Manage sync\",\n \"\",\n \"No sync setups are configured.\",\n \"Add a sync setup using an existing storage connection.\",\n \"\",\n \"What do you want to do?\",\n ].join(\"\\n\"),\n actions: [\"Sync setups\u2026\", \"Storage connections\u2026\", \"Help\"],\n };\n }\n try {\n const config = await loadConfig();\n const operation = await inspectOperation();\n const changesBlocked = operationBlocksChanges(operation);\n const selection = syncIncludeSelection(config.include);\n let currentAttention: SyncAttentionState | undefined;\n if (attention) {\n try {\n const attentionConfig =\n attention.decision.setupName === config.setupName ? config : await loadConfig(attention.decision.setupName);\n if (syncAttentionMatchesConfig(attention, attentionConfig)) currentAttention = attention;\n } catch {\n currentAttention = undefined;\n }\n if (signal?.aborted) throw signal.reason;\n }\n const attentionComparison = currentAttention\n ? compareSyncInclude(currentAttention.decision.localInclude, currentAttention.decision.remoteInclude)\n : undefined;\n const noSyncedContent = config.include.length === 0;\n const syncState = changesBlocked ? undefined : await readStateForConfig(config).catch(() => undefined);\n const currentObservation =\n observation &&\n observationMatchesConfig(observation, config) &&\n syncState &&\n syncStateFingerprint(syncState) === observation.inspection.stateIdentity\n ? observation\n : undefined;\n const lastAppliedSnapshot = changesBlocked\n ? \"Unavailable while operations are locked\"\n : syncState?.lastAppliedSnapshot\n ? safeTerminalText(syncState.lastAppliedSnapshot)\n : syncState\n ? \"Never synced\"\n : \"Unavailable\";\n const canSwitch = (await countValidSyncSetups(configuredTargets, signal)) > 1;\n const mainActions = MAIN_MENU_ACTIONS.filter((action) => action !== \"Switch sync setup\" || canSwitch);\n const ordinaryTitle = [\n \"Manage sync\",\n \"\",\n `Current sync setup: ${safeTerminalText(config.setupName)}`,\n `Storage: ${backendStorageDescription(config)}`,\n `Included: ${selection.builtIns.length} built-in group${selection.builtIns.length === 1 ? \"\" : \"s\"} \u00B7 ${selection.custom.length} extra path${selection.custom.length === 1 ? \"\" : \"s\"} \u00B7 Sessions ${selection.sessions ? \"on\" : \"off\"}`,\n `Automatic sync: ${automaticSyncSummary(config.automatic)}`,\n `Last applied: ${lastAppliedSnapshot}`,\n ...(currentAttention\n ? [\n currentAttention.decision.setupName === config.setupName\n ? \"Sync status: Review needed\"\n : `Sync status: Review needed for setup ${safeTerminalText(currentAttention.decision.setupName)}`,\n attentionComparison?.remoteOnly.length === 0 && attentionComparison.localOnly.length === 0\n ? \"Only the synced-content order differs.\"\n : `Remote-only paths: ${attentionComparison?.remoteOnly.length ?? 0} \u00B7 Device-only paths: ${attentionComparison?.localOnly.length ?? 0}`,\n \"Nothing has been changed.\",\n ]\n : currentObservation\n ? [\n `Startup check (${safeTerminalText(currentObservation.checkedAt)}): ${observationSummary(currentObservation)}`,\n \"Check-time observation only; synchronization rechecks current content.\",\n ]\n : [\"Remote status: Not checked\"]),\n ...(noSyncedContent\n ? [\"\", \"No included content is selected. Choose included content in Settings before syncing.\"]\n : []),\n \"\",\n \"What do you want to do?\",\n ];\n return {\n title: (changesBlocked ? [\"Manage sync\", ...operationStatusLines(operation)] : ordinaryTitle).join(\"\\n\"),\n actions: operationActions(operation, noSyncedContent, canSwitch, mainActions),\n operation,\n ...(currentObservation ? { observation: currentObservation } : {}),\n ...(currentAttention\n ? {\n attention: currentAttention,\n attentionBlocksSync: currentAttention.decision.setupName === config.setupName,\n attentionReviewDisabled: changesBlocked,\n }\n : {}),\n };\n } catch (error) {\n if (signal?.aborted) throw error;\n return {\n title: [\n \"Manage sync\",\n \"\",\n \"Settings need attention. Automatic sync is paused.\",\n `Current sync setup: ${safeTerminalText(typeof raw.activeSyncSetup === \"string\" ? raw.activeSyncSetup : \"none\")}`,\n `Error: ${safeTerminalText(errorMessage(error))}`,\n `File: ${safeTerminalText(await activeLocalConfigPath())}`,\n \"\",\n \"What do you want to do?\",\n ].join(\"\\n\"),\n actions: [\"Sync setups\u2026\", \"Storage connections\u2026\", \"History & recovery\u2026\", \"Help\"],\n };\n }\n}\n\nfunction operationActions(\n operation: OperationAvailability,\n noSyncedContent: boolean,\n canSwitch: boolean,\n mainActions: string[],\n) {\n if (operationCanRecover(operation)) {\n return [\"Restore sync access\u2026 (recommended)\", \"Status & changes\", \"History & recovery\u2026\", \"Help\"];\n }\n if (operation.kind !== \"free\") {\n return [\"Refresh operation status\", \"Status & changes\", \"History & recovery\u2026\", \"Help\"];\n }\n return noSyncedContent\n ? [\"Settings\", ...(canSwitch ? [\"Switch sync setup\"] : []), \"Status & changes\", \"More\u2026\"]\n : mainActions;\n}\n\nfunction operationStatusLines(operation: OperationAvailability): string[] {\n switch (operation.kind) {\n case \"free\":\n return [];\n case \"live\": {\n const command = truncateToWidth(safeTerminalText(operation.lock.command), 16, \"\u2026\");\n return [`Running: ${command} (pid ${operation.lock.pid}). Wait, then refresh; Settings and More return.`];\n }\n case \"busy\":\n return [\"Pi-sync may be starting or finishing. Wait, then refresh; Settings and More remain unavailable.\"];\n case \"recoverable-stale\":\n return [\"Sync paused: old lock remains. Close other Pi sessions then restore; Settings and More return.\"];\n case \"recoverable-unreadable\":\n return [\"Sync paused: owner unknown. Close other Pi sessions then restore; Settings and More return.\"];\n case \"inspection-error\":\n return [\"Lock check failed. Fix path access, then refresh; Settings and More remain unavailable.\"];\n }\n}\n\nexport function backendStorageDescription(config: AnySyncConfig) {\n const connection = safeTerminalText(config.connectionName);\n switch (config.backend.type) {\n case \"s3\": {\n const type =\n config.backend.profile.kind === \"r2\" || isCloudflareR2Endpoint(config.backend.profile.endpoint)\n ? \"Cloudflare R2\"\n : \"S3-compatible\";\n return `${type} \u00B7 ${connection} \u00B7 ${safeTerminalText(config.backend.destination.bucket)}`;\n }\n case \"webdav\":\n return `WebDAV \u00B7 ${connection} \u00B7 ${safeTerminalText(config.backend.destination.path)}`;\n case \"git\":\n return `Git \u00B7 ${connection} \u00B7 ${safeTerminalText(config.backend.destination.branch)}`;\n }\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport { loadConfig } from \"../settings/config.js\";\nimport { readLocalConfigObject } from \"../settings/settings-store.js\";\nimport { ownRecord } from \"../settings/settings-validation.js\";\nimport { syncErrorGuidance } from \"../sync/sync-error-guidance.js\";\nimport { syncIncludeSelection } from \"../sync/sync-policy.js\";\nimport { safeTerminalText } from \"./terminal-text.js\";\n\nexport async function countValidSyncSetups(setups: Record<string, unknown> | undefined, signal?: AbortSignal) {\n let count = 0;\n for (const name of Object.keys(setups ?? {})) {\n throwIfAborted(signal);\n let valid = false;\n try {\n await loadConfig(name);\n valid = true;\n } catch {\n // Invalid setups stay visible in management but are not switchable.\n }\n throwIfAborted(signal);\n if (valid) count += 1;\n }\n return count;\n}\n\nfunction throwIfAborted(signal?: AbortSignal) {\n if (!signal?.aborted) return;\n throw signal.reason instanceof Error ? signal.reason : new DOMException(\"The operation was aborted\", \"AbortError\");\n}\n\ntype SyncSetupActions = {\n add(signal?: AbortSignal): Promise<void>;\n edit(name: string, signal?: AbortSignal): Promise<void>;\n makeCurrent(name: string, signal?: AbortSignal): Promise<\"exit\" | undefined>;\n remove(name: string, signal?: AbortSignal): Promise<void>;\n};\n\ninterface SetupMenuState {\n setups: Record<string, unknown>;\n active?: string;\n selected?: {\n name: string;\n detail: string[];\n valid: boolean;\n removeUnavailable: boolean;\n };\n}\n\nexport async function showSyncSetups(\n ctx: ExtensionCommandContext,\n actions: SyncSetupActions,\n signal?: AbortSignal,\n): Promise<\"exit\" | undefined> {\n let selectedName: string | undefined;\n let exit = false;\n const nameById = new Map<string, string>();\n type Screen = \"list\" | \"detail\";\n type Action = \"add\" | \"select\" | \"make-current\" | \"edit\" | \"remove\" | \"back\";\n const menu = defineMenu<SetupMenuState, Screen, Action, ExtensionCommandContext>({\n start: \"list\",\n screens: {\n list: ({ state }) => {\n nameById.clear();\n const names = Object.keys(state.setups).sort((left, right) => left.localeCompare(right));\n return {\n kind: \"actions\",\n title: \"Sync setups\",\n lines: [\"What to sync, where to store it, and when to sync.\"],\n items: [\n { id: \"add\", label: \"Add sync setup\", action: \"add\" },\n ...names.map((name, index) => {\n const id = `setup:${index}`;\n nameById.set(id, name);\n return {\n id,\n label: `${safeTerminalText(name)}${name === state.active ? \" (current)\" : \"\"}`,\n description: setupSummary(state.setups[name]),\n action: \"select\" as const,\n };\n }),\n ],\n hint: \"back\",\n };\n },\n detail: ({ state }) => ({\n kind: \"actions\",\n title: state.selected ? `Sync setup \u201C${safeTerminalText(state.selected.name)}\u201D` : \"Sync setup\",\n lines: state.selected?.detail ?? [\"This sync setup no longer exists.\"],\n items: state.selected\n ? [\n ...(!state.selected.name || state.selected.name === state.active || !state.selected.valid\n ? []\n : [\n {\n id: \"make-current\",\n label: \"Make current\u2026\",\n action: \"make-current\" as const,\n },\n ]),\n { id: \"edit\", label: \"Edit storage location\u2026\", action: \"edit\" },\n ...(state.selected.removeUnavailable\n ? []\n : [\n {\n id: \"remove\",\n label: \"Remove sync setup\u2026\",\n action: \"remove\" as const,\n },\n ]),\n { id: \"back\", label: \"Back\", action: \"back\" },\n ]\n : [{ id: \"back\", label: \"Back\", action: \"back\" }],\n hint: \"back\",\n }),\n },\n actions: {\n add: async () => {\n try {\n await actions.add(signal);\n } catch (error) {\n if (!signal?.aborted) {\n ctx.ui.notify(`Sync setup was not added: ${menuErrorMessage(error)}`, \"error\");\n }\n }\n return { kind: \"stay\" };\n },\n select: async ({ itemId }) => {\n selectedName = nameById.get(itemId);\n return selectedName ? { kind: \"to\", screen: \"detail\" } : { kind: \"rejected\" };\n },\n \"make-current\": async () => {\n if (!selectedName) return { kind: \"rejected\" };\n try {\n exit = (await actions.makeCurrent(selectedName, signal)) === \"exit\";\n return exit ? { kind: \"close\" } : { kind: \"stay\" };\n } catch (error) {\n notifySetupChangeError(ctx, selectedName, error, signal);\n return { kind: \"stay\" };\n }\n },\n edit: async () => {\n if (!selectedName) return { kind: \"rejected\" };\n try {\n await actions.edit(selectedName, signal);\n } catch (error) {\n notifySetupChangeError(ctx, selectedName, error, signal);\n }\n return { kind: \"stay\" };\n },\n remove: async () => {\n if (!selectedName) return { kind: \"rejected\" };\n const name = selectedName;\n try {\n await actions.remove(name, signal);\n selectedName = undefined;\n return { kind: \"back\" };\n } catch (error) {\n notifySetupChangeError(ctx, name, error, signal);\n return { kind: \"stay\" };\n }\n },\n back: async () => {\n selectedName = undefined;\n return { kind: \"back\" };\n },\n },\n });\n await runMenu(ctx, menu, {\n getState: async () => loadSetupMenuState(selectedName, signal),\n signal,\n isCurrent: () => !signal?.aborted,\n });\n return exit ? \"exit\" : undefined;\n}\n\nasync function loadSetupMenuState(selectedName: string | undefined, signal?: AbortSignal): Promise<SetupMenuState> {\n const raw = await readLocalConfigObject();\n throwIfAborted(signal);\n const setups = ownRecord(raw?.syncSetups) ?? {};\n const active = typeof raw?.activeSyncSetup === \"string\" ? raw.activeSyncSetup : undefined;\n if (!selectedName || !ownRecord(setups[selectedName])) return { setups, active };\n const setupCount = Object.keys(setups).length;\n const isCurrent = selectedName === active;\n let detail: string[];\n let valid = true;\n try {\n const config = await loadConfig(selectedName);\n throwIfAborted(signal);\n const selection = syncIncludeSelection(config.include);\n detail = [\n `Status: ${isCurrent ? \"Current\" : \"Not current\"}`,\n `Storage connection: ${safeTerminalText(config.connectionName)}`,\n `Endpoint: ${storageEndpoint(config)}`,\n `Storage location: ${storageLocation(config)}`,\n `Included content: ${selection.builtIns.length} built-in groups \u00B7 ${selection.custom.length} extra paths`,\n `Sessions: ${selection.sessions ? \"On \u2014 privacy-sensitive\" : \"Off\"}`,\n `Automatic sync: ${config.automatic ? \"On\" : \"Off\"}`,\n isCurrent\n ? \"Edit included content and automatic sync in /sync \u2192 Settings.\"\n : \"To edit included content or automatic sync, make this setup current, then open /sync \u2192 Settings.\",\n ];\n } catch (error) {\n valid = false;\n detail = [\n `Status: Invalid${isCurrent ? \" current setup\" : \"\"}`,\n `Reason: ${menuErrorMessage(error)}`,\n \"Make current and sync are unavailable until this setup is repaired.\",\n ];\n }\n const removeUnavailable = isCurrent && setupCount > 1;\n if (removeUnavailable) detail.push(\"Remove unavailable: switch to another setup first.\");\n return {\n setups,\n active,\n selected: { name: selectedName, detail, valid, removeUnavailable },\n };\n}\n\nfunction notifySetupChangeError(ctx: ExtensionCommandContext, name: string, error: unknown, signal?: AbortSignal) {\n if (signal?.aborted) return;\n ctx.ui.notify(`Sync setup \u201C${safeTerminalText(name)}\u201D was not changed: ${menuErrorMessage(error)}`, \"error\");\n}\n\nfunction menuErrorMessage(error: unknown) {\n return syncErrorGuidance(error);\n}\n\nfunction setupSummary(value: unknown) {\n const storage = ownRecord(ownRecord(value)?.storage);\n if (!storage || typeof storage.connection !== \"string\") return \"Invalid storage reference\";\n return safeTerminalText(\n `${storage.connection} \u00B7 ${storage.bucket ?? storage.branch ?? \"WebDAV\"} \u00B7 ${storage.path ?? \"missing path\"}`,\n );\n}\n\nfunction storageEndpoint(config: Awaited<ReturnType<typeof loadConfig>>) {\n switch (config.backend.type) {\n case \"s3\":\n return safeTerminalText(config.backend.profile.endpoint);\n case \"git\":\n return safeTerminalText(config.backend.profile.remote);\n case \"webdav\":\n return safeTerminalText(config.backend.profile.url);\n }\n}\n\nfunction storageLocation(config: Awaited<ReturnType<typeof loadConfig>>) {\n switch (config.backend.type) {\n case \"s3\":\n return safeTerminalText(`${config.backend.destination.bucket}/${config.storagePath}`);\n case \"git\":\n return safeTerminalText(`Git \u00B7 ${config.backend.destination.branch}:${config.storagePath}`);\n case \"webdav\":\n return safeTerminalText(`WebDAV \u00B7 ${config.storagePath}`);\n }\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport { loadConfig } from \"../settings/config.js\";\nimport { localConfigPath } from \"../settings/config-file.js\";\nimport { updateSyncSetup } from \"../settings/settings-management.js\";\nimport { updateLocalConfig } from \"../settings/settings-store.js\";\nimport {\n SETUP_SWITCH_ACTION_OPTIONS,\n saveOnSwitch,\n setupSwitchActionFromLabel,\n setupSwitchActionLabel,\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 { configureSyncStatus } from \"./sync-status.js\";\nimport { safeTerminalText } from \"./terminal-text.js\";\n\nexport type SyncSettingsRoute = RunRoute;\n\nexport async function showSyncSettings(\n ctx: ExtensionCommandContext,\n runRoute: SyncSettingsRoute,\n signal?: AbortSignal,\n) {\n if (ctx.mode !== \"tui\") {\n ctx.ui.notify(`Edit pi-sync settings manually: ${safeTerminalText(localConfigPath())}`, \"info\");\n return;\n }\n const initial = await loadConfig();\n if (signal?.aborted) return;\n const setupName = initial.setupName;\n type Action = \"automatic\" | \"skip-secret-scan\" | \"show-status\" | \"on-switch\" | \"include\" | \"remote-include\";\n const menu = defineMenu<Awaited<ReturnType<typeof loadConfig>>, \"settings\", Action, ExtensionCommandContext>({\n start: \"settings\",\n screens: {\n settings: ({ state }) => ({\n kind: \"settings\",\n title: \"Pi Sync Settings\",\n lines: [\n `Sync setup: ${safeTerminalText(state.setupName)} \u00B7 Storage connection: ${safeTerminalText(state.connectionName)}`,\n ],\n items: [\n {\n id: \"automatic\",\n label: \"Automatic sync\",\n description: AUTOMATIC_SYNC_DESCRIPTION,\n currentValue: state.automatic ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"automatic\",\n },\n {\n id: \"skipSecretScan\",\n label: \"Skip secret scan (all setups)\",\n description: \"All setups: allow pushes without checking managed local files for possible secrets.\",\n currentValue: state.skipSecretScan ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"skip-secret-scan\",\n },\n {\n id: \"showStatus\",\n label: \"Show status (all setups)\",\n description: \"All setups: show sync progress and attention in Pi status.\",\n currentValue: state.showStatus ? \"On\" : \"Off\",\n values: [\"On\", \"Off\"],\n action: \"show-status\",\n },\n {\n id: \"onSwitch\",\n label: \"After switching setup (all setups)\",\n description: \"All setups: ask before a pull review, open it automatically, or switch without pulling.\",\n currentValue: setupSwitchActionLabel(state.onSwitch),\n values: SETUP_SWITCH_ACTION_OPTIONS.map(({ label }) => label),\n action: \"on-switch\",\n },\n {\n id: \"include\",\n label: \"Included content\",\n description: `${state.include.length} selected path${state.include.length === 1 ? \"\" : \"s\"}. Choose which paths this setup syncs.`,\n currentValue: \"Open editor\",\n action: \"include\",\n },\n {\n id: \"remoteInclude\",\n label: \"Compare synced content\",\n description: \"Review this device and remote content lists before choosing either one.\",\n currentValue: \"Review\",\n action: \"remote-include\",\n },\n ],\n }),\n },\n actions: {\n automatic: async ({ value, signal: actionSignal }) => {\n const automatic = value === \"On\";\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n try {\n const latest = await loadConfig(setupName);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n if (latest.automatic === automatic) return { kind: \"stay\" };\n await updateSyncSetup(setupName, (setup) => ({ ...setup, sync: { ...setup.sync, automatic } }), {\n signal: mutationSignal,\n });\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n ctx.ui.notify(\n `Automatic sync ${automatic ? \"enabled\" : \"disabled\"} for \u201C${safeTerminalText(setupName)}\u201D.`,\n \"info\",\n );\n return { kind: \"stay\" };\n } catch (error) {\n if (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n \"skip-secret-scan\": async ({ value, signal: actionSignal }) => {\n const skipSecretScan = value === \"On\";\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n try {\n const latest = await loadConfig(setupName);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n if (latest.skipSecretScan === skipSecretScan) return { kind: \"stay\" };\n await updateLocalConfig((settings) => ({ ...settings, skipSecretScan }), mutationSignal);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n ctx.ui.notify(`Secret scan ${skipSecretScan ? \"disabled\" : \"enabled\"} for pushes in all setups.`, \"info\");\n return { kind: \"stay\" };\n } catch (error) {\n if (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n \"show-status\": async ({ value, signal: actionSignal }) => {\n const showStatus = value === \"On\";\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n try {\n const latest = await loadConfig(setupName);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n if (latest.showStatus === showStatus) return { kind: \"stay\" };\n await updateLocalConfig((settings) => ({ ...settings, showStatus }), mutationSignal);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n configureSyncStatus(ctx, showStatus);\n ctx.ui.notify(`Pi Sync status ${showStatus ? \"enabled\" : \"disabled\"} for all setups.`, \"info\");\n return { kind: \"stay\" };\n } catch (error) {\n if (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n \"on-switch\": async ({ value, signal: actionSignal }) => {\n const action = value ? setupSwitchActionFromLabel(value) : undefined;\n if (!action) return { kind: \"rejected\" };\n const mutationSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n try {\n const latest = await loadConfig(setupName);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n if (latest.onSwitch === action) return { kind: \"stay\" };\n await saveOnSwitch(action, mutationSignal);\n if (mutationSignal.aborted) return { kind: \"rejected\" };\n ctx.ui.notify(`After switching setup: ${value}.`, \"info\");\n return { kind: \"stay\" };\n } catch (error) {\n if (!mutationSignal.aborted) notifySaveFailure(ctx, error);\n return { kind: \"rejected\" };\n }\n },\n include: async ({ signal: actionSignal }) => {\n const editorSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n await runRoute(\"files\", editorSignal, undefined, setupName);\n return editorSignal.aborted ? { kind: \"rejected\" } : { kind: \"stay\" };\n },\n \"remote-include\": async ({ signal: actionSignal }) => {\n const reviewSignal = signal ? AbortSignal.any([signal, actionSignal]) : actionSignal;\n const { showRemoteSelectionReview } = await import(\"./remote-selection-ui.js\");\n if (reviewSignal.aborted) return { kind: \"rejected\" };\n const review = await showRemoteSelectionReview(ctx, setupName, reviewSignal, undefined, {\n origin: \"settings\",\n runRoute,\n });\n if (reviewSignal.aborted) return { kind: \"rejected\" };\n if (review.kind === \"route-result\") {\n const disposition = await dispatchManagerResult(ctx, review.result, review.route, runRoute, reviewSignal);\n return disposition.kind === \"close\" ? { kind: \"close\" } : { kind: \"stay\" };\n }\n return review.kind === \"closed\" || review.kind === \"stale\" ? { kind: \"close\" } : { kind: \"stay\" };\n },\n },\n });\n await runMenu(ctx, menu, {\n getState: () => loadConfig(setupName),\n signal,\n isCurrent: () => !signal?.aborted,\n });\n}\n\nfunction notifySaveFailure(ctx: ExtensionCommandContext, error: unknown) {\n ctx.ui.notify(`Pi Sync settings save failed: ${error instanceof Error ? error.message : String(error)}`, \"error\");\n}\n", "import { isDeepStrictEqual } from \"node:util\";\nimport type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport {\n addStorageConnection,\n removeStorageConnection,\n updateStorageConnection,\n} from \"../settings/settings-management.js\";\nimport { readLocalConfigObject } from \"../settings/settings-store.js\";\nimport { isCloudflareR2Endpoint, normalizeS3Endpoint, ownRecord } from \"../settings/settings-validation.js\";\nimport { syncErrorGuidance } from \"../sync/sync-error-guidance.js\";\nimport { showAddGitStorageProfile, showEditGitStorageProfile } from \"./setup/git-ui.js\";\nimport { applyS3CredentialUpdate, chooseS3Credentials, chooseS3CredentialUpdate } from \"./setup/s3-credentials-ui.js\";\nimport { promptResourceName } from \"./setup/setup-prompts.js\";\nimport { saveReviewedDraft } from \"./setup/setup-review.js\";\nimport { requiredInput, requiredValueInput } from \"./setup/text-input.js\";\nimport { showAddWebDavStorageProfile, showEditWebDavStorageProfile } from \"./setup/webdav-ui.js\";\nimport { safeTerminalText } from \"./terminal-text.js\";\n\nexport async function showStorageConnections(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n let selectedName: string | undefined;\n const nameById = new Map<string, string>();\n type Screen = \"list\" | \"detail\";\n type Action = \"add\" | \"select\" | \"edit\" | \"remove\" | \"back\";\n const menu = defineMenu<Awaited<ReturnType<typeof loadStorageMenuState>>, Screen, Action, ExtensionCommandContext>({\n start: \"list\",\n screens: {\n list: ({ state }) => {\n nameById.clear();\n const names = Object.keys(state.profiles).sort((left, right) => left.localeCompare(right));\n return {\n kind: \"actions\",\n title: \"Storage connections\",\n lines: state.version3\n ? [\"Server addresses and sign-in details, reusable across sync setups.\"]\n : [\"Create version 3 settings before managing storage connections.\"],\n items: state.version3\n ? [\n { id: \"add\", label: \"Add storage connection\", action: \"add\" as const },\n ...names.map((name, index) => {\n const id = `connection:${index}`;\n nameById.set(id, name);\n return {\n id,\n label: safeTerminalText(name),\n description: connectionSummary(ownRecord(state.profiles[name]) ?? {}),\n action: \"select\" as const,\n };\n }),\n ]\n : [],\n hint: \"back\",\n };\n },\n detail: ({ state }) => ({\n kind: \"actions\",\n title: state.selected ? `Storage connection \u201C${safeTerminalText(state.selected.name)}\u201D` : \"Storage connection\",\n lines: state.selected?.lines ?? [\"This storage connection no longer exists.\"],\n items: state.selected\n ? [\n { id: \"edit\", label: \"Edit storage connection\u2026\", action: \"edit\" },\n ...(state.selected.usedBy.length === 0\n ? [\n {\n id: \"remove\",\n label: \"Remove storage connection\u2026\",\n action: \"remove\" as const,\n },\n ]\n : []),\n { id: \"back\", label: \"Back\", action: \"back\" },\n ]\n : [{ id: \"back\", label: \"Back\", action: \"back\" }],\n hint: \"back\",\n }),\n },\n actions: {\n add: async () => {\n try {\n await showAddStorageConnection(ctx, signal);\n } catch (error) {\n if (!signal?.aborted) {\n ctx.ui.notify(`Storage connection was not added: ${syncErrorGuidance(error)}`, \"error\");\n }\n }\n return { kind: \"stay\" };\n },\n select: async ({ itemId }) => {\n selectedName = nameById.get(itemId);\n return selectedName ? { kind: \"to\", screen: \"detail\" } : { kind: \"rejected\" };\n },\n edit: async ({ state }) => {\n if (!state.selected || state.selected.name !== selectedName) return { kind: \"rejected\" };\n try {\n await editStorageConnection(ctx, state.selected.name, state.selected.profile, state.selected.usedBy, signal);\n } catch (error) {\n notifyConnectionError(ctx, state.selected.name, error, signal);\n }\n return { kind: \"stay\" };\n },\n remove: async ({ state }) => {\n if (!state.selected || state.selected.name !== selectedName) return { kind: \"rejected\" };\n const name = state.selected.name;\n const confirmed = await ctx.ui.confirm(\n \"Remove storage connection?\",\n `Remove local storage connection \u201C${safeTerminalText(name)}\u201D? Remote data and history are not deleted.`,\n { signal },\n );\n if (!confirmed || signal?.aborted) return { kind: \"rejected\" };\n try {\n await removeStorageConnection(name, signal);\n ctx.ui.notify(`Removed storage connection \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n selectedName = undefined;\n return { kind: \"back\" };\n } catch (error) {\n notifyConnectionError(ctx, name, error, signal);\n return { kind: \"stay\" };\n }\n },\n back: async () => {\n selectedName = undefined;\n return { kind: \"back\" };\n },\n },\n });\n await runMenu(ctx, menu, {\n getState: () => loadStorageMenuState(selectedName, signal),\n signal,\n isCurrent: () => !signal?.aborted,\n });\n}\n\nasync function loadStorageMenuState(selectedName: string | undefined, signal?: AbortSignal) {\n const raw = await readLocalConfigObject();\n if (signal?.aborted) throw signal.reason;\n const profiles = ownRecord(raw?.storageConnections) ?? {};\n const profile = selectedName ? ownRecord(profiles[selectedName]) : undefined;\n if (!selectedName || !profile) {\n return { version3: raw?.version === 3, profiles, selected: undefined };\n }\n const usedBy = referencingSetups(raw, selectedName);\n return {\n version3: raw?.version === 3,\n profiles,\n selected: {\n name: selectedName,\n profile,\n usedBy,\n lines: [\n `Type: ${connectionType(profile)}`,\n `Endpoint: ${connectionEndpoint(profile)}`,\n `Credentials: ${credentialSource(profile)}`,\n `Used by: ${usedBy.length > 0 ? usedBy.map(safeTerminalText).join(\", \") : \"No sync setups\"}`,\n ...(usedBy.length > 0\n ? [\n \"Remove unavailable: remove the listed sync setups first. Switch away from a current setup before removing it if other setups remain.\",\n ]\n : []),\n ],\n },\n };\n}\n\nfunction notifyConnectionError(ctx: ExtensionCommandContext, name: string, error: unknown, signal?: AbortSignal) {\n if (signal?.aborted) return;\n ctx.ui.notify(`Storage connection \u201C${safeTerminalText(name)}\u201D was not changed: ${syncErrorGuidance(error)}`, \"error\");\n}\n\nasync function editStorageConnection(\n ctx: ExtensionCommandContext,\n name: string,\n profile: Record<string, unknown>,\n usedBy: string[],\n signal?: AbortSignal,\n) {\n if (ctx.mode !== \"tui\") {\n ctx.ui.notify(\n \"Editing storage connections requires TUI mode for safe credential handling. Edit the private version 3 settings file instead.\",\n \"warning\",\n );\n return;\n }\n if (profile.type === \"webdav\") {\n await showEditWebDavStorageProfile(\n ctx,\n name,\n { ...profile, kind: \"webdav\", ...(ownRecord(profile.credentials) ?? {}) },\n signal,\n usedBy,\n );\n return;\n }\n if (profile.type === \"git\") {\n await showEditGitStorageProfile(ctx, name, { ...profile, kind: \"git\" }, signal, usedBy);\n return;\n }\n const endpoint = await requiredInput(\n ctx,\n \"Endpoint\",\n String(profile.endpoint ?? \"https://s3.example.com\"),\n signal,\n normalizeS3Endpoint,\n );\n if (!endpoint || signal?.aborted) return;\n const region = await requiredInput(\n ctx,\n \"Region\\n\\nUse your bucket's region; Cloudflare R2 uses auto.\",\n String(profile.region ?? \"auto\"),\n signal,\n );\n if (!region || signal?.aborted) return;\n const storedCredentials = ownRecord(profile.credentials) ?? {};\n const credentials = await chooseS3CredentialUpdate(ctx, { ...profile, ...storedCredentials }, signal);\n if (!credentials || signal?.aborted) return;\n const saved = await saveReviewedDraft(\n ctx,\n \"Review storage connection\",\n [\n `Storage connection: ${safeTerminalText(name)}`,\n `Endpoint: ${safeTerminalText(String(profile.endpoint ?? \"missing\"))} \u2192 ${safeTerminalText(endpoint)}`,\n `Region: ${safeTerminalText(String(profile.region ?? \"auto\"))} \u2192 ${safeTerminalText(region)}`,\n `Credentials: ${safeTerminalText(credentials.summary)}`,\n `Affected sync setups: ${usedBy.length > 0 ? usedBy.map(safeTerminalText).join(\", \") : \"None\"}`,\n \"Saving changes future storage access for every affected setup; it does not move remote data.\",\n ],\n \"Save storage connection\",\n (saveSignal) =>\n updateStorageConnection(\n name,\n (current) => {\n if (current.type !== \"s3\" || !isDeepStrictEqual(current, profile)) {\n throw new Error(\"Storage connection changed while it was open; reopen it.\");\n }\n return {\n ...current,\n endpoint,\n region,\n credentials: applyS3CredentialUpdate(current.credentials, credentials) as typeof current.credentials,\n };\n },\n usedBy,\n saveSignal,\n ),\n signal,\n );\n if (!saved || signal?.aborted) return;\n ctx.ui.notify(`Saved storage connection \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n}\n\nexport async function showAddStorageConnection(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n if (ctx.mode !== \"tui\") {\n ctx.ui.notify(\n \"Adding storage connections requires TUI mode for safe credential handling. Edit the private version 3 settings file instead.\",\n \"warning\",\n );\n return false;\n }\n const preset = await ctx.ui.select(\n \"Storage type\",\n [\"Cloudflare R2\", \"Other S3-compatible storage\", \"WebDAV\", \"Git\", \"Cancel\"],\n { signal },\n );\n if (signal?.aborted || !preset || preset === \"Cancel\") return false;\n if (preset === \"WebDAV\") return showAddWebDavStorageProfile(ctx, signal);\n if (preset === \"Git\") return showAddGitStorageProfile(ctx, signal);\n const name = await promptResourceName(ctx, \"storage connection\", preset === \"Cloudflare R2\" ? \"r2\" : \"s3\", signal);\n if (!name || signal?.aborted) return false;\n const endpoint = await requiredValueInput(\n ctx,\n \"S3 API endpoint\\n\\nUse the API URL from your storage provider, not its web console.\",\n preset === \"Cloudflare R2\" ? \"https://<account-id>.r2.cloudflarestorage.com\" : \"https://s3.example.com\",\n signal,\n normalizeS3Endpoint,\n );\n if (!endpoint || signal?.aborted) return false;\n const region =\n preset === \"Cloudflare R2\"\n ? \"auto\"\n : await requiredInput(\n ctx,\n \"Region\\n\\nUse the region assigned to your bucket by the provider.\",\n \"us-east-1\",\n signal,\n );\n if (!region || signal?.aborted) return false;\n const credentials = await chooseS3Credentials(ctx, signal);\n if (!credentials || signal?.aborted) return false;\n const saved = await saveReviewedDraft(\n ctx,\n \"Review storage connection\",\n [\n `Name: ${safeTerminalText(name)}`,\n `Type: ${preset}`,\n `Endpoint: ${safeTerminalText(endpoint)}`,\n `Region: ${safeTerminalText(region)}`,\n `Credentials: ${safeTerminalText(credentials.summary)}`,\n \"Adding a connection does not contact remote storage or start syncing.\",\n ],\n \"Add storage connection\",\n (saveSignal) =>\n addStorageConnection(\n name,\n {\n type: \"s3\",\n endpoint,\n region,\n credentials: {\n accessKeyId: credentials.profileFields.accessKeyId ?? \"\",\n secretAccessKey: credentials.profileFields.secretAccessKey ?? \"\",\n },\n },\n saveSignal,\n ),\n signal,\n );\n if (!saved) return false;\n if (signal?.aborted) return true;\n ctx.ui.notify(`Added storage connection \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n return true;\n}\n\nfunction referencingSetups(raw: Record<string, unknown> | undefined, connection: string) {\n return Object.entries(ownRecord(raw?.syncSetups) ?? {})\n .filter(([, value]) => ownRecord(ownRecord(value)?.storage)?.connection === connection)\n .map(([name]) => name)\n .sort((left, right) => left.localeCompare(right));\n}\n\nexport function connectionSummary(profile: Record<string, unknown>) {\n return `${connectionType(profile)} \u00B7 ${connectionEndpoint(profile)}`;\n}\n\nfunction connectionType(profile: Record<string, unknown>) {\n if (profile.type === \"git\") return \"Git\";\n if (profile.type === \"webdav\") return \"WebDAV\";\n if (profile.type === \"s3\" && typeof profile.endpoint === \"string\" && isCloudflareR2Endpoint(profile.endpoint)) {\n return \"Cloudflare R2\";\n }\n return \"S3-compatible\";\n}\n\nfunction connectionEndpoint(profile: Record<string, unknown>) {\n const value = profile.type === \"git\" ? profile.remote : profile.type === \"webdav\" ? profile.url : profile.endpoint;\n if (typeof value !== \"string\" || value.length === 0) return \"Missing\";\n if (profile.type === \"git\") return safeTerminalText(value);\n try {\n const url = new URL(value);\n return safeTerminalText(`${url.origin}${url.pathname}`);\n } catch {\n return \"Invalid\";\n }\n}\n\nfunction credentialSource(profile: Record<string, unknown>) {\n if (profile.type === \"git\") return \"Git credential helper or SSH configuration\";\n const credentials = ownRecord(profile.credentials);\n if (profile.type === \"webdav\") return credentials?.password ? \"Settings file\" : \"Missing\";\n if (credentials?.accessKeyId && credentials.secretAccessKey) return \"Settings file\";\n return \"Missing\";\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport { loadConfig, syncConfigReviewIdentity } from \"../../settings/config.js\";\nimport { loadOnSwitch, readLocalConfigObject } from \"../../settings/settings-store.js\";\nimport type { AnySyncConfig } from \"../../settings/settings-types.js\";\nimport { ownRecord } from \"../../settings/settings-validation.js\";\nimport { useSyncSetup } from \"../../sync/setup-switch.js\";\nimport { errorMessage } from \"../../sync/sync-errors.js\";\nimport { automaticSyncSummary } from \"../automatic-sync-summary.js\";\nimport { type RunRoute, runCancellableOperation } from \"../cancellable-operation.js\";\nimport { dispatchManagerResult } from \"../manager-result-dispatcher.js\";\nimport { backendStorageDescription } from \"../manager-state.js\";\nimport { safeTerminalText } from \"../terminal-text.js\";\n\nasync function selectSetupForSwitch(\n ctx: ExtensionCommandContext,\n raw: Record<string, unknown>,\n targets: Record<string, unknown>,\n active: string | undefined,\n signal?: AbortSignal,\n) {\n let selectedName: string | undefined;\n const nameById = new Map<string, string>();\n const profiles = ownRecord(raw.storageConnections);\n const menu = defineMenu<undefined, \"setups\", \"select\", ExtensionCommandContext>({\n start: \"setups\",\n screens: {\n setups: () => ({\n kind: \"actions\",\n title: \"Switch sync setup\",\n lines: [`Current sync setup: ${safeTerminalText(active ?? \"none\")}`],\n items: Object.keys(targets)\n .sort((left, right) => left.localeCompare(right))\n .map((candidate, index) => {\n const target = ownRecord(targets[candidate]);\n const storage = ownRecord(target?.storage);\n const profileName = typeof storage?.connection === \"string\" ? storage.connection : undefined;\n const profile = profileName && profiles ? ownRecord(profiles[profileName]) : undefined;\n const location = profile\n ? profile.type === \"git\"\n ? `${String(storage?.branch ?? \"missing branch\")}:${String(storage?.path ?? \"missing path\")}`\n : profile.type === \"s3\"\n ? `${String(storage?.bucket ?? \"missing bucket\")}/${String(storage?.path ?? \"missing path\")}`\n : String(storage?.path ?? \"missing path\")\n : `invalid: missing connection ${profileName ?? \"reference\"}`;\n const id = `setup:${index}`;\n nameById.set(id, candidate);\n return {\n id,\n label: `${safeTerminalText(candidate)}${candidate === active ? \" (current)\" : \"\"}`,\n description: `${safeTerminalText(profileName ?? \"unknown\")} \u00B7 ${safeTerminalText(location)}`,\n action: \"select\" as const,\n };\n }),\n hint: \"close\",\n }),\n },\n actions: {\n select: async ({ itemId }) => {\n selectedName = nameById.get(itemId);\n return { kind: \"close\" };\n },\n },\n });\n await runMenu(ctx, menu, {\n getState: () => undefined,\n signal,\n isCurrent: () => !signal?.aborted,\n });\n return selectedName;\n}\n\nexport async function showSetupSwitcher(\n ctx: ExtensionCommandContext,\n runRoute: RunRoute,\n selectedName?: string,\n signal?: AbortSignal,\n) {\n const raw = await readLocalConfigObject();\n if (signal?.aborted) return false;\n if (raw?.version !== 3) {\n ctx.ui.notify(\"Add a second sync setup before switching setups.\", \"info\");\n return false;\n }\n const targets = ownRecord(raw.syncSetups);\n if (!targets) {\n ctx.ui.notify(\"No sync setups are configured.\", \"warning\");\n return false;\n }\n const active = typeof raw.activeSyncSetup === \"string\" ? raw.activeSyncSetup : undefined;\n let name = selectedName;\n if (!name) {\n name = await selectSetupForSwitch(ctx, raw, targets, active, signal);\n if (!name) return false;\n }\n if (!name || !Object.hasOwn(targets, name)) {\n ctx.ui.notify(`Sync setup \u201C${safeTerminalText(name ?? \"unknown\")}\u201D no longer exists.`, \"warning\");\n return false;\n }\n if (name === active) {\n ctx.ui.notify(`Sync setup \u201C${safeTerminalText(name)}\u201D is already current.`, \"info\");\n return false;\n }\n let config: AnySyncConfig;\n try {\n config = await loadConfig(name);\n if (signal?.aborted) return false;\n } catch (error) {\n ctx.ui.notify(\n `Cannot use sync setup \u201C${safeTerminalText(name)}\u201D: ${safeTerminalText(errorMessage(error))}`,\n \"error\",\n );\n return false;\n }\n const onSwitch = await loadOnSwitch();\n if (signal?.aborted) return false;\n const switchEffect =\n onSwitch === \"ask-before-pull\"\n ? \"After switching, pi-sync will ask whether to review a pull for this setup.\"\n : onSwitch === \"pull-after-switch\"\n ? \"After switching, pi-sync will check this setup and show exact changes before applying them.\"\n : \"After switching, pi-sync will not pull or modify synced files.\";\n const confirmed = await ctx.ui.confirm(\n \"Switch sync setup?\",\n [\n `From: ${safeTerminalText(active ?? \"none\")}`,\n `To: ${safeTerminalText(name)}`,\n `Storage: ${backendStorageDescription(config)}`,\n `Included content: ${config.include.length} paths`,\n `Automatic sync: ${automaticSyncSummary(config.automatic)} \u00B7 Sessions: ${config.include.includes(\"sessions\") ? \"On\" : \"Off\"}`,\n \"\",\n switchEffect,\n ].join(\"\\n\"),\n { signal },\n );\n if (signal?.aborted || !confirmed) return false;\n try {\n let pullClosed = false;\n const result = await useSyncSetup(\n ctx,\n name,\n async (selectedTarget) => {\n const pullResult = await runCancellableOperation(\n ctx,\n `Pulling sync setup \u201C${safeTerminalText(name)}\u201D\u2026`,\n \"pull\",\n runRoute,\n {\n commitAware: true,\n cancelledMessage: null,\n target: selectedTarget,\n signal,\n },\n );\n const disposition = await dispatchManagerResult(ctx, pullResult, \"pull\", runRoute, signal);\n if (pullResult.kind === \"closed\" || pullResult.kind.endsWith(\"required\")) {\n pullClosed = disposition.kind === \"close\";\n }\n if (disposition.appliedRoute === \"pull\") return \"applied\";\n if (pullResult.kind === \"completed\") return pullResult.outcome;\n return pullResult.kind === \"cancelled\" ? \"cancelled\" : undefined;\n },\n onSwitch,\n signal,\n syncConfigReviewIdentity(config),\n );\n if (pullClosed) return \"closed\";\n return result.pullApplied ? \"pull-attempted\" : \"switched\";\n } catch (error) {\n if (signal?.aborted) return false;\n ctx.ui.notify(\n `Sync setup \u201C${safeTerminalText(name)}\u201D was not switched: ${safeTerminalText(errorMessage(error))}`,\n \"error\",\n );\n return false;\n }\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { refreshTargetCompletions } from \"../../commands/setup-completions.js\";\nimport { loadPartialConfig } from \"../../settings/config.js\";\nimport { removeSyncSetup } from \"../../settings/settings-management.js\";\nimport { readLocalConfigObject } from \"../../settings/settings-store.js\";\nimport { ownRecord } from \"../../settings/settings-validation.js\";\nimport type { RunRoute } from \"../cancellable-operation.js\";\nimport { showAddStorageConnection } from \"../storage-connections-ui.js\";\nimport { showSyncSetups } from \"../sync-setups-ui.js\";\nimport { safeTerminalText } from \"../terminal-text.js\";\nimport { showAddGitTarget, showEditGitTarget } from \"./git-ui.js\";\nimport { showAddS3Target, showEditS3Target } from \"./s3-ui.js\";\nimport { promptResourceName } from \"./setup-prompts.js\";\nimport { showSetupSwitcher } from \"./setup-switcher.js\";\nimport { showAddWebDavTarget, showEditWebDavTarget } from \"./webdav-ui.js\";\n\nexport async function showSyncSetupManager(ctx: ExtensionCommandContext, runRoute: RunRoute, signal?: AbortSignal) {\n return showSyncSetups(\n ctx,\n {\n add: async (setupSignal) => {\n await showAddTarget(ctx, setupSignal);\n },\n edit: async (name, setupSignal) => {\n await showEditTarget(ctx, name, setupSignal);\n },\n makeCurrent: async (name, setupSignal) => {\n const result = await showSetupSwitcher(ctx, runRoute, name, setupSignal);\n return result === \"pull-attempted\" || result === \"closed\" ? \"exit\" : undefined;\n },\n remove: async (name, setupSignal) => {\n await showRemoveTarget(ctx, name, setupSignal);\n },\n },\n signal,\n );\n}\n\nasync function showAddTarget(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n let raw = await readLocalConfigObject();\n if (signal?.aborted) return;\n if (!raw) return void ctx.ui.notify(\"Set up the first sync setup before adding another.\", \"info\");\n if (raw.version !== 3) {\n ctx.ui.notify(\"Version 1 and version 2 settings are unsupported and are never migrated.\", \"error\");\n return;\n }\n let profiles = ownRecord(raw.storageConnections) ?? {};\n const name = await promptResourceName(ctx, \"sync setup\", \"work\", signal);\n if (!name) return;\n const createConnection = \"Add a new storage connection\u2026\";\n let profile = await ctx.ui.select(\n \"Choose a storage connection\\n\\nReuse a server address and sign-in details. A new connection is saved separately and remains if you cancel this setup.\",\n [...Object.keys(profiles).sort(), createConnection, \"Cancel\"],\n { signal },\n );\n if (signal?.aborted || !profile || profile === \"Cancel\") return;\n if (profile === createConnection) {\n const previousNames = new Set(Object.keys(profiles));\n if (!(await showAddStorageConnection(ctx, signal))) return;\n if (signal?.aborted) return;\n raw = (await readLocalConfigObject()) ?? raw;\n if (signal?.aborted) return;\n profiles = ownRecord(raw.storageConnections) ?? {};\n profile = Object.keys(profiles).find((candidate) => !previousNames.has(candidate));\n if (!profile) return;\n ctx.ui.notify(\n `Connection \u201C${safeTerminalText(profile)}\u201D saved. Cancelling setup will keep this connection.`,\n \"info\",\n );\n }\n const storageKind = ownRecord(profiles[profile])?.type;\n if (storageKind === \"webdav\") {\n const saved = await showAddWebDavTarget(ctx, name, profile, signal);\n if (signal?.aborted) return;\n if (saved) await refreshTargetCompletions();\n return;\n }\n if (storageKind === \"git\") {\n const saved = await showAddGitTarget(ctx, name, profile, signal);\n if (signal?.aborted) return;\n if (saved) await refreshTargetCompletions();\n return;\n }\n await showAddS3Target(ctx, raw, profile, name, signal);\n}\n\nasync function showEditTarget(ctx: ExtensionCommandContext, name: string, signal?: AbortSignal) {\n const partial = await loadPartialConfig(name);\n if (signal?.aborted) return;\n if (!partial.setupName) {\n ctx.ui.notify(\"Create version 3 settings before editing a named sync setup.\", \"info\");\n return;\n }\n if (partial.storageKind === \"webdav\") {\n await showEditWebDavTarget(ctx, partial, signal);\n return;\n }\n if (partial.storageKind === \"git\") {\n await showEditGitTarget(ctx, partial, signal);\n return;\n }\n await showEditS3Target(ctx, partial, signal);\n}\n\nasync function showRemoveTarget(ctx: ExtensionCommandContext, name: string, signal?: AbortSignal) {\n const confirmed = await ctx.ui.confirm(\n \"Remove sync setup?\",\n `Remove local sync setup \u201C${safeTerminalText(name)}\u201D? Remote data and history are not deleted.`,\n { signal },\n );\n if (signal?.aborted || !confirmed) return;\n await removeSyncSetup(name, signal);\n if (signal?.aborted) return;\n await refreshTargetCompletions();\n if (signal?.aborted) return;\n ctx.ui.notify(`Removed sync setup \u201C${safeTerminalText(name)}\u201D; remote data was not deleted.`, \"info\");\n}\n"],
5
- "mappings": "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",
6
- "names": ["defineMenu", "runMenu", "defineMenu", "runMenu", "defineMenu", "runMenu", "defineMenu", "runMenu", "defineMenu", "runMenu", "defineMenu", "runMenu", "defineMenu", "runMenu", "defineMenu", "runMenu"]
7
- }
@@ -1,22 +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-7KHKWL3Q.ts";
6
- import "./chunk-Q32CQWPM.ts";
7
- import "./chunk-HGJH56KR.ts";
8
- import "./chunk-K3RIEL6J.ts";
9
- import "./chunk-MSSW6F3R.ts";
10
- import "./chunk-2RZSQWBH.ts";
11
- import "./chunk-4MPIH46N.ts";
12
- import "./chunk-2JZFHNLM.ts";
13
- import "./chunk-T2SJD3N7.ts";
14
- import "./chunk-7D5SF7P3.ts";
15
- import "./chunk-EEJPYTWE.ts";
16
- import "./chunk-SWUXA3MH.ts";
17
- import "./chunk-OVDTF5CH.ts";
18
- import "./chunk-IVXEDPAD.ts";
19
- export {
20
- showRemoteSelectionReview
21
- };
22
- //# sourceMappingURL=remote-selection-ui-TZTJF32Y.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 type BackendDiagnostic,\n type ExpectedRemoteHead,\n type PublishSnapshotOptions,\n type PublishSnapshotResult,\n type RemoteHead,\n type RemoteHistoryEntry,\n type SyncBackend,\n SyncBackendConflictError,\n SyncBackendPublicationOutcomeUnknownError,\n} from \"../sync-backend.js\";\nimport { S3Client, S3ObjectAlreadyExistsError } from \"./s3-client.js\";\n\nconst VERSION = 1;\nconst POST_COMMIT_TIMEOUT_MS = 30_000;\n\nexport class S3SyncBackend implements SyncBackend {\n readonly identity: string;\n readonly destination: string;\n readonly capability = \"read-check-write-verify\" as const;\n private readonly checksums = new Map<string, string>();\n\n constructor(\n private readonly config: ResolvedS3Backend,\n private readonly postCommitTimeoutMs = POST_COMMIT_TIMEOUT_MS,\n ) {\n assertSafeDestination(config);\n this.identity = s3BackendIdentity(config);\n this.destination = s3Destination(config);\n }\n\n sameRevision(left: string, right: string) {\n return left === right;\n }\n\n async readHead(signal?: AbortSignal): Promise<RemoteHead | undefined> {\n const object = await new S3Client(this.config, signal).getJson<LatestPointer>(latestKey(this.config));\n throwIfAborted(signal);\n if (object.missing) return undefined;\n const pointer = requirePointer(\n object.value,\n \"Remote latest pointer is malformed.\",\n this.config.destination.namespace,\n );\n this.registerChecksum(pointer.snapshot, pointer.sha256);\n return remoteHead(pointer, this.identity, object.etag);\n }\n\n async readSnapshot(reference: string, signal?: AbortSignal): Promise<Snapshot> {\n const expectedChecksum = this.checksums.get(reference) ?? (await this.resolveChecksum(reference, signal));\n const object = await new S3Client(this.config, signal).getBuffer(snapshotKey(this.config, reference));\n throwIfAborted(signal);\n if (!object.value) throw new Error(`Snapshot not found: ${reference}`);\n if (expectedChecksum && sha256(object.value) !== expectedChecksum) {\n throw new Error(\"Remote snapshot checksum mismatch.\");\n }\n const snapshot = await decodeSnapshot(object.value, { signal });\n if (snapshot.id !== reference || snapshot.profile !== this.config.destination.namespace) {\n throw new Error(\"Remote snapshot identity mismatch.\");\n }\n validateSnapshotBundle(snapshot);\n return snapshot;\n }\n\n async publishSnapshot(\n snapshot: Snapshot,\n expected: ExpectedRemoteHead,\n options: PublishSnapshotOptions = {},\n ): Promise<PublishSnapshotResult> {\n throwIfAborted(options.signal);\n assertSnapshotIdentity(snapshot, this.config.destination.namespace);\n const stagedKey = snapshotKey(this.config, snapshot.id);\n const encoded = await encodeSnapshot(snapshot);\n throwIfAborted(options.signal);\n const pointer = pointerFor(this.config, snapshot, sha256(encoded));\n const cancellableClient = new S3Client(this.config, options.signal);\n try {\n await cancellableClient.putBuffer(stagedKey, encoded, \"application/gzip\", {\n ifAbsent: true,\n });\n } catch (error) {\n if (!(error instanceof S3ObjectAlreadyExistsError)) throw error;\n const existing = await cancellableClient.getBuffer(stagedKey);\n if (!existing.value || sha256(existing.value) !== pointer.sha256) {\n throw new SyncBackendConflictError(\n `Immutable snapshot id already exists with different content: ${snapshot.id}`,\n );\n }\n }\n const currentObject = await cancellableClient.getJson<LatestPointer>(latestKey(this.config));\n throwIfAborted(options.signal);\n let current: RemoteHead | undefined;\n if (!currentObject.missing) {\n const currentPointer = requirePointer(\n currentObject.value,\n \"Remote latest pointer is malformed.\",\n this.config.destination.namespace,\n );\n this.registerChecksum(currentPointer.snapshot, currentPointer.sha256);\n current = remoteHead(currentPointer, this.identity, currentObject.etag);\n }\n if (!matchesExpected(current, expected)) {\n throw new SyncBackendConflictError(\"Remote changed while pushing. Run /sync pull first, then retry.\", {\n currentHead: current,\n });\n }\n throwIfAborted(options.signal);\n options.onCommit?.();\n\n // The active-head PUT is the publication boundary. Do not bind it or its\n // verification to a user-cancellation signal after the boundary begins.\n const commitClient = new S3Client(this.config, AbortSignal.timeout(this.postCommitTimeoutMs));\n try {\n await commitClient.putJson(latestKey(this.config), pointer);\n } catch (error) {\n throw new SyncBackendPublicationOutcomeUnknownError(\n `Remote publication outcome is unknown: ${errorMessage(error)}`,\n { cause: error },\n );\n }\n\n let verifiedObject: RemoteObject<LatestPointer>;\n try {\n verifiedObject = await commitClient.getJson<LatestPointer>(latestKey(this.config));\n } catch (error) {\n throw new SyncBackendPublicationOutcomeUnknownError(\n `Remote snapshot may be active, but publication could not be verified: ${errorMessage(error)}`,\n { cause: error },\n );\n }\n let verifiedPointer: LatestPointer;\n try {\n verifiedPointer = requirePointer(\n verifiedObject.value,\n \"Remote latest pointer is malformed after publication.\",\n this.config.destination.namespace,\n );\n } catch (error) {\n throw new SyncBackendPublicationOutcomeUnknownError(\n `Remote snapshot may be active, but publication verification was malformed: ${errorMessage(error)}`,\n { cause: error },\n );\n }\n if (!samePointer(verifiedPointer, pointer)) {\n throw new SyncBackendConflictError(\n \"Remote latest changed immediately after push. Run /sync status before continuing.\",\n {\n phase: \"after-commit\",\n currentHead: remoteHead(verifiedPointer, this.identity, verifiedObject.etag),\n candidateMayHaveBeenActive: true,\n },\n );\n }\n this.registerChecksum(verifiedPointer.snapshot, verifiedPointer.sha256);\n const head = remoteHead(verifiedPointer, this.identity, verifiedObject.etag);\n const warning = await this.updateHistorySafely(commitClient, pointer);\n return { head, warnings: warning ? [warning] : [] };\n }\n\n async listHistory(signal?: AbortSignal): Promise<RemoteHistoryEntry[]> {\n const object = await new S3Client(this.config, signal).getJson<{\n version: number;\n snapshots: LatestPointer[];\n }>(historyKey(this.config));\n throwIfAborted(signal);\n if (object.missing) return [];\n const pointers = requireHistory(object.value, this.config.destination.namespace);\n for (const pointer of pointers) {\n const known = this.checksums.get(pointer.snapshot);\n if (known && known !== pointer.sha256) {\n throw new Error(\"Remote history conflicts with an already observed snapshot checksum.\");\n }\n }\n for (const pointer of pointers) this.registerChecksum(pointer.snapshot, pointer.sha256);\n return pointers.map(remoteHistoryEntry);\n }\n\n async diagnose(signal?: AbortSignal): Promise<BackendDiagnostic[]> {\n throwIfAborted(signal);\n const diagnostics: BackendDiagnostic[] = [\n {\n key: \"s3-config\",\n level: \"info\",\n message: `s3 config: ok (${this.config.destination.bucket}/${storageRoot(this.config)})`,\n },\n ...sessionTokenWarnings(this.config.profile).map((message) => ({\n key: \"s3-session-token\",\n level: \"warning\" as const,\n message,\n })),\n ];\n const deadline = AbortSignal.timeout(10_000);\n const probeSignal = signal ? AbortSignal.any([signal, deadline]) : deadline;\n try {\n const result = await new S3Client(this.config, probeSignal).diagnoseRead(latestKey(this.config));\n throwIfAborted(probeSignal);\n const messages = {\n readable: \"s3 remote read: HTTP success. Snapshot contents and write access are not tested.\",\n \"missing-key\":\n \"s3 remote read: no snapshot at this path (NoSuchKey). Write access is not tested; verify the bucket and path before first sync.\",\n \"missing-bucket\":\n \"s3 remote read: bucket not found (NoSuchBucket). Create the bucket with your provider or edit the setup's bucket name.\",\n \"unknown-404\":\n \"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 };\n diagnostics.push({\n key: \"s3-read\",\n level: result === \"readable\" ? \"info\" : \"warning\",\n message: messages[result],\n });\n } catch (error) {\n throwIfAborted(signal);\n diagnostics.push({\n key: \"s3-read\",\n level: \"warning\",\n message: syncErrorGuidance(deadline.aborted ? new Error(\"S3 diagnostic request timed out.\") : error),\n });\n }\n return diagnostics;\n }\n\n private async resolveChecksum(reference: string, signal?: AbortSignal) {\n await this.readHead(signal);\n const headChecksum = this.checksums.get(reference);\n if (headChecksum) return headChecksum;\n await this.listHistory(signal);\n return this.checksums.get(reference);\n }\n\n private registerChecksum(reference: string, checksum: string) {\n const known = this.checksums.get(reference);\n if (known && known !== checksum) {\n throw new Error(\"Remote snapshot reference was rebound to a different checksum.\");\n }\n this.checksums.set(reference, checksum);\n }\n\n private async updateHistorySafely(client: S3Client, pointer: LatestPointer) {\n try {\n await this.updateHistory(client, pointer);\n return undefined;\n } catch (error) {\n return `Remote snapshot is active, but history could not be updated: ${errorMessage(error)}. Run /sync doctor before relying on history.`;\n }\n }\n\n private async updateHistory(client: S3Client, pointer: LatestPointer) {\n const object = await client.getJson<{ version: number; snapshots: LatestPointer[] }>(historyKey(this.config));\n const snapshots = object.missing ? [] : requireHistory(object.value, this.config.destination.namespace);\n const next = [...snapshots.filter((snapshot) => snapshot.snapshot !== pointer.snapshot), pointer].slice(-100);\n await client.putJson(historyKey(this.config), { version: VERSION, snapshots: next });\n }\n}\n\nexport function latestKey(config: ResolvedS3Backend) {\n return posixJoin(storageRoot(config), \"latest.json\");\n}\n\nexport function historyKey(config: ResolvedS3Backend) {\n return posixJoin(storageRoot(config), \"history.json\");\n}\n\nexport function snapshotKey(config: ResolvedS3Backend, id: string) {\n requireSnapshotReference(id);\n return posixJoin(storageRoot(config), \"snapshots\", `${id}.json.gz`);\n}\n\nexport function storageRoot(config: ResolvedS3Backend) {\n return config.destination.prefix === \"./\" ? \"\" : config.destination.prefix;\n}\n\nexport function pointerFor(config: ResolvedS3Backend, snapshot: Snapshot, checksum: string): LatestPointer {\n return {\n version: VERSION,\n profile: config.destination.namespace,\n snapshot: snapshot.id,\n sha256: checksum,\n createdAt: snapshot.createdAt,\n machine: snapshot.machine,\n syncSessions: snapshot.syncSessions === true || snapshot.files.some((file) => file.path.startsWith(\"sessions/\")),\n ...(snapshot.selection === undefined ? {} : { selection: snapshot.selection }),\n };\n}\n\nexport function s3BackendIdentity(config: ResolvedS3Backend) {\n const destination = JSON.stringify([\n secretFreeEndpoint(config.profile.endpoint),\n trimSlashes(config.destination.bucket),\n trimSlashes(config.destination.prefix),\n ]);\n return `s3:${sha256(Buffer.from(destination))}`;\n}\n\nfunction s3Destination(config: ResolvedS3Backend) {\n let host = secretFreeEndpoint(config.profile.endpoint);\n try {\n host = new URL(host).hostname;\n } catch {\n host = \"invalid S3 endpoint\";\n }\n return `${host} \u00B7 ${config.destination.bucket}/${storageRoot(config)}`;\n}\n\nfunction secretFreeEndpoint(value: string) {\n const normalized = value.trim();\n try {\n const url = new URL(normalized);\n url.username = \"\";\n url.password = \"\";\n return url.toString();\n } catch {\n return normalized.replace(/\\/\\/[^/@\\s]+@/u, \"//\");\n }\n}\n\nfunction trimSlashes(value: string) {\n return value.replace(/^\\/+|\\/+$/g, \"\");\n}\n\nfunction remoteHistoryEntry(pointer: LatestPointer): RemoteHistoryEntry {\n return {\n snapshotRef: pointer.snapshot,\n snapshotId: pointer.snapshot,\n createdAt: pointer.createdAt,\n machine: pointer.machine,\n syncSessions: pointer.syncSessions === true,\n };\n}\n\nfunction remoteHead(pointer: LatestPointer, identity: string, etag?: string): RemoteHead {\n return {\n snapshotRef: pointer.snapshot,\n snapshotId: pointer.snapshot,\n revision: `s3:${sha256(Buffer.from(canonicalJson([identity, etag ?? null, pointer])))}`,\n createdAt: pointer.createdAt,\n machine: pointer.machine,\n syncSessions: pointer.syncSessions === true,\n ...(pointer.selection === undefined ? {} : { selection: pointer.selection }),\n };\n}\n\nfunction samePointer(left: LatestPointer, right: LatestPointer) {\n return canonicalJson(left) === canonicalJson(right);\n}\n\nfunction canonicalJson(value: unknown) {\n return JSON.stringify(canonicalValue(value));\n}\n\nfunction canonicalValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalValue);\n if (!value || typeof value !== \"object\") return value;\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .map((key) => [key, canonicalValue((value as Record<string, unknown>)[key])]),\n );\n}\n\nfunction matchesExpected(head: RemoteHead | undefined, expected: ExpectedRemoteHead) {\n if (expected.kind === \"missing\") return head === undefined;\n return head?.revision === expected.revision;\n}\n\nfunction requirePointer(value: LatestPointer | undefined, message: string, expectedProfile: string) {\n if (\n !value ||\n value.version !== VERSION ||\n value.profile !== expectedProfile ||\n typeof value.snapshot !== \"string\" ||\n !isSafeSnapshotReference(value.snapshot) ||\n typeof value.sha256 !== \"string\" ||\n !/^[0-9a-f]{64}$/.test(value.sha256) ||\n typeof value.createdAt !== \"string\" ||\n !isSafeMetadata(value.createdAt, 64) ||\n typeof value.machine !== \"string\" ||\n !isSafeMetadata(value.machine, 256) ||\n (value.syncSessions !== undefined && typeof value.syncSessions !== \"boolean\")\n ) {\n throw new Error(message);\n }\n if (value.selection !== undefined) portableSnapshotSelection(value.selection);\n return value;\n}\n\nfunction requireHistory(value: { version: number; snapshots: LatestPointer[] } | undefined, expectedProfile: string) {\n if (!value || value.version !== VERSION || !Array.isArray(value.snapshots)) {\n throw new Error(\"Remote history is malformed.\");\n }\n const pointers = value.snapshots.map((pointer) =>\n requirePointer(pointer, \"Remote history entry is malformed.\", expectedProfile),\n );\n const references = new Set<string>();\n for (const pointer of pointers) {\n if (references.has(pointer.snapshot)) {\n throw new Error(\"Remote history contains duplicate snapshot references.\");\n }\n references.add(pointer.snapshot);\n }\n return pointers;\n}\n\nfunction assertSnapshotIdentity(snapshot: Snapshot, expectedProfile: string) {\n if (\n snapshot.version !== VERSION ||\n snapshot.profile !== expectedProfile ||\n !isSafeSnapshotReference(snapshot.id) ||\n !isSafeMetadata(snapshot.createdAt, 64) ||\n !isSafeMetadata(snapshot.machine, 256) ||\n !Array.isArray(snapshot.files)\n ) {\n throw new Error(\"Invalid snapshot identity for S3 publication.\");\n }\n}\n\nfunction validateSnapshotBundle(snapshot: Snapshot) {\n const paths = new Set<string>();\n for (const file of snapshot.files) {\n if (\n !file ||\n typeof file.path !== \"string\" ||\n typeof file.contentBase64 !== \"string\" ||\n typeof file.sha256 !== \"string\" ||\n !/^[0-9a-f]{64}$/.test(file.sha256) ||\n paths.has(file.path)\n ) {\n throw new Error(\"Remote snapshot bundle is malformed.\");\n }\n const content = Buffer.from(file.contentBase64, \"base64\");\n if (content.toString(\"base64\") !== file.contentBase64 || sha256(content) !== file.sha256) {\n throw new Error(\"Remote snapshot file checksum mismatch.\");\n }\n paths.add(file.path);\n }\n}\n\nfunction assertSafeDestination(config: ResolvedS3Backend) {\n for (const [label, value, allowEmpty] of [\n [\"bucket\", config.destination.bucket, false],\n [\"prefix\", config.destination.prefix, true],\n [\"namespace\", config.destination.namespace, false],\n ] as const) {\n if (label === \"prefix\" && value === \"./\") continue;\n if (\n (!allowEmpty && value.length === 0) ||\n value.includes(\"\\\\\") ||\n hasControlCharacter(value) ||\n value.split(\"/\").some((segment) => segment === \".\" || segment === \"..\")\n ) {\n throw new Error(`Invalid S3 storage location ${label}.`);\n }\n }\n}\n\nfunction requireSnapshotReference(reference: string) {\n if (!isSafeSnapshotReference(reference)) {\n throw new Error(\"Invalid S3 snapshot reference.\");\n }\n}\n\nfunction isSafeSnapshotReference(reference: string) {\n return (\n reference.length > 0 &&\n reference.length <= 512 &&\n reference !== \".\" &&\n reference !== \"..\" &&\n !reference.includes(\"/\") &&\n !reference.includes(\"\\\\\") &&\n !hasControlCharacter(reference)\n );\n}\n\nfunction isSafeMetadata(value: string, maxLength: number) {\n return value.length > 0 && value.length <= maxLength && !hasControlCharacter(value);\n}\n\nfunction hasControlCharacter(value: string) {\n return [...value].some((character) => {\n const code = character.codePointAt(0) ?? 0;\n return code < 0x20 || code === 0x7f;\n });\n}\n\nfunction throwIfAborted(signal?: AbortSignal) {\n if (!signal?.aborted) return;\n throw signal.reason instanceof Error ? signal.reason : new DOMException(\"The operation was aborted\", \"AbortError\");\n}\n\nfunction sha256(value: Buffer) {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction errorMessage(error: unknown) {\n return 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 return date.toISOString().replace(/[:-]|\\.\\d{3}/g, \"\");\n}\n\nfunction isCloudflareR2Endpoint(endpoint: string | undefined) {\n const value = endpoint?.trim();\n if (!value) return false;\n try {\n const hostname = new URL(value).hostname.toLowerCase();\n return hostname === \"r2.cloudflarestorage.com\" || hostname.endsWith(\".r2.cloudflarestorage.com\");\n } catch {\n return false;\n }\n}\n\nexport class S3ObjectAlreadyExistsError extends Error {\n constructor(readonly key: string) {\n super(`S3 object already exists: ${key}`);\n this.name = \"S3ObjectAlreadyExistsError\";\n }\n}\n\nexport class S3HttpError extends Error {\n constructor(\n message: string,\n readonly status: number,\n ) {\n super(message);\n this.name = \"S3HttpError\";\n }\n}\n\nexport class S3Client {\n private config: ResolvedS3Backend;\n private endpoint: URL;\n private signal?: AbortSignal;\n private requestTimeoutMs: number;\n private omitSessionTokenAfterRejection = false;\n\n constructor(config: ResolvedS3Backend, signal?: AbortSignal, requestTimeoutMs = DEFAULT_REQUEST_TIMEOUT_MS) {\n this.config = config;\n this.endpoint = new URL(config.profile.endpoint);\n this.signal = signal;\n this.requestTimeoutMs = requestTimeoutMs;\n }\n\n /** Read-only access probe. A bare 404 cannot distinguish a missing key from a missing bucket. */\n async diagnoseRead(key: string): Promise<\"readable\" | \"missing-key\" | \"missing-bucket\" | \"unknown-404\"> {\n this.signal?.throwIfAborted();\n const response = await this.request(\"GET\", key);\n if (response.ok) {\n await response.body?.cancel();\n this.signal?.throwIfAborted();\n return \"readable\";\n }\n const detail = await this.readErrorText(response);\n this.signal?.throwIfAborted();\n if (response.status === 404) {\n const code = /<Code>\\s*([A-Za-z]+)\\s*<\\/Code>/u.exec(detail)?.[1];\n if (code === \"NoSuchBucket\") return \"missing-bucket\";\n if (code === \"NoSuchKey\") return \"missing-key\";\n return \"unknown-404\";\n }\n throw new S3HttpError(`S3 remote read failed (HTTP ${response.status}).`, response.status);\n }\n\n async getJson<T>(key: string): Promise<RemoteObject<T>> {\n const maxAttempts = 3;\n let lastError: unknown;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const object = await this.request(\"GET\", key);\n if (object.status === 404) return { missing: true };\n if (!object.ok) {\n throw new S3HttpError(`S3 GET failed (${object.status}): ${await this.readErrorText(object)}`, object.status);\n }\n const body = await readBoundedText(object, MAX_JSON_RESPONSE_BYTES, \"S3 JSON response\");\n // R2 can intermittently return an empty 200 body (read-after-write\n // inconsistency on a long-lived keep-alive connection), which makes\n // response.json() throw \"JSON Parse error: Unexpected EOF\" under Bun.\n // Retry so the transient blip is absorbed instead of surfacing as a\n // \"pi-sync auto sync skipped\" warning on every session start.\n if (body.length > 0) {\n return {\n value: JSON.parse(body) as T,\n etag: normalizeEtag(object.headers.get(\"etag\")),\n missing: false,\n };\n }\n lastError = new Error(`S3 GET returned an empty body for ${key}`);\n if (attempt < maxAttempts) {\n await sleep(250 * attempt, undefined, { signal: this.signal });\n }\n }\n throw lastError;\n }\n\n async getBuffer(key: string): Promise<RemoteObject<Buffer>> {\n const maxAttempts = 3;\n let lastError: unknown;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const object = await this.request(\"GET\", key);\n if (object.status === 404) return { missing: true };\n if (!object.ok) {\n throw new S3HttpError(`S3 GET failed (${object.status}): ${await this.readErrorText(object)}`, object.status);\n }\n const buffer = await readBoundedBuffer(object, MAX_SNAPSHOT_RESPONSE_BYTES, \"S3 snapshot response\");\n // R2 can intermittently return an empty 200 body on a long-lived\n // keep-alive connection (same root cause as the getJson retry\n // above). getBuffer is only used for snapshot .json.gz payloads,\n // which are always non-empty, so an empty body is a transient\n // blip, not a legitimate response. Retry so the checksum guard\n // downstream doesn't surface it as \"Remote snapshot checksum\n // mismatch\".\n if (buffer.length > 0) {\n return { value: buffer, etag: normalizeEtag(object.headers.get(\"etag\")), missing: false };\n }\n lastError = new Error(`S3 GET returned an empty body for ${key}`);\n if (attempt < maxAttempts) {\n await sleep(250 * attempt, undefined, { signal: this.signal });\n }\n }\n throw lastError;\n }\n\n async putJson(key: string, value: unknown) {\n const body = Buffer.from(JSON.stringify(value, null, \"\\t\"), \"utf8\");\n await this.putBuffer(key, body, \"application/json\");\n }\n\n async putBuffer(key: string, body: Buffer, contentType: string, options: { ifAbsent?: boolean } = {}) {\n const headers: Record<string, string> = { \"content-type\": contentType };\n if (options.ifAbsent) headers[\"if-none-match\"] = \"*\";\n const response = await this.request(\"PUT\", key, body, headers);\n if (options.ifAbsent && response.status === 412) {\n throw new S3ObjectAlreadyExistsError(key);\n }\n if (!response.ok) {\n throw new S3HttpError(\n `S3 PUT failed (${response.status}): ${await this.readErrorText(response)}`,\n response.status,\n );\n }\n }\n\n private async request(method: \"GET\" | \"PUT\", key: string, body?: Buffer, extraHeaders: Record<string, string> = {}) {\n const url = new URL(this.endpoint.toString());\n url.pathname = posixJoin(url.pathname, this.config.destination.bucket, encodeKey(key));\n const send = async (sessionToken: string | undefined) => {\n const transportSignal = this.transportSignal();\n const headers = await signedHeaders({\n method,\n url,\n body,\n extraHeaders,\n accessKeyId: this.config.profile.accessKeyId,\n secretAccessKey: this.config.profile.secretAccessKey,\n sessionToken,\n region: this.config.profile.region,\n });\n try {\n return await fetch(url, {\n method,\n headers,\n body: body ? new Uint8Array(body) : undefined,\n signal: transportSignal,\n });\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") throw error;\n if (error instanceof Error && error.name === \"TimeoutError\") {\n throw new Error(\"S3 request timed out.\", { cause: error });\n }\n throw new Error(`S3 request failed: ${this.redact(errorMessage(error))}`, { cause: error });\n }\n };\n const sessionToken = this.omitSessionTokenAfterRejection ? undefined : this.config.profile.sessionToken;\n const response = await send(sessionToken);\n try {\n if (!(await this.shouldRetryWithoutSessionToken(response, sessionToken))) return response;\n } catch (error) {\n await response.body?.cancel().catch(() => undefined);\n throw error;\n }\n await response.body?.cancel();\n const retry = await send(undefined);\n if (retry.ok || retry.status === 404) this.omitSessionTokenAfterRejection = true;\n return retry;\n }\n\n private transportSignal() {\n const timeout = AbortSignal.timeout(this.requestTimeoutMs);\n return this.signal ? AbortSignal.any([this.signal, timeout]) : timeout;\n }\n\n private async shouldRetryWithoutSessionToken(response: Response, sessionToken: string | undefined) {\n if (\n !sessionToken ||\n !isCloudflareR2Endpoint(this.config.profile.endpoint) ||\n response.ok ||\n response.status !== 400\n ) {\n return false;\n }\n return isSecurityTokenInvalidArgument(\n await readBoundedText(response.clone(), MAX_ERROR_RESPONSE_BYTES, \"S3 error response\"),\n );\n }\n\n private async readErrorText(response: Response) {\n try {\n return this.redact(await readBoundedText(response, MAX_ERROR_RESPONSE_BYTES, \"S3 error response\"));\n } catch (error) {\n return this.redact(errorMessage(error));\n }\n }\n\n private redact(value: string) {\n let redacted = value;\n let endpointUsername: string | undefined;\n let endpointPassword: string | undefined;\n let endpointQueryValues: string[] = [];\n try {\n const endpoint = new URL(this.config.profile.endpoint);\n endpointUsername = endpoint.username;\n endpointPassword = endpoint.password;\n endpointQueryValues = [...endpoint.searchParams.values()];\n } catch {\n // The constructor already validates normal runtime endpoints.\n }\n for (const secret of [\n this.config.profile.accessKeyId,\n this.config.profile.secretAccessKey,\n this.config.profile.sessionToken,\n endpointUsername,\n endpointPassword,\n ...endpointQueryValues,\n ]) {\n if (secret) redacted = redacted.replaceAll(secret, \"[REDACTED]\");\n }\n return redacted;\n }\n}\n\nasync function readBoundedText(response: Response, limit: number, label: string) {\n return (await readBoundedBuffer(response, limit, label)).toString(\"utf8\");\n}\n\nasync function readBoundedBuffer(response: Response, limit: number, label: string) {\n const contentLength = Number(response.headers.get(\"content-length\"));\n if (Number.isFinite(contentLength) && contentLength > limit) {\n // Do not await cancellation of a cloned stream before its sibling can be released.\n void response.body?.cancel().catch(() => undefined);\n throw new Error(`${label} exceeds the ${limit}-byte limit.`);\n }\n if (!response.body) return Buffer.alloc(0);\n const reader = response.body.getReader();\n const chunks: Buffer[] = [];\n let total = 0;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n total += value.byteLength;\n if (total > limit) {\n void reader.cancel().catch(() => undefined);\n throw new Error(`${label} exceeds the ${limit}-byte limit.`);\n }\n chunks.push(Buffer.from(value));\n }\n } finally {\n reader.releaseLock();\n }\n return Buffer.concat(chunks, total);\n}\n\nfunction errorMessage(error: unknown) {\n return error instanceof Error ? error.message : String(error);\n}\n\nasync function signedHeaders(input: {\n method: string;\n url: URL;\n body?: Buffer;\n extraHeaders: Record<string, string>;\n accessKeyId: string;\n secretAccessKey: string;\n sessionToken?: string;\n region: string;\n}) {\n const now = new Date();\n const amzDate = iso8601Basic(now);\n const dateStamp = amzDate.slice(0, 8);\n const payloadHash = sha256(input.body ?? Buffer.alloc(0));\n const headers: Record<string, string> = {\n ...lowercaseKeys(input.extraHeaders),\n host: input.url.host,\n \"x-amz-content-sha256\": payloadHash,\n \"x-amz-date\": amzDate,\n };\n if (input.sessionToken) headers[\"x-amz-security-token\"] = input.sessionToken;\n const signedHeaderNames = Object.keys(headers).sort();\n const canonicalHeaders = signedHeaderNames.map((name) => `${name}:${headers[name]?.trim()}\\n`).join(\"\");\n const canonicalRequest = [\n input.method,\n input.url.pathname,\n input.url.searchParams.toString(),\n canonicalHeaders,\n signedHeaderNames.join(\";\"),\n payloadHash,\n ].join(\"\\n\");\n const scope = `${dateStamp}/${input.region}/s3/aws4_request`;\n const stringToSign = [\"AWS4-HMAC-SHA256\", amzDate, scope, sha256(Buffer.from(canonicalRequest))].join(\"\\n\");\n const signingKey = hmac(\n hmac(hmac(hmac(Buffer.from(`AWS4${input.secretAccessKey}`), dateStamp), input.region), \"s3\"),\n \"aws4_request\",\n );\n const signature = createHmac(\"sha256\", signingKey).update(stringToSign).digest(\"hex\");\n return {\n ...headers,\n authorization: `AWS4-HMAC-SHA256 Credential=${input.accessKeyId}/${scope}, SignedHeaders=${signedHeaderNames.join(\";\")}, Signature=${signature}`,\n };\n}\n\nfunction hmac(key: Buffer, value: string) {\n return createHmac(\"sha256\", key).update(value).digest();\n}\n\nfunction sha256(value: Buffer) {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction lowercaseKeys(value: Record<string, string>) {\n return Object.fromEntries(Object.entries(value).map(([key, item]) => [key.toLowerCase(), item]));\n}\n\nfunction normalizeEtag(value: string | null) {\n return value ?? undefined;\n}\n\nfunction isSecurityTokenInvalidArgument(text: string) {\n return text.includes(\"<Code>InvalidArgument</Code>\") && text.includes(\"<Message>X-Amz-Security-Token</Message>\");\n}\n"],
5
- "mappings": "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",
6
- "names": ["createHash", "sessionToken", "sha256", "errorMessage", "createHash"]
7
- }