@narumitw/pi-sync 0.50.3 → 0.51.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/README.md +4 -1
  2. package/dist/chunks/{chunk-6LP3MCR2.ts → chunk-2JZFHNLM.ts} +3 -5
  3. package/dist/chunks/chunk-2JZFHNLM.ts.map +7 -0
  4. package/dist/chunks/{chunk-LCRI3ABW.ts → chunk-2RZSQWBH.ts} +8 -19
  5. package/dist/chunks/chunk-2RZSQWBH.ts.map +7 -0
  6. package/dist/chunks/{chunk-IJ6FJFA5.ts → chunk-4AIHXRKE.ts} +11 -17
  7. package/dist/chunks/chunk-4AIHXRKE.ts.map +7 -0
  8. package/dist/chunks/{chunk-C7XY5NF5.ts → chunk-4MPIH46N.ts} +29 -51
  9. package/dist/chunks/chunk-4MPIH46N.ts.map +7 -0
  10. package/dist/chunks/{chunk-5B3FXBLE.ts → chunk-6546TS54.ts} +16 -20
  11. package/dist/chunks/chunk-6546TS54.ts.map +7 -0
  12. package/dist/chunks/{chunk-Q2TUM5X6.ts → chunk-6NT3YFGY.ts} +2 -2
  13. package/dist/chunks/chunk-6NT3YFGY.ts.map +7 -0
  14. package/dist/chunks/{chunk-2B2ELUF5.ts → chunk-7D5SF7P3.ts} +1 -1
  15. package/dist/chunks/chunk-7D5SF7P3.ts.map +7 -0
  16. package/dist/chunks/{chunk-YDWUZVPN.ts → chunk-7KHKWL3Q.ts} +28 -47
  17. package/dist/chunks/chunk-7KHKWL3Q.ts.map +7 -0
  18. package/dist/chunks/{chunk-ZI5MXMEX.ts → chunk-BVVP33U5.ts} +2 -4
  19. package/dist/chunks/chunk-BVVP33U5.ts.map +7 -0
  20. package/dist/chunks/{chunk-SZWBGPID.ts → chunk-DM4X4FIA.ts} +8 -13
  21. package/dist/chunks/chunk-DM4X4FIA.ts.map +7 -0
  22. package/dist/chunks/{chunk-SL64RLXR.ts → chunk-DZUSTGQV.ts} +8 -16
  23. package/dist/chunks/chunk-DZUSTGQV.ts.map +7 -0
  24. package/dist/chunks/{chunk-YHEMENKV.ts → chunk-E42GXD6D.ts} +13 -19
  25. package/dist/chunks/chunk-E42GXD6D.ts.map +7 -0
  26. package/dist/chunks/{chunk-Z4DQF6L3.ts → chunk-ECYCNZOE.ts} +1 -1
  27. package/dist/chunks/chunk-ECYCNZOE.ts.map +7 -0
  28. package/dist/chunks/{chunk-OEX4ABY6.ts → chunk-EEJPYTWE.ts} +11 -21
  29. package/dist/chunks/chunk-EEJPYTWE.ts.map +7 -0
  30. package/dist/chunks/{chunk-CPEHGXJV.ts → chunk-G4RUXRWZ.ts} +3 -5
  31. package/dist/chunks/chunk-G4RUXRWZ.ts.map +7 -0
  32. package/dist/chunks/{chunk-T2B5IU74.ts → chunk-HGJH56KR.ts} +4 -4
  33. package/dist/chunks/chunk-HGJH56KR.ts.map +7 -0
  34. package/dist/chunks/{chunk-JAAKLL6M.ts → chunk-IVXEDPAD.ts} +10 -34
  35. package/dist/chunks/chunk-IVXEDPAD.ts.map +7 -0
  36. package/dist/chunks/chunk-K3RIEL6J.ts +20 -0
  37. package/dist/chunks/chunk-K3RIEL6J.ts.map +7 -0
  38. package/dist/chunks/{chunk-LTBWGSBV.ts → chunk-MSSW6F3R.ts} +1 -1
  39. package/dist/chunks/chunk-MSSW6F3R.ts.map +7 -0
  40. package/dist/chunks/{chunk-T3HH3UEJ.ts → chunk-OVDTF5CH.ts} +4 -10
  41. package/dist/chunks/chunk-OVDTF5CH.ts.map +7 -0
  42. package/dist/chunks/{chunk-NJFUIVYL.ts → chunk-PWMWOJP4.ts} +1 -1
  43. package/dist/chunks/chunk-PWMWOJP4.ts.map +7 -0
  44. package/dist/chunks/{chunk-HUDQATCL.ts → chunk-Q32CQWPM.ts} +6 -8
  45. package/dist/chunks/chunk-Q32CQWPM.ts.map +7 -0
  46. package/dist/chunks/{chunk-ETTRJDNP.ts → chunk-QLSN7AGX.ts} +6 -13
  47. package/dist/chunks/chunk-QLSN7AGX.ts.map +7 -0
  48. package/dist/chunks/{chunk-THMF4BVL.ts → chunk-SWUXA3MH.ts} +1 -1
  49. package/dist/chunks/chunk-SWUXA3MH.ts.map +7 -0
  50. package/dist/chunks/{chunk-TEN2ZBJV.ts → chunk-T2SJD3N7.ts} +2 -4
  51. package/dist/chunks/chunk-T2SJD3N7.ts.map +7 -0
  52. package/dist/chunks/{chunk-AUSDLD6F.ts → chunk-T56RNRZJ.ts} +10 -26
  53. package/dist/chunks/chunk-T56RNRZJ.ts.map +7 -0
  54. package/dist/chunks/{chunk-DHVFS4QK.ts → chunk-UA7RXOIT.ts} +37 -90
  55. package/dist/chunks/chunk-UA7RXOIT.ts.map +7 -0
  56. package/dist/chunks/{chunk-D5X27LCA.ts → chunk-UETBKTDI.ts} +1 -1
  57. package/dist/chunks/chunk-UETBKTDI.ts.map +7 -0
  58. package/dist/chunks/{chunk-CHH26D4F.ts → chunk-YFADF5ZQ.ts} +7 -6
  59. package/dist/chunks/chunk-YFADF5ZQ.ts.map +7 -0
  60. package/dist/chunks/{chunk-CCSN3F47.ts → chunk-YPXGU5OR.ts} +4 -4
  61. package/dist/chunks/chunk-YPXGU5OR.ts.map +7 -0
  62. package/dist/chunks/{file-selection-FTTKAOYX.ts → file-selection-RAVHRYFG.ts} +14 -26
  63. package/dist/chunks/file-selection-RAVHRYFG.ts.map +7 -0
  64. package/dist/chunks/{git-backend-GMVS4PD4.ts → git-backend-IAANDL3K.ts} +41 -104
  65. package/dist/chunks/git-backend-IAANDL3K.ts.map +7 -0
  66. package/dist/chunks/manager-result-dispatcher-OTUMQM26.ts +23 -0
  67. package/dist/chunks/{manager-ui-IPAOAWZA.ts → manager-ui-763NEKJY.ts} +124 -251
  68. package/dist/chunks/manager-ui-763NEKJY.ts.map +7 -0
  69. package/dist/chunks/remote-selection-ui-TZTJF32Y.ts +22 -0
  70. package/dist/chunks/{s3-backend-66O4FGBH.ts → s3-backend-XGXUOPUN.ts} +23 -54
  71. package/dist/chunks/s3-backend-XGXUOPUN.ts.map +7 -0
  72. package/dist/chunks/{setup-switch-IS2PEZ3J.ts → setup-switch-5G2VNJHL.ts} +9 -9
  73. package/dist/chunks/{setup-wizard-JUJZYNNM.ts → setup-wizard-YIEWGX32.ts} +12 -12
  74. package/dist/chunks/setup-wizard-YIEWGX32.ts.map +7 -0
  75. package/dist/chunks/{snapshot-HKEWCVK6.ts → snapshot-JL5DFSXI.ts} +5 -5
  76. package/dist/chunks/sync-inspection-P3ENJLNF.ts +20 -0
  77. package/dist/chunks/{sync-operations-LBX3GKCM.ts → sync-operations-AR76EB6C.ts} +85 -201
  78. package/dist/chunks/sync-operations-AR76EB6C.ts.map +7 -0
  79. package/dist/chunks/{sync-state-Q2FTXTW6.ts → sync-state-VHJUZ4YG.ts} +6 -6
  80. package/dist/chunks/{webdav-backend-ECIKD7SO.ts → webdav-backend-3EGUONAT.ts} +20 -51
  81. package/dist/chunks/webdav-backend-3EGUONAT.ts.map +7 -0
  82. package/dist/index.ts +49 -74
  83. package/dist/index.ts.map +3 -3
  84. package/docs/settings.md +9 -0
  85. package/package.json +61 -62
  86. package/src/backends/backend-factory.ts +15 -15
  87. package/src/backends/backend-identity.ts +31 -31
  88. package/src/backends/backend-types.ts +42 -42
  89. package/src/backends/git/git-backend.ts +714 -788
  90. package/src/backends/git/git-config.ts +104 -111
  91. package/src/backends/git/git-runner.ts +230 -247
  92. package/src/backends/git/git-storage.ts +228 -245
  93. package/src/backends/s3/s3-backend.ts +408 -441
  94. package/src/backends/s3/s3-client.ts +288 -333
  95. package/src/backends/sync-backend.ts +65 -65
  96. package/src/backends/webdav/webdav-backend.ts +542 -589
  97. package/src/backends/webdav/webdav-client.ts +292 -316
  98. package/src/backends/webdav/webdav-config.ts +57 -68
  99. package/src/commands/command-execution.ts +270 -289
  100. package/src/commands/command-handler.ts +160 -163
  101. package/src/commands/command-types.ts +13 -13
  102. package/src/commands/command.ts +190 -196
  103. package/src/commands/setup-completions.ts +1 -1
  104. package/src/paths.ts +47 -47
  105. package/src/settings/config-errors.ts +4 -5
  106. package/src/settings/config-file.ts +473 -506
  107. package/src/settings/config.ts +171 -174
  108. package/src/settings/settings-management.ts +191 -216
  109. package/src/settings/settings-store.ts +63 -77
  110. package/src/settings/settings-types.ts +78 -75
  111. package/src/settings/settings-validation.ts +328 -364
  112. package/src/snapshot/session-paths.ts +41 -55
  113. package/src/snapshot/snapshot-apply.ts +197 -229
  114. package/src/snapshot/snapshot-codec.ts +29 -31
  115. package/src/snapshot/snapshot-paths.ts +4 -6
  116. package/src/snapshot/snapshot-transaction.ts +161 -170
  117. package/src/snapshot/snapshot-types.ts +24 -24
  118. package/src/snapshot/snapshot.ts +310 -343
  119. package/src/state/json-file.ts +11 -11
  120. package/src/state/lock.ts +226 -242
  121. package/src/state/lockfile-fs.ts +20 -20
  122. package/src/state/operation-availability.ts +36 -41
  123. package/src/state/state-directory.ts +171 -173
  124. package/src/state/state-types.ts +15 -15
  125. package/src/state/sync-state-store.ts +23 -23
  126. package/src/sync/automatic-sync.ts +75 -80
  127. package/src/sync/remote-snapshot.ts +52 -60
  128. package/src/sync/setup-switch.ts +99 -114
  129. package/src/sync/signals.ts +3 -5
  130. package/src/sync/startup-check.ts +97 -111
  131. package/src/sync/sync-decision.ts +76 -80
  132. package/src/sync/sync-error-guidance.ts +41 -48
  133. package/src/sync/sync-errors.ts +10 -10
  134. package/src/sync/sync-inspection.ts +29 -33
  135. package/src/sync/sync-loaders.ts +28 -36
  136. package/src/sync/sync-mutations.ts +510 -622
  137. package/src/sync/sync-operations.ts +7 -7
  138. package/src/sync/sync-policy.ts +296 -326
  139. package/src/sync/sync-queries.ts +175 -194
  140. package/src/sync/sync-state.ts +74 -100
  141. package/src/sync-extension.ts +89 -101
  142. package/src/sync.ts +26 -26
  143. package/src/types.ts +37 -37
  144. package/src/ui/automatic-sync-summary.ts +1 -3
  145. package/src/ui/cancellable-operation.ts +89 -101
  146. package/src/ui/file-selection.ts +250 -274
  147. package/src/ui/manager-attention.ts +51 -63
  148. package/src/ui/manager-recovery.ts +48 -57
  149. package/src/ui/manager-result-dispatcher.ts +62 -76
  150. package/src/ui/manager-state.ts +200 -232
  151. package/src/ui/manager-ui.ts +264 -362
  152. package/src/ui/remote-selection-ui.ts +547 -588
  153. package/src/ui/secret-input.ts +197 -205
  154. package/src/ui/settings-ui.ts +175 -172
  155. package/src/ui/setup/git-ui.ts +232 -261
  156. package/src/ui/setup/s3-credentials-ui.ts +58 -65
  157. package/src/ui/setup/s3-ui.ts +171 -195
  158. package/src/ui/setup/setup-actions.ts +91 -101
  159. package/src/ui/setup/setup-location-ui.ts +121 -137
  160. package/src/ui/setup/setup-name-ui.ts +27 -27
  161. package/src/ui/setup/setup-prompts.ts +65 -65
  162. package/src/ui/setup/setup-review.ts +58 -59
  163. package/src/ui/setup/setup-switcher.ts +156 -160
  164. package/src/ui/setup/setup-wizard.ts +28 -28
  165. package/src/ui/setup/text-input.ts +54 -58
  166. package/src/ui/setup/webdav-ui.ts +246 -293
  167. package/src/ui/storage-connections-ui.ts +317 -369
  168. package/src/ui/sync-attention.ts +148 -164
  169. package/src/ui/sync-format.ts +110 -121
  170. package/src/ui/sync-resolution-ui.ts +147 -153
  171. package/src/ui/sync-setups-ui.ts +218 -238
  172. package/src/ui/sync-status.ts +17 -0
  173. package/src/ui/terminal-text.ts +2 -2
  174. package/dist/chunks/chunk-2B2ELUF5.ts.map +0 -7
  175. package/dist/chunks/chunk-5B3FXBLE.ts.map +0 -7
  176. package/dist/chunks/chunk-6LP3MCR2.ts.map +0 -7
  177. package/dist/chunks/chunk-AUSDLD6F.ts.map +0 -7
  178. package/dist/chunks/chunk-C7XY5NF5.ts.map +0 -7
  179. package/dist/chunks/chunk-CCSN3F47.ts.map +0 -7
  180. package/dist/chunks/chunk-CHH26D4F.ts.map +0 -7
  181. package/dist/chunks/chunk-CPEHGXJV.ts.map +0 -7
  182. package/dist/chunks/chunk-D5X27LCA.ts.map +0 -7
  183. package/dist/chunks/chunk-DHVFS4QK.ts.map +0 -7
  184. package/dist/chunks/chunk-ETTRJDNP.ts.map +0 -7
  185. package/dist/chunks/chunk-HUDQATCL.ts.map +0 -7
  186. package/dist/chunks/chunk-IJ6FJFA5.ts.map +0 -7
  187. package/dist/chunks/chunk-JAAKLL6M.ts.map +0 -7
  188. package/dist/chunks/chunk-LCRI3ABW.ts.map +0 -7
  189. package/dist/chunks/chunk-LTBWGSBV.ts.map +0 -7
  190. package/dist/chunks/chunk-NJFUIVYL.ts.map +0 -7
  191. package/dist/chunks/chunk-OEX4ABY6.ts.map +0 -7
  192. package/dist/chunks/chunk-Q2TUM5X6.ts.map +0 -7
  193. package/dist/chunks/chunk-SL64RLXR.ts.map +0 -7
  194. package/dist/chunks/chunk-SZWBGPID.ts.map +0 -7
  195. package/dist/chunks/chunk-T2B5IU74.ts.map +0 -7
  196. package/dist/chunks/chunk-T3HH3UEJ.ts.map +0 -7
  197. package/dist/chunks/chunk-TEN2ZBJV.ts.map +0 -7
  198. package/dist/chunks/chunk-THMF4BVL.ts.map +0 -7
  199. package/dist/chunks/chunk-YDWUZVPN.ts.map +0 -7
  200. package/dist/chunks/chunk-YHEMENKV.ts.map +0 -7
  201. package/dist/chunks/chunk-Z4DQF6L3.ts.map +0 -7
  202. package/dist/chunks/chunk-ZI5MXMEX.ts.map +0 -7
  203. package/dist/chunks/file-selection-FTTKAOYX.ts.map +0 -7
  204. package/dist/chunks/git-backend-GMVS4PD4.ts.map +0 -7
  205. package/dist/chunks/manager-result-dispatcher-ASKGOSW5.ts +0 -22
  206. package/dist/chunks/manager-ui-IPAOAWZA.ts.map +0 -7
  207. package/dist/chunks/remote-selection-ui-QDNR7WEI.ts +0 -21
  208. package/dist/chunks/s3-backend-66O4FGBH.ts.map +0 -7
  209. package/dist/chunks/setup-wizard-JUJZYNNM.ts.map +0 -7
  210. package/dist/chunks/sync-inspection-CST2KL65.ts +0 -20
  211. package/dist/chunks/sync-operations-LBX3GKCM.ts.map +0 -7
  212. package/dist/chunks/webdav-backend-ECIKD7SO.ts.map +0 -7
  213. /package/dist/chunks/{manager-result-dispatcher-ASKGOSW5.ts.map → manager-result-dispatcher-OTUMQM26.ts.map} +0 -0
  214. /package/dist/chunks/{remote-selection-ui-QDNR7WEI.ts.map → remote-selection-ui-TZTJF32Y.ts.map} +0 -0
  215. /package/dist/chunks/{setup-switch-IS2PEZ3J.ts.map → setup-switch-5G2VNJHL.ts.map} +0 -0
  216. /package/dist/chunks/{snapshot-HKEWCVK6.ts.map → snapshot-JL5DFSXI.ts.map} +0 -0
  217. /package/dist/chunks/{sync-inspection-CST2KL65.ts.map → sync-inspection-P3ENJLNF.ts.map} +0 -0
  218. /package/dist/chunks/{sync-state-Q2FTXTW6.ts.map → sync-state-VHJUZ4YG.ts.map} +0 -0
package/dist/index.ts CHANGED
@@ -4,26 +4,30 @@ import {
4
4
  createSyncAttentionController,
5
5
  observationMatchesConfig,
6
6
  syncAttentionMatchesConfig
7
- } from "./chunks/chunk-5B3FXBLE.ts";
7
+ } from "./chunks/chunk-6546TS54.ts";
8
8
  import {
9
9
  recoverSnapshotTransactionsOnStartup
10
- } from "./chunks/chunk-IJ6FJFA5.ts";
10
+ } from "./chunks/chunk-4AIHXRKE.ts";
11
11
  import {
12
12
  unlock,
13
13
  withLock
14
- } from "./chunks/chunk-ETTRJDNP.ts";
14
+ } from "./chunks/chunk-QLSN7AGX.ts";
15
+ import {
16
+ configureSyncStatus,
17
+ setSyncStatus
18
+ } from "./chunks/chunk-K3RIEL6J.ts";
15
19
  import {
16
20
  combineSignals,
17
21
  throwIfAborted
18
- } from "./chunks/chunk-NJFUIVYL.ts";
22
+ } from "./chunks/chunk-PWMWOJP4.ts";
19
23
  import {
20
24
  ensureStateDir,
21
25
  readStateForConfig,
22
26
  syncStateFingerprint
23
- } from "./chunks/chunk-CCSN3F47.ts";
27
+ } from "./chunks/chunk-YPXGU5OR.ts";
24
28
  import {
25
29
  automaticSyncSummary
26
- } from "./chunks/chunk-Z4DQF6L3.ts";
30
+ } from "./chunks/chunk-ECYCNZOE.ts";
27
31
  import {
28
32
  completeSyncArguments,
29
33
  parseOptions,
@@ -32,13 +36,12 @@ import {
32
36
  splitArgs,
33
37
  usage,
34
38
  validateCommandOptions
35
- } from "./chunks/chunk-CHH26D4F.ts";
39
+ } from "./chunks/chunk-YFADF5ZQ.ts";
36
40
  import {
37
41
  safeTerminalText
38
- } from "./chunks/chunk-LTBWGSBV.ts";
42
+ } from "./chunks/chunk-MSSW6F3R.ts";
39
43
  import {
40
44
  activeLocalConfigPath,
41
- configuredSyncSetupNames,
42
45
  consumeLocalConfigMigrationNotice,
43
46
  createLocalConfigDocument,
44
47
  loadConfig,
@@ -50,33 +53,32 @@ import {
50
53
  sessionTokenWarnings,
51
54
  syncCheckConfigFingerprint,
52
55
  syncSessionsWarnings
53
- } from "./chunks/chunk-C7XY5NF5.ts";
54
- import "./chunks/chunk-6LP3MCR2.ts";
56
+ } from "./chunks/chunk-4MPIH46N.ts";
57
+ import "./chunks/chunk-2JZFHNLM.ts";
55
58
  import {
56
59
  migrateLegacyStateDirectory,
57
60
  stateDirectoryMigrationNotice,
58
61
  withStateDirectoryAccess
59
- } from "./chunks/chunk-ZI5MXMEX.ts";
60
- import "./chunks/chunk-TEN2ZBJV.ts";
62
+ } from "./chunks/chunk-BVVP33U5.ts";
63
+ import "./chunks/chunk-T2SJD3N7.ts";
61
64
  import {
62
65
  syncErrorGuidance
63
- } from "./chunks/chunk-CPEHGXJV.ts";
66
+ } from "./chunks/chunk-G4RUXRWZ.ts";
64
67
  import {
65
68
  SetupPullRequiresUiError,
66
69
  errorMessage,
67
70
  isSyncDecisionRequiredError
68
- } from "./chunks/chunk-2B2ELUF5.ts";
69
- import "./chunks/chunk-THMF4BVL.ts";
71
+ } from "./chunks/chunk-7D5SF7P3.ts";
72
+ import "./chunks/chunk-SWUXA3MH.ts";
70
73
  import {
71
74
  snapshotOptionsForContext
72
- } from "./chunks/chunk-T3HH3UEJ.ts";
75
+ } from "./chunks/chunk-OVDTF5CH.ts";
73
76
  import {
74
77
  RemoteSelectionMismatchError,
75
78
  formatRemoteSelectionMismatch
76
- } from "./chunks/chunk-JAAKLL6M.ts";
79
+ } from "./chunks/chunk-IVXEDPAD.ts";
77
80
 
78
81
  // src/commands/command-execution.ts
79
- var STATUS_KEY = "sync";
80
82
  async function executeRecoveryCommand(rawArgs, ctx, signal, loaders, onCommit, setup) {
81
83
  try {
82
84
  const [subcommand, ...rest] = splitArgs(rawArgs);
@@ -104,7 +106,7 @@ async function executeRecoveryCommand(rawArgs, ctx, signal, loaders, onCommit, s
104
106
  return { kind: "completed" };
105
107
  } catch (error) {
106
108
  if (signal?.aborted) return { kind: "failed" };
107
- ctx.ui.setStatus(STATUS_KEY, void 0);
109
+ setSyncStatus(ctx, void 0);
108
110
  if (error instanceof RemoteSelectionMismatchError) {
109
111
  return { kind: "remote-selection-required", decision: error.decision };
110
112
  }
@@ -138,10 +140,7 @@ async function executeCommand(rawArgs, ctx, signal, loaders, onCommit, setup) {
138
140
  async (selectedSetup) => {
139
141
  const operations = await loaders.operations();
140
142
  throwIfAborted(options.signal);
141
- return withLock(
142
- "pull",
143
- () => operations.pull(ctx, { ...options, setup: selectedSetup })
144
- );
143
+ return withLock("pull", () => operations.pull(ctx, { ...options, setup: selectedSetup }));
145
144
  },
146
145
  void 0,
147
146
  options.signal
@@ -155,7 +154,7 @@ async function executeCommand(rawArgs, ctx, signal, loaders, onCommit, setup) {
155
154
  await showConfig(ctx, options);
156
155
  return { kind: "completed" };
157
156
  case "files": {
158
- const { showFileSelection } = await import("./chunks/file-selection-FTTKAOYX.ts");
157
+ const { showFileSelection } = await import("./chunks/file-selection-RAVHRYFG.ts");
159
158
  throwIfAborted(options.signal);
160
159
  await showFileSelection(ctx, options.setup, options.signal);
161
160
  return { kind: "completed" };
@@ -222,7 +221,7 @@ ${usage()}`, "warning");
222
221
  }
223
222
  } catch (error) {
224
223
  if (signal?.aborted) return { kind: "failed" };
225
- ctx.ui.setStatus(STATUS_KEY, void 0);
224
+ setSyncStatus(ctx, void 0);
226
225
  if (error instanceof SetupPullRequiresUiError) throw error;
227
226
  if (error instanceof RemoteSelectionMismatchError) {
228
227
  return { kind: "remote-selection-required", decision: error.decision };
@@ -264,16 +263,13 @@ async function initConfig(ctx, signal) {
264
263
  return;
265
264
  }
266
265
  if (ctx.mode === "tui") {
267
- const { showSetupWizard } = await import("./chunks/setup-wizard-JUJZYNNM.ts");
266
+ const { showSetupWizard } = await import("./chunks/setup-wizard-YIEWGX32.ts");
268
267
  throwIfAborted(signal);
269
268
  await showSetupWizard(ctx, signal);
270
269
  return;
271
270
  }
272
271
  await createLocalConfigDocument(localConfigTemplate());
273
- ctx.ui.notify(
274
- `Created ${configPath}. Add a storage connection and sync setup before syncing.`,
275
- "info"
276
- );
272
+ ctx.ui.notify(`Created ${configPath}. Add a storage connection and sync setup before syncing.`, "info");
277
273
  }
278
274
  async function showConfig(ctx, options) {
279
275
  const config = await loadConfig(options.setup);
@@ -354,7 +350,6 @@ function displayWebDavUrl(value, username) {
354
350
  }
355
351
 
356
352
  // src/commands/command-handler.ts
357
- var STATUS_KEY2 = "sync";
358
353
  async function handleCommand(rawArgs, ctx, sessionSignal, loaders, attention) {
359
354
  await reconcileObservation(attention, sessionSignal);
360
355
  if (sessionSignal.aborted) return;
@@ -368,7 +363,7 @@ async function handleCommand(rawArgs, ctx, sessionSignal, loaders, attention) {
368
363
  );
369
364
  if (!rawArgs.trim()) {
370
365
  try {
371
- const { showSyncManager } = await import("./chunks/manager-ui-IPAOAWZA.ts");
366
+ const { showSyncManager } = await import("./chunks/manager-ui-763NEKJY.ts");
372
367
  if (sessionSignal.aborted) return;
373
368
  await showSyncManager(ctx, run, sessionSignal, {
374
369
  getAttention: () => attention.current(),
@@ -380,7 +375,7 @@ async function handleCommand(rawArgs, ctx, sessionSignal, loaders, attention) {
380
375
  });
381
376
  } catch (error) {
382
377
  if (sessionSignal.aborted) return;
383
- ctx.ui.setStatus(STATUS_KEY2, void 0);
378
+ setSyncStatus(ctx, void 0);
384
379
  ctx.ui.notify(errorMessage(error), "error");
385
380
  }
386
381
  await reconcileObservation(attention, sessionSignal);
@@ -415,8 +410,7 @@ async function handleCommand(rawArgs, ctx, sessionSignal, loaders, attention) {
415
410
  function observationCommitCallback(attention, sessionSignal, onCommit) {
416
411
  const observed = attention.observation();
417
412
  return () => {
418
- if (!sessionSignal.aborted && attention.observation() === observed)
419
- attention.clearObservation();
413
+ if (!sessionSignal.aborted && attention.observation() === observed) attention.clearObservation();
420
414
  onCommit?.();
421
415
  };
422
416
  }
@@ -432,8 +426,7 @@ async function reconcileObservation(attention, signal) {
432
426
  }
433
427
  const state = await readStateForConfig(config);
434
428
  if (signal.aborted || attention.observation() !== observed) return;
435
- if (syncStateFingerprint(state) !== observed.inspection.stateIdentity)
436
- attention.clearObservation();
429
+ if (syncStateFingerprint(state) !== observed.inspection.stateIdentity) attention.clearObservation();
437
430
  } catch {
438
431
  if (!signal.aborted && attention.observation() === observed) attention.clearObservation();
439
432
  }
@@ -470,7 +463,7 @@ function directSelectionOrigin(rawArgs) {
470
463
  async function resolveSelectionAttention(ctx, attention, signal, loaders, options = {}) {
471
464
  const current = attention.current();
472
465
  if (!current || signal.aborted) return;
473
- const { dispatchManagerResult } = await import("./chunks/manager-result-dispatcher-ASKGOSW5.ts");
466
+ const { dispatchManagerResult } = await import("./chunks/manager-result-dispatcher-OTUMQM26.ts");
474
467
  if (signal.aborted || attention.current() !== current) return;
475
468
  await dispatchManagerResult(
476
469
  ctx,
@@ -513,7 +506,6 @@ var AUTO_SYNC_OPTIONS = {
513
506
  auto: true,
514
507
  args: []
515
508
  };
516
- var STATUS_KEY3 = "sync";
517
509
  async function startSession(ctx, signal) {
518
510
  throwIfAborted(signal);
519
511
  const stateNotice = stateDirectoryMigrationNotice();
@@ -521,9 +513,11 @@ async function startSession(ctx, signal) {
521
513
  await recoverSnapshotTransactionsOnStartup();
522
514
  throwIfAborted(signal);
523
515
  try {
524
- const names = await configuredSyncSetupNames();
516
+ const settings = await readLocalConfigObject();
525
517
  throwIfAborted(signal);
518
+ const names = settings ? Object.keys(settings.syncSetups).sort((left, right) => left.localeCompare(right)) : [];
526
519
  setSyncSetupCompletions(names);
520
+ configureSyncStatus(ctx, settings?.showStatus ?? true);
527
521
  } catch {
528
522
  if (signal.aborted) return;
529
523
  setSyncSetupCompletions([]);
@@ -535,14 +529,12 @@ async function startSession(ctx, signal) {
535
529
  try {
536
530
  const config = await loadConfig();
537
531
  throwIfAborted(signal);
532
+ configureSyncStatus(ctx, config.showStatus);
538
533
  return config.automatic ? config : void 0;
539
534
  } catch (error) {
540
535
  throwIfAborted(signal);
541
536
  if (!isMissingConfigError(error)) {
542
- ctx.ui.notify(
543
- `pi-sync startup check skipped: ${safeTerminalText(errorMessage(error))}`,
544
- "warning"
545
- );
537
+ ctx.ui.notify(`pi-sync startup check skipped: ${safeTerminalText(errorMessage(error))}`, "warning");
546
538
  }
547
539
  }
548
540
  }
@@ -577,13 +569,12 @@ async function autoPushSessions(ctx, signal, loaders) {
577
569
  });
578
570
  } catch (error) {
579
571
  if (signal.aborted || isMissingConfigError(error)) return;
580
- ctx.ui.setStatus(STATUS_KEY3, void 0);
572
+ setSyncStatus(ctx, void 0);
581
573
  ctx.ui.notify(`pi-sync session push skipped: ${errorMessage(error)}`, "warning");
582
574
  }
583
575
  }
584
576
 
585
577
  // src/sync/startup-check.ts
586
- var STATUS_KEY4 = "sync";
587
578
  function createStartupCheck(loaders, attention, timeoutMs = 3e4) {
588
579
  let active;
589
580
  return {
@@ -610,7 +601,7 @@ function createStartupCheck(loaders, attention, timeoutMs = 3e4) {
610
601
  const captured = config;
611
602
  const identity = syncCheckConfigFingerprint(captured);
612
603
  checking = true;
613
- ctx.ui.setStatus(STATUS_KEY4, "checking in background");
604
+ setSyncStatus(ctx, "sync ...");
614
605
  const { inspectSync } = await loaders.inspection();
615
606
  throwIfAborted(signal);
616
607
  const currentConfig = await loadConfigForCheck();
@@ -642,10 +633,8 @@ function createStartupCheck(loaders, attention, timeoutMs = 3e4) {
642
633
  if (signal.aborted && controller.signal.reason?.name !== "TimeoutError") return;
643
634
  if (config) {
644
635
  const latest = await loadConfigForCheck().catch(() => void 0);
645
- if (!isCurrent() || signal.aborted && controller.signal.reason?.name !== "TimeoutError")
646
- return;
647
- if (!latest || syncCheckConfigFingerprint(latest) !== syncCheckConfigFingerprint(config))
648
- return;
636
+ if (!isCurrent() || signal.aborted && controller.signal.reason?.name !== "TimeoutError") return;
637
+ if (!latest || syncCheckConfigFingerprint(latest) !== syncCheckConfigFingerprint(config)) return;
649
638
  }
650
639
  ctx.ui.notify(
651
640
  `pi-sync startup check skipped: ${safeTerminalText(errorMessage(error))}. Run /sync status to retry. No startup transfer was performed.`,
@@ -673,19 +662,11 @@ function createStartupCheck(loaders, attention, timeoutMs = 3e4) {
673
662
  // src/sync/sync-loaders.ts
674
663
  function createSyncLoaders(dependencies) {
675
664
  const loaders = {
676
- inspection: cachedModuleLoader(
677
- dependencies.loadSyncInspection ?? (() => import("./chunks/sync-inspection-CST2KL65.ts"))
678
- ),
679
- setupSwitch: cachedModuleLoader(
680
- dependencies.loadSetupSwitch ?? (() => import("./chunks/setup-switch-IS2PEZ3J.ts"))
681
- ),
682
- snapshot: cachedModuleLoader(
683
- dependencies.loadSnapshot ?? (() => import("./chunks/snapshot-HKEWCVK6.ts"))
684
- ),
685
- syncState: cachedModuleLoader(dependencies.loadSyncState ?? (() => import("./chunks/sync-state-Q2FTXTW6.ts"))),
686
- operations: cachedModuleLoader(
687
- dependencies.loadSyncOperations ?? (() => import("./chunks/sync-operations-LBX3GKCM.ts"))
688
- )
665
+ inspection: cachedModuleLoader(dependencies.loadSyncInspection ?? (() => import("./chunks/sync-inspection-P3ENJLNF.ts"))),
666
+ setupSwitch: cachedModuleLoader(dependencies.loadSetupSwitch ?? (() => import("./chunks/setup-switch-5G2VNJHL.ts"))),
667
+ snapshot: cachedModuleLoader(dependencies.loadSnapshot ?? (() => import("./chunks/snapshot-JL5DFSXI.ts"))),
668
+ syncState: cachedModuleLoader(dependencies.loadSyncState ?? (() => import("./chunks/sync-state-VHJUZ4YG.ts"))),
669
+ operations: cachedModuleLoader(dependencies.loadSyncOperations ?? (() => import("./chunks/sync-operations-AR76EB6C.ts")))
689
670
  };
690
671
  return loaders;
691
672
  }
@@ -703,7 +684,6 @@ function cachedModuleLoader(load) {
703
684
  }
704
685
 
705
686
  // src/sync-extension.ts
706
- var STATUS_KEY5 = "sync";
707
687
  function sync(pi, dependencies = {}) {
708
688
  const loaders = createSyncLoaders(dependencies);
709
689
  const attention = createSyncAttentionController();
@@ -716,9 +696,7 @@ function sync(pi, dependencies = {}) {
716
696
  getArgumentCompletions: completeSyncArguments,
717
697
  handler: async (args, ctx) => {
718
698
  if (!ctx.hasUI) {
719
- throw new Error(
720
- "/sync requires TUI or RPC mode so results and safety prompts are observable."
721
- );
699
+ throw new Error("/sync requires TUI or RPC mode so results and safety prompts are observable.");
722
700
  }
723
701
  const signal = sessionAbort.signal;
724
702
  const ready = await initialization;
@@ -756,10 +734,7 @@ function sync(pi, dependencies = {}) {
756
734
  return signal.aborted ? false : config;
757
735
  } catch (error) {
758
736
  if (!signal.aborted && ctx.hasUI) {
759
- ctx.ui.notify(
760
- `pi-sync recovery required: ${safeTerminalText(errorMessage(error))}`,
761
- "error"
762
- );
737
+ ctx.ui.notify(`pi-sync recovery required: ${safeTerminalText(errorMessage(error))}`, "error");
763
738
  }
764
739
  return false;
765
740
  }
@@ -794,7 +769,7 @@ function sync(pi, dependencies = {}) {
794
769
  if (shutdownAbort === controller) shutdownAbort = void 0;
795
770
  }
796
771
  if (signal.aborted) return;
797
- ctx.ui.setStatus(STATUS_KEY5, void 0);
772
+ setSyncStatus(ctx, void 0);
798
773
  });
799
774
  }
800
775
  export {
package/dist/index.ts.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/commands/command-execution.ts", "../src/commands/command-handler.ts", "../src/settings/config-errors.ts", "../src/sync/automatic-sync.ts", "../src/sync/startup-check.ts", "../src/sync/sync-loaders.ts", "../src/sync-extension.ts"],
4
- "sourcesContent": ["import type { ExtensionCommandContext, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { loadConfig, sessionTokenWarnings, syncSessionsWarnings } from \"../settings/config.js\";\nimport {\n\tactiveLocalConfigPath,\n\tcreateLocalConfigDocument,\n\tlocalConfigPath,\n} from \"../settings/config-file.js\";\nimport { localConfigTemplate, readLocalConfigObject } from \"../settings/settings-store.js\";\nimport type { AnySyncConfig } from \"../settings/settings-types.js\";\nimport { unlock, withLock } from \"../state/lock.js\";\nimport {\n\tmigrateLegacyStateDirectory,\n\tstateDirectoryMigrationNotice,\n} from \"../state/state-directory.js\";\nimport { throwIfAborted } from \"../sync/signals.js\";\nimport { syncErrorGuidance } from \"../sync/sync-error-guidance.js\";\nimport { isSyncDecisionRequiredError, SetupPullRequiresUiError } from \"../sync/sync-errors.js\";\nimport type { SyncLoaders } from \"../sync/sync-loaders.js\";\nimport { RemoteSelectionMismatchError } from \"../sync/sync-policy.js\";\nimport { automaticSyncSummary } from \"../ui/automatic-sync-summary.js\";\nimport type { RunRouteResult } from \"../ui/cancellable-operation.js\";\nimport {\n\tparseOptions,\n\tresolveSyncCommand,\n\tsplitArgs,\n\tusage,\n\tvalidateCommandOptions,\n} from \"./command.js\";\nimport type { CommandOptions } from \"./command-types.js\";\n\nconst STATUS_KEY = \"sync\";\n\nexport async function executeRecoveryCommand(\n\trawArgs: string,\n\tctx: ExtensionContext,\n\tsignal: AbortSignal | undefined,\n\tloaders: SyncLoaders,\n\tonCommit?: () => void,\n\tsetup?: string,\n): Promise<RunRouteResult> {\n\ttry {\n\t\tconst [subcommand, ...rest] = splitArgs(rawArgs);\n\t\tif (subcommand !== \"sync\" && subcommand !== \"pull\" && subcommand !== \"push\") {\n\t\t\tthrow new Error(`Unsupported sync recovery route: ${subcommand ?? \"missing\"}`);\n\t\t}\n\t\tconst options = parseOptions(rest);\n\t\tif (setup !== undefined) options.setup = setup;\n\t\tif (signal) options.signal = signal;\n\t\tif (onCommit) options.onCommit = onCommit;\n\t\toptions.reload = false;\n\t\toptions.auto = false;\n\t\tvalidateCommandOptions(subcommand, options);\n\t\tconst operations = await loaders.operations();\n\t\tthrowIfAborted(options.signal);\n\t\tif (subcommand === \"push\") {\n\t\t\tconst outcome = await withLock(\"push\", () => operations.push(ctx, options));\n\t\t\treturn { kind: \"completed\", ...(outcome ? { outcome } : {}) };\n\t\t}\n\t\tif (subcommand === \"pull\") {\n\t\t\tconst outcome = await withLock(\"pull\", () => operations.pull(ctx, options));\n\t\t\treturn { kind: \"completed\", ...(outcome ? { outcome } : {}) };\n\t\t}\n\t\tawait withLock(\"sync\", () => operations.syncBoth(ctx, options));\n\t\treturn { kind: \"completed\" };\n\t} catch (error) {\n\t\tif (signal?.aborted) return { kind: \"failed\" };\n\t\tctx.ui.setStatus(STATUS_KEY, undefined);\n\t\tif (error instanceof RemoteSelectionMismatchError) {\n\t\t\treturn { kind: \"remote-selection-required\", decision: error.decision };\n\t\t}\n\t\tif (isSyncDecisionRequiredError(error)) {\n\t\t\treturn { kind: \"decision-required\", decision: error.decision };\n\t\t}\n\t\tctx.ui.notify(syncErrorGuidance(error), \"error\");\n\t\treturn { kind: \"failed\" };\n\t}\n}\n\nexport async function executeCommand(\n\trawArgs: string,\n\tctx: ExtensionCommandContext,\n\tsignal: AbortSignal | undefined,\n\tloaders: SyncLoaders,\n\tonCommit?: () => void,\n\tsetup?: string,\n): Promise<RunRouteResult> {\n\ttry {\n\t\tconst command = await resolveSyncCommand(rawArgs, ctx);\n\t\tif (signal?.aborted || !command) return { kind: \"completed\" };\n\t\tconst { subcommand, rest } = command;\n\t\tconst options = parseOptions(rest);\n\t\tif (setup !== undefined) options.setup = setup;\n\t\tif (signal) options.signal = signal;\n\t\tif (onCommit) options.onCommit = onCommit;\n\t\tvalidateCommandOptions(subcommand, options);\n\n\t\tswitch (subcommand) {\n\t\t\tcase \"help\":\n\t\t\t\tctx.ui.notify(usage(), \"info\");\n\t\t\t\treturn { kind: \"completed\" };\n\t\t\tcase \"use\": {\n\t\t\t\tconst { useSyncSetup } = await loaders.setupSwitch();\n\t\t\t\tthrowIfAborted(options.signal);\n\t\t\t\tawait useSyncSetup(\n\t\t\t\t\tctx,\n\t\t\t\t\toptions.args[0] ?? \"\",\n\t\t\t\t\tasync (selectedSetup) => {\n\t\t\t\t\t\tconst operations = await loaders.operations();\n\t\t\t\t\t\tthrowIfAborted(options.signal);\n\t\t\t\t\t\treturn withLock(\"pull\", () =>\n\t\t\t\t\t\t\toperations.pull(ctx, { ...options, setup: selectedSetup }),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\tundefined,\n\t\t\t\t\toptions.signal,\n\t\t\t\t);\n\t\t\t\treturn { kind: \"completed\" };\n\t\t\t}\n\t\t\tcase \"init\":\n\t\t\t\tawait initConfig(ctx, signal);\n\t\t\t\treturn { kind: \"completed\" };\n\t\t\tcase \"config\":\n\t\t\t\tawait showConfig(ctx, options);\n\t\t\t\treturn { kind: \"completed\" };\n\t\t\tcase \"files\": {\n\t\t\t\tconst { showFileSelection } = await import(\"../ui/file-selection.js\");\n\t\t\t\tthrowIfAborted(options.signal);\n\t\t\t\tawait showFileSelection(ctx, options.setup, options.signal);\n\t\t\t\treturn { kind: \"completed\" };\n\t\t\t}\n\t\t\tcase \"status\": {\n\t\t\t\tconst operations = await loaders.operations();\n\t\t\t\tthrowIfAborted(options.signal);\n\t\t\t\tawait operations.status(ctx, options);\n\t\t\t\treturn { kind: \"completed\" };\n\t\t\t}\n\t\t\tcase \"diff\": {\n\t\t\t\tconst operations = await loaders.operations();\n\t\t\t\tthrowIfAborted(options.signal);\n\t\t\t\tawait operations.diff(ctx, options);\n\t\t\t\treturn { kind: \"completed\" };\n\t\t\t}\n\t\t\tcase \"doctor\": {\n\t\t\t\tconst operations = await loaders.operations();\n\t\t\t\tthrowIfAborted(options.signal);\n\t\t\t\tawait operations.doctor(ctx, options);\n\t\t\t\treturn { kind: \"completed\" };\n\t\t\t}\n\t\t\tcase \"push\": {\n\t\t\t\tconst operations = await loaders.operations();\n\t\t\t\tthrowIfAborted(options.signal);\n\t\t\t\tconst outcome = await withLock(\"push\", () => operations.push(ctx, options));\n\t\t\t\treturn { kind: \"completed\", ...(outcome ? { outcome } : {}) };\n\t\t\t}\n\t\t\tcase \"pull\": {\n\t\t\t\tconst operations = await loaders.operations();\n\t\t\t\tthrowIfAborted(options.signal);\n\t\t\t\tconst outcome = await withLock(\"pull\", () => operations.pull(ctx, options));\n\t\t\t\treturn { kind: \"completed\", ...(outcome ? { outcome } : {}) };\n\t\t\t}\n\t\t\tcase \"sync\": {\n\t\t\t\tconst operations = await loaders.operations();\n\t\t\t\tthrowIfAborted(options.signal);\n\t\t\t\tawait withLock(\"sync\", () => operations.syncBoth(ctx, options));\n\t\t\t\treturn { kind: \"completed\" };\n\t\t\t}\n\t\t\tcase \"history\": {\n\t\t\t\tconst operations = await loaders.operations();\n\t\t\t\tthrowIfAborted(options.signal);\n\t\t\t\tawait operations.history(ctx, options);\n\t\t\t\treturn { kind: \"completed\" };\n\t\t\t}\n\t\t\tcase \"rollback\": {\n\t\t\t\tconst operations = await loaders.operations();\n\t\t\t\tthrowIfAborted(options.signal);\n\t\t\t\tawait withLock(\"rollback\", () => operations.rollback(ctx, options));\n\t\t\t\treturn { kind: \"completed\" };\n\t\t\t}\n\t\t\tcase \"migrate-state\":\n\t\t\t\tawait migrateStateDirectory(ctx, options);\n\t\t\t\treturn { kind: \"completed\" };\n\t\t\tcase \"unlock\":\n\t\t\t\tawait unlock(ctx, options);\n\t\t\t\treturn { kind: \"completed\" };\n\t\t\tdefault:\n\t\t\t\tctx.ui.notify(`Unknown /sync command: ${subcommand}\\n\\n${usage()}`, \"warning\");\n\t\t\t\treturn { kind: \"failed\" };\n\t\t}\n\t} catch (error) {\n\t\tif (signal?.aborted) return { kind: \"failed\" };\n\t\tctx.ui.setStatus(STATUS_KEY, undefined);\n\t\tif (error instanceof SetupPullRequiresUiError) throw error;\n\t\tif (error instanceof RemoteSelectionMismatchError) {\n\t\t\treturn { kind: \"remote-selection-required\", decision: error.decision };\n\t\t}\n\t\tif (isSyncDecisionRequiredError(error)) {\n\t\t\treturn { kind: \"decision-required\", decision: error.decision };\n\t\t}\n\t\tctx.ui.notify(syncErrorGuidance(error), \"error\");\n\t\treturn { kind: \"failed\" };\n\t}\n}\n\nasync function migrateStateDirectory(ctx: ExtensionCommandContext, options: CommandOptions) {\n\tconst notice = stateDirectoryMigrationNotice();\n\tif (!notice) {\n\t\tctx.ui.notify(\"pi-sync already uses the canonical pi-sync/ state directory.\", \"info\");\n\t\treturn;\n\t}\n\tif (\n\t\t!options.yes &&\n\t\t!(await ctx.ui.confirm(\n\t\t\t\"Migrate pi-sync state directory\",\n\t\t\t\"Confirm that every other Pi process is closed. pi-sync will atomically rename .pisync/ to pi-sync/ without merging or deleting either root.\",\n\t\t\t{ signal: options.signal },\n\t\t))\n\t) {\n\t\tctx.ui.notify(\"pi-sync state migration cancelled.\", \"info\");\n\t\treturn;\n\t}\n\tthrowIfAborted(options.signal);\n\tconst result = await migrateLegacyStateDirectory();\n\tthrowIfAborted(options.signal);\n\tif (result.status === \"ready\") {\n\t\tctx.ui.notify(\"pi-sync already uses the canonical pi-sync/ state directory.\", \"info\");\n\t\treturn;\n\t}\n\tctx.ui.notify(result.message, result.status === \"migrated\" ? \"info\" : \"warning\");\n}\n\nasync function initConfig(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n\tconst configPath = localConfigPath();\n\tif (await readLocalConfigObject()) {\n\t\tctx.ui.notify(`Config already exists: ${await activeLocalConfigPath()}`, \"info\");\n\t\treturn;\n\t}\n\n\tif (ctx.mode === \"tui\") {\n\t\tconst { showSetupWizard } = await import(\"../ui/setup/setup-wizard.js\");\n\t\tthrowIfAborted(signal);\n\t\tawait showSetupWizard(ctx, signal);\n\t\treturn;\n\t}\n\tawait createLocalConfigDocument(localConfigTemplate());\n\tctx.ui.notify(\n\t\t`Created ${configPath}. Add a storage connection and sync setup before syncing.`,\n\t\t\"info\",\n\t);\n}\n\nasync function showConfig(ctx: ExtensionCommandContext, options: CommandOptions) {\n\tconst config = await loadConfig(options.setup);\n\tconst warnings = [\n\t\t...(config.backend.type === \"s3\" ? sessionTokenWarnings(config.backend.profile) : []),\n\t\t...syncSessionsWarnings(config),\n\t];\n\tconst storageLines = configStorageLines(config);\n\tctx.ui.notify(\n\t\t[\n\t\t\t\"pi-sync config:\",\n\t\t\t`sync setup: ${config.setupName}`,\n\t\t\t`storage connection: ${config.connectionName}`,\n\t\t\t...storageLines,\n\t\t\t`storage path: ${config.storagePath}`,\n\t\t\t`automatic sync: ${automaticSyncSummary(config.automatic)}`,\n\t\t\t`included content: ${config.include.join(\", \") || \"none\"}`,\n\t\t\t`sessions: ${config.include.includes(\"sessions\") ? \"included\" : \"not included\"}`,\n\t\t\t`settings file: ${localConfigPath()}`,\n\t\t\t...warnings,\n\t\t].join(\"\\n\"),\n\t\twarnings.length > 0 ? \"warning\" : \"info\",\n\t);\n}\n\nfunction configStorageLines(config: AnySyncConfig) {\n\tswitch (config.backend.type) {\n\t\tcase \"git\":\n\t\t\treturn [\n\t\t\t\t\"kind: git\",\n\t\t\t\t`remote: ${displayGitRemote(config.backend.profile.remote)}`,\n\t\t\t\t\"authentication: existing Git/SSH credentials (not stored)\",\n\t\t\t\t`branch: ${config.backend.destination.branch}`,\n\t\t\t];\n\t\tcase \"webdav\":\n\t\t\treturn [\n\t\t\t\t\"kind: webdav\",\n\t\t\t\t`url: ${displayWebDavUrl(config.backend.profile.url, config.backend.profile.username)}`,\n\t\t\t\t\"username: configured (value hidden)\",\n\t\t\t\t\"password: configured\",\n\t\t\t];\n\t\tcase \"s3\":\n\t\t\treturn [\n\t\t\t\t\"kind: s3\",\n\t\t\t\t`endpoint: ${config.backend.profile.endpoint}`,\n\t\t\t\t`bucket: ${config.backend.destination.bucket}`,\n\t\t\t\t`region: ${config.backend.profile.region}`,\n\t\t\t\t\"access key id: configured\",\n\t\t\t\t\"secret access key: configured\",\n\t\t\t\t`session token: ${config.backend.profile.sessionToken ? \"configured\" : \"not configured\"}`,\n\t\t\t];\n\t}\n}\n\nfunction displayGitRemote(value: string | undefined) {\n\tif (!value) return \"missing\";\n\ttry {\n\t\tconst url = new URL(value);\n\t\turl.username = \"\";\n\t\turl.password = \"\";\n\t\turl.search = \"\";\n\t\turl.hash = \"\";\n\t\treturn url.toString();\n\t} catch {\n\t\treturn value.replace(/^(?:[^@\\s]+@)?(?<host>[^:]+):.+$/u, \"$<host>:\u2026\");\n\t}\n}\n\nfunction displayWebDavUrl(value: string | undefined, username: string | undefined) {\n\tif (!value) return \"missing\";\n\ttry {\n\t\tconst url = new URL(value);\n\t\turl.username = \"\";\n\t\turl.password = \"\";\n\t\turl.search = \"\";\n\t\turl.hash = \"\";\n\t\treturn username ? `${url.origin}/\u2026` : `${url.origin}${url.pathname}`;\n\t} catch {\n\t\treturn \"invalid (value hidden)\";\n\t}\n}\n", "import type { ExtensionCommandContext, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { loadConfig } from \"../settings/config.js\";\nimport { readStateForConfig, syncStateFingerprint } from \"../state/sync-state-store.js\";\nimport { combineSignals } from \"../sync/signals.js\";\nimport { errorMessage } from \"../sync/sync-errors.js\";\nimport type { SyncLoaders } from \"../sync/sync-loaders.js\";\nimport { formatRemoteSelectionMismatch } from \"../sync/sync-policy.js\";\nimport type { RunRouteResult } from \"../ui/cancellable-operation.js\";\nimport {\n\tobservationMatchesConfig,\n\ttype SyncAttentionController,\n\ttype SyncAttentionOrigin,\n\tsyncAttentionMatchesConfig,\n} from \"../ui/sync-attention.js\";\nimport { parseOptions, splitArgs } from \"./command.js\";\nimport { executeCommand, executeRecoveryCommand } from \"./command-execution.js\";\n\nconst STATUS_KEY = \"sync\";\n\nexport async function handleCommand(\n\trawArgs: string,\n\tctx: ExtensionCommandContext,\n\tsessionSignal: AbortSignal,\n\tloaders: SyncLoaders,\n\tattention: SyncAttentionController,\n) {\n\tawait reconcileObservation(attention, sessionSignal);\n\tif (sessionSignal.aborted) return;\n\tconst run = (route: string, signal?: AbortSignal, onCommit?: () => void, target?: string) =>\n\t\texecuteCommand(\n\t\t\troute,\n\t\t\tctx,\n\t\t\tcombineSignals(sessionSignal, signal),\n\t\t\tloaders,\n\t\t\tobservationCommitCallback(attention, sessionSignal, onCommit),\n\t\t\ttarget,\n\t\t);\n\tif (!rawArgs.trim()) {\n\t\ttry {\n\t\t\tconst { showSyncManager } = await import(\"../ui/manager-ui.js\");\n\t\t\tif (sessionSignal.aborted) return;\n\t\t\tawait showSyncManager(ctx, run, sessionSignal, {\n\t\t\t\tgetAttention: () => attention.current(),\n\t\t\t\tgetObservation: () => attention.observation(),\n\t\t\t\tonObservationInvalidated: () => attention.clearObservation(),\n\t\t\t\tonSelectionResolved: (expected) => {\n\t\t\t\t\tif (attention.current() === expected) attention.clear(ctx);\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tif (sessionSignal.aborted) return;\n\t\t\tctx.ui.setStatus(STATUS_KEY, undefined);\n\t\t\tctx.ui.notify(errorMessage(error), \"error\");\n\t\t}\n\t\tawait reconcileObservation(attention, sessionSignal);\n\t\tif (!sessionSignal.aborted) await attention.publish(ctx, sessionSignal);\n\t\treturn;\n\t}\n\tconst result = await run(rawArgs);\n\tif (result.kind === \"decision-required\") {\n\t\tctx.ui.notify(result.decision.directMessage, \"error\");\n\t} else if (result.kind === \"remote-selection-required\") {\n\t\tconst origin = directSelectionOrigin(rawArgs);\n\t\tif (origin) attention.set(result.decision, origin);\n\t\tconst deterministic = splitArgs(rawArgs).some((arg) => arg === \"--yes\" || arg === \"-y\");\n\t\tif (origin && ctx.mode === \"tui\" && !deterministic) {\n\t\t\tawait resolveSelectionAttention(ctx, attention, sessionSignal, loaders);\n\t\t} else {\n\t\t\tctx.ui.notify(\n\t\t\t\tformatRemoteSelectionMismatch(\n\t\t\t\t\tresult.decision.setupName,\n\t\t\t\t\tresult.decision.localInclude,\n\t\t\t\t\tresult.decision.remoteInclude,\n\t\t\t\t),\n\t\t\t\t\"error\",\n\t\t\t);\n\t\t}\n\t}\n\tawait clearAttentionAfterCompletedOperation(rawArgs, result, ctx, attention, sessionSignal);\n\tawait reconcileSelectionAttention(ctx, attention, sessionSignal);\n\tawait reconcileObservation(attention, sessionSignal);\n\tif (!sessionSignal.aborted) await attention.publish(ctx, sessionSignal);\n}\n\nfunction observationCommitCallback(\n\tattention: SyncAttentionController,\n\tsessionSignal: AbortSignal,\n\tonCommit?: () => void,\n) {\n\tconst observed = attention.observation();\n\treturn () => {\n\t\t// Opening or cancelling a review changes nothing. A commit may change data\n\t\t// even if later publication/baseline cleanup fails; never restore old hints.\n\t\tif (!sessionSignal.aborted && attention.observation() === observed)\n\t\t\tattention.clearObservation();\n\t\tonCommit?.();\n\t};\n}\n\nasync function reconcileObservation(attention: SyncAttentionController, signal: AbortSignal) {\n\tconst observed = attention.observation();\n\tif (!observed || signal.aborted) return;\n\ttry {\n\t\tconst config = await loadConfig();\n\t\tif (signal.aborted || attention.observation() !== observed) return;\n\t\tif (!observationMatchesConfig(observed, config)) {\n\t\t\tattention.clearObservation();\n\t\t\treturn;\n\t\t}\n\t\tconst state = await readStateForConfig(config);\n\t\tif (signal.aborted || attention.observation() !== observed) return;\n\t\tif (syncStateFingerprint(state) !== observed.inspection.stateIdentity)\n\t\t\tattention.clearObservation();\n\t} catch {\n\t\tif (!signal.aborted && attention.observation() === observed) attention.clearObservation();\n\t}\n}\n\nasync function clearAttentionAfterCompletedOperation(\n\trawArgs: string,\n\tresult: RunRouteResult,\n\tctx: ExtensionContext,\n\tattention: SyncAttentionController,\n\tsignal: AbortSignal,\n) {\n\tif (result.kind !== \"completed\" || result.outcome === \"cancelled\" || signal.aborted) return;\n\tconst [command, ...rest] = splitArgs(rawArgs);\n\tif (command !== \"sync\" && command !== \"pull\" && command !== \"push\") return;\n\tconst current = attention.current();\n\tif (!current) return;\n\ttry {\n\t\tconst options = parseOptions(rest);\n\t\tconst setupName = options.setup ?? (await loadConfig()).setupName;\n\t\tif (signal.aborted || attention.current() !== current) return;\n\t\tif (current.decision.setupName === setupName) attention.clear(ctx);\n\t} catch {\n\t\t// Attention reconciliation below owns malformed or concurrently changed settings.\n\t}\n}\n\nasync function reconcileSelectionAttention(\n\tctx: ExtensionContext,\n\tattention: SyncAttentionController,\n\tsignal: AbortSignal,\n) {\n\tconst current = attention.current();\n\tif (!current || signal.aborted) return;\n\ttry {\n\t\tconst config = await loadConfig(current.decision.setupName);\n\t\tif (signal.aborted || attention.current() !== current) return;\n\t\tif (!syncAttentionMatchesConfig(current, config)) attention.clear(ctx);\n\t} catch {\n\t\tif (!signal.aborted && attention.current() === current) attention.clear(ctx);\n\t}\n}\n\nfunction directSelectionOrigin(rawArgs: string): SyncAttentionOrigin | undefined {\n\tconst command = splitArgs(rawArgs)[0];\n\treturn command === \"sync\" || command === \"pull\" || command === \"push\" ? command : undefined;\n}\n\nexport async function resolveSelectionAttention(\n\tctx: ExtensionContext,\n\tattention: SyncAttentionController,\n\tsignal: AbortSignal,\n\tloaders: SyncLoaders,\n\toptions: {\n\t\tcancelLabel?: string;\n\t\twithStateAccess?: <T>(task: () => Promise<T>) => Promise<T>;\n\t} = {},\n) {\n\tconst current = attention.current();\n\tif (!current || signal.aborted) return;\n\tconst { dispatchManagerResult } = await import(\"../ui/manager-result-dispatcher.js\");\n\tif (signal.aborted || attention.current() !== current) return;\n\tawait dispatchManagerResult(\n\t\tctx,\n\t\t{ kind: \"remote-selection-required\", decision: current.decision },\n\t\tcurrent.origin,\n\t\t(route, actionSignal, onCommit, target) => {\n\t\t\tconst execute = () =>\n\t\t\t\texecuteRecoveryCommand(\n\t\t\t\t\troute,\n\t\t\t\t\tctx,\n\t\t\t\t\tcombineSignals(signal, actionSignal),\n\t\t\t\t\tloaders,\n\t\t\t\t\tobservationCommitCallback(attention, signal, onCommit),\n\t\t\t\t\ttarget,\n\t\t\t\t);\n\t\t\treturn options.withStateAccess ? options.withStateAccess(execute) : execute();\n\t\t},\n\t\tsignal,\n\t\t{\n\t\t\tcancelLabel: options.cancelLabel,\n\t\t\twithStateAccess: options.withStateAccess,\n\t\t\tonSelectionResolved: () => {\n\t\t\t\tif (attention.current() === current) attention.clear(ctx);\n\t\t\t},\n\t\t},\n\t);\n}\n", "export function isMissingConfigError(error: unknown) {\n\treturn (\n\t\terror instanceof Error &&\n\t\t(error.message.startsWith(\"Missing pi-sync settings.\") ||\n\t\t\terror.message === \"No sync setups are configured.\")\n\t);\n}\n", "import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { setSyncSetupCompletions } from \"../commands/command.js\";\nimport type { CommandOptions } from \"../commands/command-types.js\";\nimport { loadConfig, loadPartialConfig } from \"../settings/config.js\";\nimport { isMissingConfigError } from \"../settings/config-errors.js\";\nimport { consumeLocalConfigMigrationNotice } from \"../settings/config-file.js\";\nimport { configuredSyncSetupNames } from \"../settings/settings-store.js\";\nimport { snapshotOptionsForContext } from \"../snapshot/session-paths.js\";\nimport { recoverSnapshotTransactionsOnStartup } from \"../snapshot/snapshot-transaction.js\";\nimport { withLock } from \"../state/lock.js\";\nimport { stateDirectoryMigrationNotice } from \"../state/state-directory.js\";\nimport { ensureStateDir, readStateForConfig } from \"../state/sync-state-store.js\";\nimport { safeTerminalText } from \"../ui/terminal-text.js\";\nimport { throwIfAborted } from \"./signals.js\";\nimport { errorMessage } from \"./sync-errors.js\";\nimport type { SyncLoaders } from \"./sync-loaders.js\";\n\nconst AUTO_SYNC_OPTIONS: CommandOptions = {\n\tyes: true,\n\tforce: false,\n\tstale: false,\n\tsilent: true,\n\treload: false,\n\tauto: true,\n\targs: [],\n};\n\nconst STATUS_KEY = \"sync\";\n\nexport async function startSession(ctx: ExtensionContext, signal: AbortSignal) {\n\tthrowIfAborted(signal);\n\tconst stateNotice = stateDirectoryMigrationNotice();\n\tif (stateNotice && ctx.hasUI) ctx.ui.notify(stateNotice, \"warning\");\n\t// Recovery can restore managed files: finish it before Pi accepts user edits.\n\t// Unlike remote inspection, it must never be detached behind startup.\n\tawait recoverSnapshotTransactionsOnStartup();\n\tthrowIfAborted(signal);\n\ttry {\n\t\tconst names = await configuredSyncSetupNames();\n\t\tthrowIfAborted(signal);\n\t\tsetSyncSetupCompletions(names);\n\t} catch {\n\t\tif (signal.aborted) return;\n\t\tsetSyncSetupCompletions([]);\n\t}\n\tconst migrationNotice = consumeLocalConfigMigrationNotice();\n\tif (migrationNotice && ctx.hasUI) ctx.ui.notify(migrationNotice, \"warning\");\n\tthrowIfAborted(signal);\n\tif (!ctx.hasUI) return;\n\ttry {\n\t\tconst config = await loadConfig();\n\t\tthrowIfAborted(signal);\n\t\treturn config.automatic ? config : undefined;\n\t} catch (error) {\n\t\tthrowIfAborted(signal);\n\t\tif (!isMissingConfigError(error)) {\n\t\t\tctx.ui.notify(\n\t\t\t\t`pi-sync startup check skipped: ${safeTerminalText(errorMessage(error))}`,\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t}\n\t}\n}\n\nexport async function autoPushSessions(\n\tctx: ExtensionContext,\n\tsignal: AbortSignal,\n\tloaders: SyncLoaders,\n) {\n\ttry {\n\t\tconst partial = await loadPartialConfig();\n\t\tthrowIfAborted(signal);\n\t\tif (!partial.automatic) return;\n\t\tif (!partial.include.includes(\"sessions\")) return;\n\t\tawait ensureStateDir();\n\t\tthrowIfAborted(signal);\n\t\tconst config = await loadConfig();\n\t\tthrowIfAborted(signal);\n\t\tif (!config.include.includes(\"sessions\")) return;\n\t\tconst [operations, snapshotModule, syncStateModule] = await Promise.all([\n\t\t\tloaders.operations(),\n\t\t\tloaders.snapshot(),\n\t\t\tloaders.syncState(),\n\t\t]);\n\t\tthrowIfAborted(signal);\n\t\tawait withLock(\"auto-session-push\", async () => {\n\t\t\tthrowIfAborted(signal);\n\t\t\tconst state = await readStateForConfig(config);\n\t\t\tthrowIfAborted(signal);\n\t\t\tconst local = await snapshotModule.createSnapshot(config.snapshotIdentity, {\n\t\t\t\t...snapshotOptionsForContext(ctx, config),\n\t\t\t\tsignal,\n\t\t\t});\n\t\t\tthrowIfAborted(signal);\n\t\t\tif (!syncStateModule.hasLocalChanges(local, state, config)) return;\n\t\t\tawait operations.push(ctx, { ...AUTO_SYNC_OPTIONS, signal }, { config, state, local });\n\t\t});\n\t} catch (error) {\n\t\tif (signal.aborted || isMissingConfigError(error)) return;\n\t\tctx.ui.setStatus(STATUS_KEY, undefined);\n\t\tctx.ui.notify(`pi-sync session push skipped: ${errorMessage(error)}`, \"warning\");\n\t}\n}\n", "import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { loadConfigForCheck, syncCheckConfigFingerprint } from \"../settings/config.js\";\nimport { isMissingConfigError } from \"../settings/config-errors.js\";\nimport type { AnySyncConfig } from \"../settings/settings-types.js\";\nimport { snapshotOptionsForContext } from \"../snapshot/session-paths.js\";\nimport { withLock } from \"../state/lock.js\";\nimport { withStateDirectoryAccess } from \"../state/state-directory.js\";\nimport { readStateForConfig, syncStateFingerprint } from \"../state/sync-state-store.js\";\nimport type { SyncAttentionController } from \"../ui/sync-attention.js\";\nimport { safeTerminalText } from \"../ui/terminal-text.js\";\nimport { combineSignals, throwIfAborted } from \"./signals.js\";\nimport { errorMessage } from \"./sync-errors.js\";\nimport type { SyncLoaders } from \"./sync-loaders.js\";\n\nconst STATUS_KEY = \"sync\";\n\n/** One owned task per extension session, never keyed by the shared headless UI. */\nexport function createStartupCheck(\n\tloaders: SyncLoaders,\n\tattention: SyncAttentionController,\n\ttimeoutMs = 30_000,\n) {\n\tlet active:\n\t\t| {\n\t\t\t\tcontroller: AbortController;\n\t\t\t\tpromise: Promise<void>;\n\t\t\t\towner: ExtensionContext[\"sessionManager\"];\n\t\t }\n\t\t| undefined;\n\n\treturn {\n\t\tstart(ctx: ExtensionContext, sessionSignal: AbortSignal, initialConfig?: AnySyncConfig) {\n\t\t\tif (!ctx.hasUI || sessionSignal.aborted) return;\n\t\t\tif (active) throw new Error(\"Previous startup check has not been drained.\");\n\t\t\tconst controller = new AbortController();\n\t\t\tconst signal = combineSignals(sessionSignal, controller.signal);\n\t\t\tconst task = { controller, owner: ctx.sessionManager, promise: Promise.resolve() };\n\t\t\tactive = task;\n\t\t\tconst isCurrent = () =>\n\t\t\t\t!sessionSignal.aborted && active === task && task.owner === ctx.sessionManager;\n\t\t\tconst timer = setTimeout(\n\t\t\t\t() => controller.abort(new DOMException(\"Startup check timed out\", \"TimeoutError\")),\n\t\t\t\ttimeoutMs,\n\t\t\t);\n\t\t\tlet config: AnySyncConfig | undefined;\n\t\t\tlet checking = false;\n\t\t\t// Handle every detached rejection here; Pi's awaited event runner cannot catch it.\n\t\t\ttask.promise = Promise.resolve()\n\t\t\t\t.then(async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\t\tconfig = initialConfig ?? (await loadConfigForCheck());\n\t\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\t\tif (!config.automatic) return;\n\t\t\t\t\t\tconst captured = config;\n\t\t\t\t\t\tconst identity = syncCheckConfigFingerprint(captured);\n\t\t\t\t\t\tchecking = true;\n\t\t\t\t\t\tctx.ui.setStatus(STATUS_KEY, \"checking in background\");\n\t\t\t\t\t\tconst { inspectSync } = await loaders.inspection();\n\t\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\t\tconst currentConfig = await loadConfigForCheck();\n\t\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\t\tif (syncCheckConfigFingerprint(currentConfig) !== identity) return;\n\t\t\t\t\t\t// Lock order: state migration guard \u2192 sync operation \u2192 backend cache.\n\t\t\t\t\t\t// Read heads may write only private cache data. Never call doctor/syncBoth.\n\t\t\t\t\t\tconst inspection = await withStateDirectoryAccess(() => {\n\t\t\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\t\t\treturn withLock(\"startup-check\", () => {\n\t\t\t\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\t\t\t\treturn inspectSync(captured, snapshotOptionsForContext(ctx, captured), signal);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\t\tconst latest = await loadConfigForCheck();\n\t\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\t\tif (syncCheckConfigFingerprint(latest) !== identity) return;\n\t\t\t\t\t\tconst state = await withStateDirectoryAccess(() => readStateForConfig(latest));\n\t\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\t\tif (syncStateFingerprint(state) !== inspection.stateIdentity || !isCurrent()) return;\n\t\t\t\t\t\tattention.observe({\n\t\t\t\t\t\t\tsetupName: captured.setupName,\n\t\t\t\t\t\t\tconfigIdentity: identity,\n\t\t\t\t\t\t\tcheckedAt: new Date().toISOString(),\n\t\t\t\t\t\t\tinspection,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (ctx.mode === \"rpc\") attention.notifyObservation(ctx);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (!isCurrent() || sessionSignal.aborted || isMissingConfigError(error)) return;\n\t\t\t\t\t\tif (signal.aborted && controller.signal.reason?.name !== \"TimeoutError\") return;\n\t\t\t\t\t\t// A settings edit invalidates failures as well as successful observations.\n\t\t\t\t\t\tif (config) {\n\t\t\t\t\t\t\tconst latest = await loadConfigForCheck().catch(() => undefined);\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t!isCurrent() ||\n\t\t\t\t\t\t\t\t(signal.aborted && controller.signal.reason?.name !== \"TimeoutError\")\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t!latest ||\n\t\t\t\t\t\t\t\tsyncCheckConfigFingerprint(latest) !== syncCheckConfigFingerprint(config)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t`pi-sync startup check skipped: ${safeTerminalText(errorMessage(error))}. Run /sync status to retry. No startup transfer was performed.`,\n\t\t\t\t\t\t\t\"warning\",\n\t\t\t\t\t\t);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\t\tif (isCurrent() && checking) await attention.publish(ctx, sessionSignal);\n\t\t\t\t\t\tif (active === task) active = undefined;\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(() => {\n\t\t\t\t\t// UI teardown can itself throw. No unhandled rejection or retained timer.\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tif (active === task) active = undefined;\n\t\t\t\t});\n\t\t},\n\t\tasync stop() {\n\t\t\tconst task = active;\n\t\t\tif (!task) return;\n\t\t\ttask.controller.abort(new DOMException(\"Startup check cancelled\", \"AbortError\"));\n\t\t\t// Drain the actual work, including child/ref cleanup, before foreground guards.\n\t\t\tawait task.promise;\n\t\t},\n\t};\n}\n", "type SetupSwitchModule = Pick<typeof import(\"./setup-switch.js\"), \"useSyncSetup\">;\ntype SnapshotModule = Pick<typeof import(\"../snapshot/snapshot.js\"), \"createSnapshot\">;\ntype SyncStateModule = Pick<typeof import(\"./sync-state.js\"), \"hasLocalChanges\">;\ntype SyncOperations = typeof import(\"./sync-operations.js\");\n\ntype SyncInspectionModule = Pick<typeof import(\"./sync-inspection.js\"), \"inspectSync\">;\n\nexport interface SyncDependencies {\n\tloadSyncInspection(): Promise<SyncInspectionModule>;\n\tloadSetupSwitch(): Promise<SetupSwitchModule>;\n\tloadSnapshot(): Promise<SnapshotModule>;\n\tloadSyncState(): Promise<SyncStateModule>;\n\tloadSyncOperations(): Promise<SyncOperations>;\n}\n\nexport interface SyncLoaders {\n\tinspection(): Promise<SyncInspectionModule>;\n\tsetupSwitch(): Promise<SetupSwitchModule>;\n\tsnapshot(): Promise<SnapshotModule>;\n\tsyncState(): Promise<SyncStateModule>;\n\toperations(): Promise<SyncOperations>;\n}\n\nexport function createSyncLoaders(dependencies: Partial<SyncDependencies>): SyncLoaders {\n\tconst loaders: SyncLoaders = {\n\t\tinspection: cachedModuleLoader(\n\t\t\tdependencies.loadSyncInspection ?? (() => import(\"./sync-inspection.js\")),\n\t\t),\n\t\tsetupSwitch: cachedModuleLoader(\n\t\t\tdependencies.loadSetupSwitch ?? (() => import(\"./setup-switch.js\")),\n\t\t),\n\t\tsnapshot: cachedModuleLoader(\n\t\t\tdependencies.loadSnapshot ?? (() => import(\"../snapshot/snapshot.js\")),\n\t\t),\n\t\tsyncState: cachedModuleLoader(dependencies.loadSyncState ?? (() => import(\"./sync-state.js\"))),\n\t\toperations: cachedModuleLoader(\n\t\t\tdependencies.loadSyncOperations ?? (() => import(\"./sync-operations.js\")),\n\t\t),\n\t};\n\treturn loaders;\n}\n\nfunction cachedModuleLoader<Module>(load: () => Promise<Module>): () => Promise<Module> {\n\tlet pending: Promise<Module> | undefined;\n\treturn () => {\n\t\tif (!pending) {\n\t\t\tpending = load().catch((error) => {\n\t\t\t\tpending = undefined;\n\t\t\t\tthrow error;\n\t\t\t});\n\t\t}\n\t\treturn pending;\n\t};\n}\n", "import type { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport { completeSyncArguments, splitArgs } from \"./commands/command.js\";\nimport { handleCommand } from \"./commands/command-handler.js\";\nimport type { AnySyncConfig } from \"./settings/settings-types.js\";\nimport { withStateDirectoryAccess } from \"./state/state-directory.js\";\nimport { autoPushSessions, startSession } from \"./sync/automatic-sync.js\";\nimport { combineSignals } from \"./sync/signals.js\";\nimport { createStartupCheck } from \"./sync/startup-check.js\";\nimport { errorMessage } from \"./sync/sync-errors.js\";\nimport { createSyncLoaders, type SyncDependencies } from \"./sync/sync-loaders.js\";\nimport { createSyncAttentionController } from \"./ui/sync-attention.js\";\nimport { safeTerminalText } from \"./ui/terminal-text.js\";\n\nconst STATUS_KEY = \"sync\";\n\nexport default function sync(pi: ExtensionAPI, dependencies: Partial<SyncDependencies> = {}) {\n\tconst loaders = createSyncLoaders(dependencies);\n\tconst attention = createSyncAttentionController();\n\tconst check = createStartupCheck(loaders, attention);\n\tlet sessionAbort = new AbortController();\n\tlet shutdownAbort: AbortController | undefined;\n\tlet initialization = Promise.resolve<AnySyncConfig | false | undefined>(undefined);\n\n\tpi.registerCommand(\"sync\", {\n\t\tdescription: \"Sync Pi settings through Git, WebDAV, R2, or S3-compatible storage\",\n\t\tgetArgumentCompletions: completeSyncArguments,\n\t\thandler: async (args, ctx) => {\n\t\t\tif (!ctx.hasUI) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"/sync requires TUI or RPC mode so results and safety prompts are observable.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst signal = sessionAbort.signal;\n\t\t\tconst ready = await initialization;\n\t\t\tif (signal.aborted) return;\n\t\t\tawait check.stop();\n\t\t\tif (signal.aborted) return;\n\t\t\tconst command = splitArgs(args)[0];\n\t\t\tif (\n\t\t\t\tready === false &&\n\t\t\t\tcommand !== \"help\" &&\n\t\t\t\tcommand !== \"unlock\" &&\n\t\t\t\tcommand !== \"migrate-state\"\n\t\t\t) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\"pi-sync recovery required. Repair the startup error, then /reload before syncing. Use /sync help for recovery guidance.\",\n\t\t\t\t\t\"error\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst run = () => handleCommand(args, ctx, signal, loaders, attention);\n\t\t\t// Drain background cache/child cleanup before entering any foreground guard.\n\t\t\t// Help must remain reachable when the state roots themselves need repair.\n\t\t\tif (command === \"migrate-state\" || command === \"help\") await run();\n\t\t\telse await withStateDirectoryAccess(run);\n\t\t},\n\t});\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tshutdownAbort?.abort(new DOMException(\"Session replaced\", \"AbortError\"));\n\t\tshutdownAbort = undefined;\n\t\tsessionAbort.abort(new DOMException(\"Session replaced\", \"AbortError\"));\n\t\tsessionAbort = new AbortController();\n\t\tconst signal = sessionAbort.signal;\n\t\tattention.reset(ctx);\n\t\tconst previous = initialization;\n\t\tinitialization = (async () => {\n\t\t\tawait previous;\n\t\t\tif (signal.aborted) return false;\n\t\t\tawait check.stop();\n\t\t\tif (signal.aborted) return false;\n\t\t\ttry {\n\t\t\t\tconst config = await withStateDirectoryAccess(() => startSession(ctx, signal));\n\t\t\t\treturn signal.aborted ? false : config;\n\t\t\t} catch (error) {\n\t\t\t\tif (!signal.aborted && ctx.hasUI) {\n\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t`pi-sync recovery required: ${safeTerminalText(errorMessage(error))}`,\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t})();\n\t\tconst ready = await initialization;\n\t\tif (ready && !signal.aborted) check.start(ctx, signal, ready);\n\t});\n\n\tpi.on(\"session_shutdown\", async (event, ctx) => {\n\t\tsessionAbort.abort(new DOMException(\"Session shut down\", \"AbortError\"));\n\t\tattention.reset(ctx);\n\t\tshutdownAbort?.abort(new DOMException(\"Session shut down again\", \"AbortError\"));\n\t\tconst controller = new AbortController();\n\t\tshutdownAbort = controller;\n\t\tconst signal = combineSignals(controller.signal, AbortSignal.timeout(30_000));\n\t\tconst reason =\n\t\t\ttypeof event === \"object\" && event ? (event as { reason?: string }).reason : undefined;\n\t\ttry {\n\t\t\tconst ready = await initialization;\n\t\t\tif (signal.aborted) return;\n\t\t\tawait check.stop();\n\t\t\tif (signal.aborted) return;\n\t\t\tif (ready !== false && reason !== \"reload\") {\n\t\t\t\tawait withStateDirectoryAccess(async () => {\n\t\t\t\t\tif (signal.aborted) return;\n\t\t\t\t\tawait autoPushSessions(ctx, signal, loaders);\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (!signal.aborted) {\n\t\t\t\tctx.ui.notify(`pi-sync session push skipped: ${errorMessage(error)}`, \"warning\");\n\t\t\t}\n\t\t} finally {\n\t\t\tif (shutdownAbort === controller) shutdownAbort = undefined;\n\t\t}\n\t\tif (signal.aborted) return;\n\t\tctx.ui.setStatus(STATUS_KEY, undefined);\n\t});\n}\n\nexport type { SyncDependencies } from \"./sync/sync-loaders.js\";\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,IAAM,aAAa;AAEnB,eAAsB,uBACrB,SACA,KACA,QACA,SACA,UACA,OAC0B;AAC1B,MAAI;AACH,UAAM,CAAC,YAAY,GAAG,IAAI,IAAI,UAAU,OAAO;AAC/C,QAAI,eAAe,UAAU,eAAe,UAAU,eAAe,QAAQ;AAC5E,YAAM,IAAI,MAAM,oCAAoC,cAAc,SAAS,EAAE;AAAA,IAC9E;AACA,UAAM,UAAU,aAAa,IAAI;AACjC,QAAI,UAAU,OAAW,SAAQ,QAAQ;AACzC,QAAI,OAAQ,SAAQ,SAAS;AAC7B,QAAI,SAAU,SAAQ,WAAW;AACjC,YAAQ,SAAS;AACjB,YAAQ,OAAO;AACf,2BAAuB,YAAY,OAAO;AAC1C,UAAM,aAAa,MAAM,QAAQ,WAAW;AAC5C,mBAAe,QAAQ,MAAM;AAC7B,QAAI,eAAe,QAAQ;AAC1B,YAAM,UAAU,MAAM,SAAS,QAAQ,MAAM,WAAW,KAAK,KAAK,OAAO,CAAC;AAC1E,aAAO,EAAE,MAAM,aAAa,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC,EAAG;AAAA,IAC7D;AACA,QAAI,eAAe,QAAQ;AAC1B,YAAM,UAAU,MAAM,SAAS,QAAQ,MAAM,WAAW,KAAK,KAAK,OAAO,CAAC;AAC1E,aAAO,EAAE,MAAM,aAAa,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC,EAAG;AAAA,IAC7D;AACA,UAAM,SAAS,QAAQ,MAAM,WAAW,SAAS,KAAK,OAAO,CAAC;AAC9D,WAAO,EAAE,MAAM,YAAY;AAAA,EAC5B,SAAS,OAAO;AACf,QAAI,QAAQ,QAAS,QAAO,EAAE,MAAM,SAAS;AAC7C,QAAI,GAAG,UAAU,YAAY,MAAS;AACtC,QAAI,iBAAiB,8BAA8B;AAClD,aAAO,EAAE,MAAM,6BAA6B,UAAU,MAAM,SAAS;AAAA,IACtE;AACA,QAAI,4BAA4B,KAAK,GAAG;AACvC,aAAO,EAAE,MAAM,qBAAqB,UAAU,MAAM,SAAS;AAAA,IAC9D;AACA,QAAI,GAAG,OAAO,kBAAkB,KAAK,GAAG,OAAO;AAC/C,WAAO,EAAE,MAAM,SAAS;AAAA,EACzB;AACD;AAEA,eAAsB,eACrB,SACA,KACA,QACA,SACA,UACA,OAC0B;AAC1B,MAAI;AACH,UAAM,UAAU,MAAM,mBAAmB,SAAS,GAAG;AACrD,QAAI,QAAQ,WAAW,CAAC,QAAS,QAAO,EAAE,MAAM,YAAY;AAC5D,UAAM,EAAE,YAAY,KAAK,IAAI;AAC7B,UAAM,UAAU,aAAa,IAAI;AACjC,QAAI,UAAU,OAAW,SAAQ,QAAQ;AACzC,QAAI,OAAQ,SAAQ,SAAS;AAC7B,QAAI,SAAU,SAAQ,WAAW;AACjC,2BAAuB,YAAY,OAAO;AAE1C,YAAQ,YAAY;AAAA,MACnB,KAAK;AACJ,YAAI,GAAG,OAAO,MAAM,GAAG,MAAM;AAC7B,eAAO,EAAE,MAAM,YAAY;AAAA,MAC5B,KAAK,OAAO;AACX,cAAM,EAAE,aAAa,IAAI,MAAM,QAAQ,YAAY;AACnD,uBAAe,QAAQ,MAAM;AAC7B,cAAM;AAAA,UACL;AAAA,UACA,QAAQ,KAAK,CAAC,KAAK;AAAA,UACnB,OAAO,kBAAkB;AACxB,kBAAM,aAAa,MAAM,QAAQ,WAAW;AAC5C,2BAAe,QAAQ,MAAM;AAC7B,mBAAO;AAAA,cAAS;AAAA,cAAQ,MACvB,WAAW,KAAK,KAAK,EAAE,GAAG,SAAS,OAAO,cAAc,CAAC;AAAA,YAC1D;AAAA,UACD;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,QACT;AACA,eAAO,EAAE,MAAM,YAAY;AAAA,MAC5B;AAAA,MACA,KAAK;AACJ,cAAM,WAAW,KAAK,MAAM;AAC5B,eAAO,EAAE,MAAM,YAAY;AAAA,MAC5B,KAAK;AACJ,cAAM,WAAW,KAAK,OAAO;AAC7B,eAAO,EAAE,MAAM,YAAY;AAAA,MAC5B,KAAK,SAAS;AACb,cAAM,EAAE,kBAAkB,IAAI,MAAM,OAAO,qCAAyB;AACpE,uBAAe,QAAQ,MAAM;AAC7B,cAAM,kBAAkB,KAAK,QAAQ,OAAO,QAAQ,MAAM;AAC1D,eAAO,EAAE,MAAM,YAAY;AAAA,MAC5B;AAAA,MACA,KAAK,UAAU;AACd,cAAM,aAAa,MAAM,QAAQ,WAAW;AAC5C,uBAAe,QAAQ,MAAM;AAC7B,cAAM,WAAW,OAAO,KAAK,OAAO;AACpC,eAAO,EAAE,MAAM,YAAY;AAAA,MAC5B;AAAA,MACA,KAAK,QAAQ;AACZ,cAAM,aAAa,MAAM,QAAQ,WAAW;AAC5C,uBAAe,QAAQ,MAAM;AAC7B,cAAM,WAAW,KAAK,KAAK,OAAO;AAClC,eAAO,EAAE,MAAM,YAAY;AAAA,MAC5B;AAAA,MACA,KAAK,UAAU;AACd,cAAM,aAAa,MAAM,QAAQ,WAAW;AAC5C,uBAAe,QAAQ,MAAM;AAC7B,cAAM,WAAW,OAAO,KAAK,OAAO;AACpC,eAAO,EAAE,MAAM,YAAY;AAAA,MAC5B;AAAA,MACA,KAAK,QAAQ;AACZ,cAAM,aAAa,MAAM,QAAQ,WAAW;AAC5C,uBAAe,QAAQ,MAAM;AAC7B,cAAM,UAAU,MAAM,SAAS,QAAQ,MAAM,WAAW,KAAK,KAAK,OAAO,CAAC;AAC1E,eAAO,EAAE,MAAM,aAAa,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC,EAAG;AAAA,MAC7D;AAAA,MACA,KAAK,QAAQ;AACZ,cAAM,aAAa,MAAM,QAAQ,WAAW;AAC5C,uBAAe,QAAQ,MAAM;AAC7B,cAAM,UAAU,MAAM,SAAS,QAAQ,MAAM,WAAW,KAAK,KAAK,OAAO,CAAC;AAC1E,eAAO,EAAE,MAAM,aAAa,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC,EAAG;AAAA,MAC7D;AAAA,MACA,KAAK,QAAQ;AACZ,cAAM,aAAa,MAAM,QAAQ,WAAW;AAC5C,uBAAe,QAAQ,MAAM;AAC7B,cAAM,SAAS,QAAQ,MAAM,WAAW,SAAS,KAAK,OAAO,CAAC;AAC9D,eAAO,EAAE,MAAM,YAAY;AAAA,MAC5B;AAAA,MACA,KAAK,WAAW;AACf,cAAM,aAAa,MAAM,QAAQ,WAAW;AAC5C,uBAAe,QAAQ,MAAM;AAC7B,cAAM,WAAW,QAAQ,KAAK,OAAO;AACrC,eAAO,EAAE,MAAM,YAAY;AAAA,MAC5B;AAAA,MACA,KAAK,YAAY;AAChB,cAAM,aAAa,MAAM,QAAQ,WAAW;AAC5C,uBAAe,QAAQ,MAAM;AAC7B,cAAM,SAAS,YAAY,MAAM,WAAW,SAAS,KAAK,OAAO,CAAC;AAClE,eAAO,EAAE,MAAM,YAAY;AAAA,MAC5B;AAAA,MACA,KAAK;AACJ,cAAM,sBAAsB,KAAK,OAAO;AACxC,eAAO,EAAE,MAAM,YAAY;AAAA,MAC5B,KAAK;AACJ,cAAM,OAAO,KAAK,OAAO;AACzB,eAAO,EAAE,MAAM,YAAY;AAAA,MAC5B;AACC,YAAI,GAAG,OAAO,0BAA0B,UAAU;AAAA;AAAA,EAAO,MAAM,CAAC,IAAI,SAAS;AAC7E,eAAO,EAAE,MAAM,SAAS;AAAA,IAC1B;AAAA,EACD,SAAS,OAAO;AACf,QAAI,QAAQ,QAAS,QAAO,EAAE,MAAM,SAAS;AAC7C,QAAI,GAAG,UAAU,YAAY,MAAS;AACtC,QAAI,iBAAiB,yBAA0B,OAAM;AACrD,QAAI,iBAAiB,8BAA8B;AAClD,aAAO,EAAE,MAAM,6BAA6B,UAAU,MAAM,SAAS;AAAA,IACtE;AACA,QAAI,4BAA4B,KAAK,GAAG;AACvC,aAAO,EAAE,MAAM,qBAAqB,UAAU,MAAM,SAAS;AAAA,IAC9D;AACA,QAAI,GAAG,OAAO,kBAAkB,KAAK,GAAG,OAAO;AAC/C,WAAO,EAAE,MAAM,SAAS;AAAA,EACzB;AACD;AAEA,eAAe,sBAAsB,KAA8B,SAAyB;AAC3F,QAAM,SAAS,8BAA8B;AAC7C,MAAI,CAAC,QAAQ;AACZ,QAAI,GAAG,OAAO,gEAAgE,MAAM;AACpF;AAAA,EACD;AACA,MACC,CAAC,QAAQ,OACT,CAAE,MAAM,IAAI,GAAG;AAAA,IACd;AAAA,IACA;AAAA,IACA,EAAE,QAAQ,QAAQ,OAAO;AAAA,EAC1B,GACC;AACD,QAAI,GAAG,OAAO,sCAAsC,MAAM;AAC1D;AAAA,EACD;AACA,iBAAe,QAAQ,MAAM;AAC7B,QAAM,SAAS,MAAM,4BAA4B;AACjD,iBAAe,QAAQ,MAAM;AAC7B,MAAI,OAAO,WAAW,SAAS;AAC9B,QAAI,GAAG,OAAO,gEAAgE,MAAM;AACpF;AAAA,EACD;AACA,MAAI,GAAG,OAAO,OAAO,SAAS,OAAO,WAAW,aAAa,SAAS,SAAS;AAChF;AAEA,eAAe,WAAW,KAA8B,QAAsB;AAC7E,QAAM,aAAa,gBAAgB;AACnC,MAAI,MAAM,sBAAsB,GAAG;AAClC,QAAI,GAAG,OAAO,0BAA0B,MAAM,sBAAsB,CAAC,IAAI,MAAM;AAC/E;AAAA,EACD;AAEA,MAAI,IAAI,SAAS,OAAO;AACvB,UAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,mCAA6B;AACtE,mBAAe,MAAM;AACrB,UAAM,gBAAgB,KAAK,MAAM;AACjC;AAAA,EACD;AACA,QAAM,0BAA0B,oBAAoB,CAAC;AACrD,MAAI,GAAG;AAAA,IACN,WAAW,UAAU;AAAA,IACrB;AAAA,EACD;AACD;AAEA,eAAe,WAAW,KAA8B,SAAyB;AAChF,QAAM,SAAS,MAAM,WAAW,QAAQ,KAAK;AAC7C,QAAM,WAAW;AAAA,IAChB,GAAI,OAAO,QAAQ,SAAS,OAAO,qBAAqB,OAAO,QAAQ,OAAO,IAAI,CAAC;AAAA,IACnF,GAAG,qBAAqB,MAAM;AAAA,EAC/B;AACA,QAAM,eAAe,mBAAmB,MAAM;AAC9C,MAAI,GAAG;AAAA,IACN;AAAA,MACC;AAAA,MACA,eAAe,OAAO,SAAS;AAAA,MAC/B,uBAAuB,OAAO,cAAc;AAAA,MAC5C,GAAG;AAAA,MACH,iBAAiB,OAAO,WAAW;AAAA,MACnC,mBAAmB,qBAAqB,OAAO,SAAS,CAAC;AAAA,MACzD,qBAAqB,OAAO,QAAQ,KAAK,IAAI,KAAK,MAAM;AAAA,MACxD,aAAa,OAAO,QAAQ,SAAS,UAAU,IAAI,aAAa,cAAc;AAAA,MAC9E,kBAAkB,gBAAgB,CAAC;AAAA,MACnC,GAAG;AAAA,IACJ,EAAE,KAAK,IAAI;AAAA,IACX,SAAS,SAAS,IAAI,YAAY;AAAA,EACnC;AACD;AAEA,SAAS,mBAAmB,QAAuB;AAClD,UAAQ,OAAO,QAAQ,MAAM;AAAA,IAC5B,KAAK;AACJ,aAAO;AAAA,QACN;AAAA,QACA,WAAW,iBAAiB,OAAO,QAAQ,QAAQ,MAAM,CAAC;AAAA,QAC1D;AAAA,QACA,WAAW,OAAO,QAAQ,YAAY,MAAM;AAAA,MAC7C;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN;AAAA,QACA,QAAQ,iBAAiB,OAAO,QAAQ,QAAQ,KAAK,OAAO,QAAQ,QAAQ,QAAQ,CAAC;AAAA,QACrF;AAAA,QACA;AAAA,MACD;AAAA,IACD,KAAK;AACJ,aAAO;AAAA,QACN;AAAA,QACA,aAAa,OAAO,QAAQ,QAAQ,QAAQ;AAAA,QAC5C,WAAW,OAAO,QAAQ,YAAY,MAAM;AAAA,QAC5C,WAAW,OAAO,QAAQ,QAAQ,MAAM;AAAA,QACxC;AAAA,QACA;AAAA,QACA,kBAAkB,OAAO,QAAQ,QAAQ,eAAe,eAAe,gBAAgB;AAAA,MACxF;AAAA,EACF;AACD;AAEA,SAAS,iBAAiB,OAA2B;AACpD,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI;AACH,UAAM,MAAM,IAAI,IAAI,KAAK;AACzB,QAAI,WAAW;AACf,QAAI,WAAW;AACf,QAAI,SAAS;AACb,QAAI,OAAO;AACX,WAAO,IAAI,SAAS;AAAA,EACrB,QAAQ;AACP,WAAO,MAAM,QAAQ,qCAAqC,gBAAW;AAAA,EACtE;AACD;AAEA,SAAS,iBAAiB,OAA2B,UAA8B;AAClF,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI;AACH,UAAM,MAAM,IAAI,IAAI,KAAK;AACzB,QAAI,WAAW;AACf,QAAI,WAAW;AACf,QAAI,SAAS;AACb,QAAI,OAAO;AACX,WAAO,WAAW,GAAG,IAAI,MAAM,YAAO,GAAG,IAAI,MAAM,GAAG,IAAI,QAAQ;AAAA,EACnE,QAAQ;AACP,WAAO;AAAA,EACR;AACD;;;ACxTA,IAAMA,cAAa;AAEnB,eAAsB,cACrB,SACA,KACA,eACA,SACA,WACC;AACD,QAAM,qBAAqB,WAAW,aAAa;AACnD,MAAI,cAAc,QAAS;AAC3B,QAAM,MAAM,CAAC,OAAe,QAAsB,UAAuB,WACxE;AAAA,IACC;AAAA,IACA;AAAA,IACA,eAAe,eAAe,MAAM;AAAA,IACpC;AAAA,IACA,0BAA0B,WAAW,eAAe,QAAQ;AAAA,IAC5D;AAAA,EACD;AACD,MAAI,CAAC,QAAQ,KAAK,GAAG;AACpB,QAAI;AACH,YAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,iCAAqB;AAC9D,UAAI,cAAc,QAAS;AAC3B,YAAM,gBAAgB,KAAK,KAAK,eAAe;AAAA,QAC9C,cAAc,MAAM,UAAU,QAAQ;AAAA,QACtC,gBAAgB,MAAM,UAAU,YAAY;AAAA,QAC5C,0BAA0B,MAAM,UAAU,iBAAiB;AAAA,QAC3D,qBAAqB,CAAC,aAAa;AAClC,cAAI,UAAU,QAAQ,MAAM,SAAU,WAAU,MAAM,GAAG;AAAA,QAC1D;AAAA,MACD,CAAC;AAAA,IACF,SAAS,OAAO;AACf,UAAI,cAAc,QAAS;AAC3B,UAAI,GAAG,UAAUA,aAAY,MAAS;AACtC,UAAI,GAAG,OAAO,aAAa,KAAK,GAAG,OAAO;AAAA,IAC3C;AACA,UAAM,qBAAqB,WAAW,aAAa;AACnD,QAAI,CAAC,cAAc,QAAS,OAAM,UAAU,QAAQ,KAAK,aAAa;AACtE;AAAA,EACD;AACA,QAAM,SAAS,MAAM,IAAI,OAAO;AAChC,MAAI,OAAO,SAAS,qBAAqB;AACxC,QAAI,GAAG,OAAO,OAAO,SAAS,eAAe,OAAO;AAAA,EACrD,WAAW,OAAO,SAAS,6BAA6B;AACvD,UAAM,SAAS,sBAAsB,OAAO;AAC5C,QAAI,OAAQ,WAAU,IAAI,OAAO,UAAU,MAAM;AACjD,UAAM,gBAAgB,UAAU,OAAO,EAAE,KAAK,CAAC,QAAQ,QAAQ,WAAW,QAAQ,IAAI;AACtF,QAAI,UAAU,IAAI,SAAS,SAAS,CAAC,eAAe;AACnD,YAAM,0BAA0B,KAAK,WAAW,eAAe,OAAO;AAAA,IACvE,OAAO;AACN,UAAI,GAAG;AAAA,QACN;AAAA,UACC,OAAO,SAAS;AAAA,UAChB,OAAO,SAAS;AAAA,UAChB,OAAO,SAAS;AAAA,QACjB;AAAA,QACA;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACA,QAAM,sCAAsC,SAAS,QAAQ,KAAK,WAAW,aAAa;AAC1F,QAAM,4BAA4B,KAAK,WAAW,aAAa;AAC/D,QAAM,qBAAqB,WAAW,aAAa;AACnD,MAAI,CAAC,cAAc,QAAS,OAAM,UAAU,QAAQ,KAAK,aAAa;AACvE;AAEA,SAAS,0BACR,WACA,eACA,UACC;AACD,QAAM,WAAW,UAAU,YAAY;AACvC,SAAO,MAAM;AAGZ,QAAI,CAAC,cAAc,WAAW,UAAU,YAAY,MAAM;AACzD,gBAAU,iBAAiB;AAC5B,eAAW;AAAA,EACZ;AACD;AAEA,eAAe,qBAAqB,WAAoC,QAAqB;AAC5F,QAAM,WAAW,UAAU,YAAY;AACvC,MAAI,CAAC,YAAY,OAAO,QAAS;AACjC,MAAI;AACH,UAAM,SAAS,MAAM,WAAW;AAChC,QAAI,OAAO,WAAW,UAAU,YAAY,MAAM,SAAU;AAC5D,QAAI,CAAC,yBAAyB,UAAU,MAAM,GAAG;AAChD,gBAAU,iBAAiB;AAC3B;AAAA,IACD;AACA,UAAM,QAAQ,MAAM,mBAAmB,MAAM;AAC7C,QAAI,OAAO,WAAW,UAAU,YAAY,MAAM,SAAU;AAC5D,QAAI,qBAAqB,KAAK,MAAM,SAAS,WAAW;AACvD,gBAAU,iBAAiB;AAAA,EAC7B,QAAQ;AACP,QAAI,CAAC,OAAO,WAAW,UAAU,YAAY,MAAM,SAAU,WAAU,iBAAiB;AAAA,EACzF;AACD;AAEA,eAAe,sCACd,SACA,QACA,KACA,WACA,QACC;AACD,MAAI,OAAO,SAAS,eAAe,OAAO,YAAY,eAAe,OAAO,QAAS;AACrF,QAAM,CAAC,SAAS,GAAG,IAAI,IAAI,UAAU,OAAO;AAC5C,MAAI,YAAY,UAAU,YAAY,UAAU,YAAY,OAAQ;AACpE,QAAM,UAAU,UAAU,QAAQ;AAClC,MAAI,CAAC,QAAS;AACd,MAAI;AACH,UAAM,UAAU,aAAa,IAAI;AACjC,UAAM,YAAY,QAAQ,UAAU,MAAM,WAAW,GAAG;AACxD,QAAI,OAAO,WAAW,UAAU,QAAQ,MAAM,QAAS;AACvD,QAAI,QAAQ,SAAS,cAAc,UAAW,WAAU,MAAM,GAAG;AAAA,EAClE,QAAQ;AAAA,EAER;AACD;AAEA,eAAe,4BACd,KACA,WACA,QACC;AACD,QAAM,UAAU,UAAU,QAAQ;AAClC,MAAI,CAAC,WAAW,OAAO,QAAS;AAChC,MAAI;AACH,UAAM,SAAS,MAAM,WAAW,QAAQ,SAAS,SAAS;AAC1D,QAAI,OAAO,WAAW,UAAU,QAAQ,MAAM,QAAS;AACvD,QAAI,CAAC,2BAA2B,SAAS,MAAM,EAAG,WAAU,MAAM,GAAG;AAAA,EACtE,QAAQ;AACP,QAAI,CAAC,OAAO,WAAW,UAAU,QAAQ,MAAM,QAAS,WAAU,MAAM,GAAG;AAAA,EAC5E;AACD;AAEA,SAAS,sBAAsB,SAAkD;AAChF,QAAM,UAAU,UAAU,OAAO,EAAE,CAAC;AACpC,SAAO,YAAY,UAAU,YAAY,UAAU,YAAY,SAAS,UAAU;AACnF;AAEA,eAAsB,0BACrB,KACA,WACA,QACA,SACA,UAGI,CAAC,GACJ;AACD,QAAM,UAAU,UAAU,QAAQ;AAClC,MAAI,CAAC,WAAW,OAAO,QAAS;AAChC,QAAM,EAAE,sBAAsB,IAAI,MAAM,OAAO,gDAAoC;AACnF,MAAI,OAAO,WAAW,UAAU,QAAQ,MAAM,QAAS;AACvD,QAAM;AAAA,IACL;AAAA,IACA,EAAE,MAAM,6BAA6B,UAAU,QAAQ,SAAS;AAAA,IAChE,QAAQ;AAAA,IACR,CAAC,OAAO,cAAc,UAAU,WAAW;AAC1C,YAAM,UAAU,MACf;AAAA,QACC;AAAA,QACA;AAAA,QACA,eAAe,QAAQ,YAAY;AAAA,QACnC;AAAA,QACA,0BAA0B,WAAW,QAAQ,QAAQ;AAAA,QACrD;AAAA,MACD;AACD,aAAO,QAAQ,kBAAkB,QAAQ,gBAAgB,OAAO,IAAI,QAAQ;AAAA,IAC7E;AAAA,IACA;AAAA,IACA;AAAA,MACC,aAAa,QAAQ;AAAA,MACrB,iBAAiB,QAAQ;AAAA,MACzB,qBAAqB,MAAM;AAC1B,YAAI,UAAU,QAAQ,MAAM,QAAS,WAAU,MAAM,GAAG;AAAA,MACzD;AAAA,IACD;AAAA,EACD;AACD;;;ACxMO,SAAS,qBAAqB,OAAgB;AACpD,SACC,iBAAiB,UAChB,MAAM,QAAQ,WAAW,2BAA2B,KACpD,MAAM,YAAY;AAErB;;;ACWA,IAAM,oBAAoC;AAAA,EACzC,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM,CAAC;AACR;AAEA,IAAMC,cAAa;AAEnB,eAAsB,aAAa,KAAuB,QAAqB;AAC9E,iBAAe,MAAM;AACrB,QAAM,cAAc,8BAA8B;AAClD,MAAI,eAAe,IAAI,MAAO,KAAI,GAAG,OAAO,aAAa,SAAS;AAGlE,QAAM,qCAAqC;AAC3C,iBAAe,MAAM;AACrB,MAAI;AACH,UAAM,QAAQ,MAAM,yBAAyB;AAC7C,mBAAe,MAAM;AACrB,4BAAwB,KAAK;AAAA,EAC9B,QAAQ;AACP,QAAI,OAAO,QAAS;AACpB,4BAAwB,CAAC,CAAC;AAAA,EAC3B;AACA,QAAM,kBAAkB,kCAAkC;AAC1D,MAAI,mBAAmB,IAAI,MAAO,KAAI,GAAG,OAAO,iBAAiB,SAAS;AAC1E,iBAAe,MAAM;AACrB,MAAI,CAAC,IAAI,MAAO;AAChB,MAAI;AACH,UAAM,SAAS,MAAM,WAAW;AAChC,mBAAe,MAAM;AACrB,WAAO,OAAO,YAAY,SAAS;AAAA,EACpC,SAAS,OAAO;AACf,mBAAe,MAAM;AACrB,QAAI,CAAC,qBAAqB,KAAK,GAAG;AACjC,UAAI,GAAG;AAAA,QACN,kCAAkC,iBAAiB,aAAa,KAAK,CAAC,CAAC;AAAA,QACvE;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD;AAEA,eAAsB,iBACrB,KACA,QACA,SACC;AACD,MAAI;AACH,UAAM,UAAU,MAAM,kBAAkB;AACxC,mBAAe,MAAM;AACrB,QAAI,CAAC,QAAQ,UAAW;AACxB,QAAI,CAAC,QAAQ,QAAQ,SAAS,UAAU,EAAG;AAC3C,UAAM,eAAe;AACrB,mBAAe,MAAM;AACrB,UAAM,SAAS,MAAM,WAAW;AAChC,mBAAe,MAAM;AACrB,QAAI,CAAC,OAAO,QAAQ,SAAS,UAAU,EAAG;AAC1C,UAAM,CAAC,YAAY,gBAAgB,eAAe,IAAI,MAAM,QAAQ,IAAI;AAAA,MACvE,QAAQ,WAAW;AAAA,MACnB,QAAQ,SAAS;AAAA,MACjB,QAAQ,UAAU;AAAA,IACnB,CAAC;AACD,mBAAe,MAAM;AACrB,UAAM,SAAS,qBAAqB,YAAY;AAC/C,qBAAe,MAAM;AACrB,YAAM,QAAQ,MAAM,mBAAmB,MAAM;AAC7C,qBAAe,MAAM;AACrB,YAAM,QAAQ,MAAM,eAAe,eAAe,OAAO,kBAAkB;AAAA,QAC1E,GAAG,0BAA0B,KAAK,MAAM;AAAA,QACxC;AAAA,MACD,CAAC;AACD,qBAAe,MAAM;AACrB,UAAI,CAAC,gBAAgB,gBAAgB,OAAO,OAAO,MAAM,EAAG;AAC5D,YAAM,WAAW,KAAK,KAAK,EAAE,GAAG,mBAAmB,OAAO,GAAG,EAAE,QAAQ,OAAO,MAAM,CAAC;AAAA,IACtF,CAAC;AAAA,EACF,SAAS,OAAO;AACf,QAAI,OAAO,WAAW,qBAAqB,KAAK,EAAG;AACnD,QAAI,GAAG,UAAUA,aAAY,MAAS;AACtC,QAAI,GAAG,OAAO,iCAAiC,aAAa,KAAK,CAAC,IAAI,SAAS;AAAA,EAChF;AACD;;;ACxFA,IAAMC,cAAa;AAGZ,SAAS,mBACf,SACA,WACA,YAAY,KACX;AACD,MAAI;AAQJ,SAAO;AAAA,IACN,MAAM,KAAuB,eAA4B,eAA+B;AACvF,UAAI,CAAC,IAAI,SAAS,cAAc,QAAS;AACzC,UAAI,OAAQ,OAAM,IAAI,MAAM,8CAA8C;AAC1E,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,SAAS,eAAe,eAAe,WAAW,MAAM;AAC9D,YAAM,OAAO,EAAE,YAAY,OAAO,IAAI,gBAAgB,SAAS,QAAQ,QAAQ,EAAE;AACjF,eAAS;AACT,YAAM,YAAY,MACjB,CAAC,cAAc,WAAW,WAAW,QAAQ,KAAK,UAAU,IAAI;AACjE,YAAM,QAAQ;AAAA,QACb,MAAM,WAAW,MAAM,IAAI,aAAa,2BAA2B,cAAc,CAAC;AAAA,QAClF;AAAA,MACD;AACA,UAAI;AACJ,UAAI,WAAW;AAEf,WAAK,UAAU,QAAQ,QAAQ,EAC7B,KAAK,YAAY;AACjB,YAAI;AACH,yBAAe,MAAM;AACrB,mBAAS,iBAAkB,MAAM,mBAAmB;AACpD,yBAAe,MAAM;AACrB,cAAI,CAAC,OAAO,UAAW;AACvB,gBAAM,WAAW;AACjB,gBAAM,WAAW,2BAA2B,QAAQ;AACpD,qBAAW;AACX,cAAI,GAAG,UAAUA,aAAY,wBAAwB;AACrD,gBAAM,EAAE,YAAY,IAAI,MAAM,QAAQ,WAAW;AACjD,yBAAe,MAAM;AACrB,gBAAM,gBAAgB,MAAM,mBAAmB;AAC/C,yBAAe,MAAM;AACrB,cAAI,2BAA2B,aAAa,MAAM,SAAU;AAG5D,gBAAM,aAAa,MAAM,yBAAyB,MAAM;AACvD,2BAAe,MAAM;AACrB,mBAAO,SAAS,iBAAiB,MAAM;AACtC,6BAAe,MAAM;AACrB,qBAAO,YAAY,UAAU,0BAA0B,KAAK,QAAQ,GAAG,MAAM;AAAA,YAC9E,CAAC;AAAA,UACF,CAAC;AACD,yBAAe,MAAM;AACrB,gBAAM,SAAS,MAAM,mBAAmB;AACxC,yBAAe,MAAM;AACrB,cAAI,2BAA2B,MAAM,MAAM,SAAU;AACrD,gBAAM,QAAQ,MAAM,yBAAyB,MAAM,mBAAmB,MAAM,CAAC;AAC7E,yBAAe,MAAM;AACrB,cAAI,qBAAqB,KAAK,MAAM,WAAW,iBAAiB,CAAC,UAAU,EAAG;AAC9E,oBAAU,QAAQ;AAAA,YACjB,WAAW,SAAS;AAAA,YACpB,gBAAgB;AAAA,YAChB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,YAClC;AAAA,UACD,CAAC;AACD,cAAI,IAAI,SAAS,MAAO,WAAU,kBAAkB,GAAG;AAAA,QACxD,SAAS,OAAO;AACf,cAAI,CAAC,UAAU,KAAK,cAAc,WAAW,qBAAqB,KAAK,EAAG;AAC1E,cAAI,OAAO,WAAW,WAAW,OAAO,QAAQ,SAAS,eAAgB;AAEzE,cAAI,QAAQ;AACX,kBAAM,SAAS,MAAM,mBAAmB,EAAE,MAAM,MAAM,MAAS;AAC/D,gBACC,CAAC,UAAU,KACV,OAAO,WAAW,WAAW,OAAO,QAAQ,SAAS;AAEtD;AACD,gBACC,CAAC,UACD,2BAA2B,MAAM,MAAM,2BAA2B,MAAM;AAExE;AAAA,UACF;AACA,cAAI,GAAG;AAAA,YACN,kCAAkC,iBAAiB,aAAa,KAAK,CAAC,CAAC;AAAA,YACvE;AAAA,UACD;AAAA,QACD,UAAE;AACD,uBAAa,KAAK;AAClB,cAAI,UAAU,KAAK,SAAU,OAAM,UAAU,QAAQ,KAAK,aAAa;AACvE,cAAI,WAAW,KAAM,UAAS;AAAA,QAC/B;AAAA,MACD,CAAC,EACA,MAAM,MAAM;AAEZ,qBAAa,KAAK;AAClB,YAAI,WAAW,KAAM,UAAS;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,IACA,MAAM,OAAO;AACZ,YAAM,OAAO;AACb,UAAI,CAAC,KAAM;AACX,WAAK,WAAW,MAAM,IAAI,aAAa,2BAA2B,YAAY,CAAC;AAE/E,YAAM,KAAK;AAAA,IACZ;AAAA,EACD;AACD;;;ACxGO,SAAS,kBAAkB,cAAsD;AACvF,QAAM,UAAuB;AAAA,IAC5B,YAAY;AAAA,MACX,aAAa,uBAAuB,MAAM,OAAO,sCAAsB;AAAA,IACxE;AAAA,IACA,aAAa;AAAA,MACZ,aAAa,oBAAoB,MAAM,OAAO,mCAAmB;AAAA,IAClE;AAAA,IACA,UAAU;AAAA,MACT,aAAa,iBAAiB,MAAM,OAAO,+BAAyB;AAAA,IACrE;AAAA,IACA,WAAW,mBAAmB,aAAa,kBAAkB,MAAM,OAAO,iCAAiB,EAAE;AAAA,IAC7F,YAAY;AAAA,MACX,aAAa,uBAAuB,MAAM,OAAO,sCAAsB;AAAA,IACxE;AAAA,EACD;AACA,SAAO;AACR;AAEA,SAAS,mBAA2B,MAAoD;AACvF,MAAI;AACJ,SAAO,MAAM;AACZ,QAAI,CAAC,SAAS;AACb,gBAAU,KAAK,EAAE,MAAM,CAAC,UAAU;AACjC,kBAAU;AACV,cAAM;AAAA,MACP,CAAC;AAAA,IACF;AACA,WAAO;AAAA,EACR;AACD;;;ACxCA,IAAMC,cAAa;AAEJ,SAAR,KAAsB,IAAkB,eAA0C,CAAC,GAAG;AAC5F,QAAM,UAAU,kBAAkB,YAAY;AAC9C,QAAM,YAAY,8BAA8B;AAChD,QAAM,QAAQ,mBAAmB,SAAS,SAAS;AACnD,MAAI,eAAe,IAAI,gBAAgB;AACvC,MAAI;AACJ,MAAI,iBAAiB,QAAQ,QAA2C,MAAS;AAEjF,KAAG,gBAAgB,QAAQ;AAAA,IAC1B,aAAa;AAAA,IACb,wBAAwB;AAAA,IACxB,SAAS,OAAO,MAAM,QAAQ;AAC7B,UAAI,CAAC,IAAI,OAAO;AACf,cAAM,IAAI;AAAA,UACT;AAAA,QACD;AAAA,MACD;AACA,YAAM,SAAS,aAAa;AAC5B,YAAM,QAAQ,MAAM;AACpB,UAAI,OAAO,QAAS;AACpB,YAAM,MAAM,KAAK;AACjB,UAAI,OAAO,QAAS;AACpB,YAAM,UAAU,UAAU,IAAI,EAAE,CAAC;AACjC,UACC,UAAU,SACV,YAAY,UACZ,YAAY,YACZ,YAAY,iBACX;AACD,YAAI,GAAG;AAAA,UACN;AAAA,UACA;AAAA,QACD;AACA;AAAA,MACD;AACA,YAAM,MAAM,MAAM,cAAc,MAAM,KAAK,QAAQ,SAAS,SAAS;AAGrE,UAAI,YAAY,mBAAmB,YAAY,OAAQ,OAAM,IAAI;AAAA,UAC5D,OAAM,yBAAyB,GAAG;AAAA,IACxC;AAAA,EACD,CAAC;AAED,KAAG,GAAG,iBAAiB,OAAO,QAAQ,QAAQ;AAC7C,mBAAe,MAAM,IAAI,aAAa,oBAAoB,YAAY,CAAC;AACvE,oBAAgB;AAChB,iBAAa,MAAM,IAAI,aAAa,oBAAoB,YAAY,CAAC;AACrE,mBAAe,IAAI,gBAAgB;AACnC,UAAM,SAAS,aAAa;AAC5B,cAAU,MAAM,GAAG;AACnB,UAAM,WAAW;AACjB,sBAAkB,YAAY;AAC7B,YAAM;AACN,UAAI,OAAO,QAAS,QAAO;AAC3B,YAAM,MAAM,KAAK;AACjB,UAAI,OAAO,QAAS,QAAO;AAC3B,UAAI;AACH,cAAM,SAAS,MAAM,yBAAyB,MAAM,aAAa,KAAK,MAAM,CAAC;AAC7E,eAAO,OAAO,UAAU,QAAQ;AAAA,MACjC,SAAS,OAAO;AACf,YAAI,CAAC,OAAO,WAAW,IAAI,OAAO;AACjC,cAAI,GAAG;AAAA,YACN,8BAA8B,iBAAiB,aAAa,KAAK,CAAC,CAAC;AAAA,YACnE;AAAA,UACD;AAAA,QACD;AACA,eAAO;AAAA,MACR;AAAA,IACD,GAAG;AACH,UAAM,QAAQ,MAAM;AACpB,QAAI,SAAS,CAAC,OAAO,QAAS,OAAM,MAAM,KAAK,QAAQ,KAAK;AAAA,EAC7D,CAAC;AAED,KAAG,GAAG,oBAAoB,OAAO,OAAO,QAAQ;AAC/C,iBAAa,MAAM,IAAI,aAAa,qBAAqB,YAAY,CAAC;AACtE,cAAU,MAAM,GAAG;AACnB,mBAAe,MAAM,IAAI,aAAa,2BAA2B,YAAY,CAAC;AAC9E,UAAM,aAAa,IAAI,gBAAgB;AACvC,oBAAgB;AAChB,UAAM,SAAS,eAAe,WAAW,QAAQ,YAAY,QAAQ,GAAM,CAAC;AAC5E,UAAM,SACL,OAAO,UAAU,YAAY,QAAS,MAA8B,SAAS;AAC9E,QAAI;AACH,YAAM,QAAQ,MAAM;AACpB,UAAI,OAAO,QAAS;AACpB,YAAM,MAAM,KAAK;AACjB,UAAI,OAAO,QAAS;AACpB,UAAI,UAAU,SAAS,WAAW,UAAU;AAC3C,cAAM,yBAAyB,YAAY;AAC1C,cAAI,OAAO,QAAS;AACpB,gBAAM,iBAAiB,KAAK,QAAQ,OAAO;AAAA,QAC5C,CAAC;AAAA,MACF;AAAA,IACD,SAAS,OAAO;AACf,UAAI,CAAC,OAAO,SAAS;AACpB,YAAI,GAAG,OAAO,iCAAiC,aAAa,KAAK,CAAC,IAAI,SAAS;AAAA,MAChF;AAAA,IACD,UAAE;AACD,UAAI,kBAAkB,WAAY,iBAAgB;AAAA,IACnD;AACA,QAAI,OAAO,QAAS;AACpB,QAAI,GAAG,UAAUA,aAAY,MAAS;AAAA,EACvC,CAAC;AACF;",
6
- "names": ["STATUS_KEY", "STATUS_KEY", "STATUS_KEY", "STATUS_KEY"]
4
+ "sourcesContent": ["import type { ExtensionCommandContext, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { loadConfig, sessionTokenWarnings, syncSessionsWarnings } from \"../settings/config.js\";\nimport { activeLocalConfigPath, createLocalConfigDocument, localConfigPath } from \"../settings/config-file.js\";\nimport { localConfigTemplate, readLocalConfigObject } from \"../settings/settings-store.js\";\nimport type { AnySyncConfig } from \"../settings/settings-types.js\";\nimport { unlock, withLock } from \"../state/lock.js\";\nimport { migrateLegacyStateDirectory, stateDirectoryMigrationNotice } from \"../state/state-directory.js\";\nimport { throwIfAborted } from \"../sync/signals.js\";\nimport { syncErrorGuidance } from \"../sync/sync-error-guidance.js\";\nimport { isSyncDecisionRequiredError, SetupPullRequiresUiError } from \"../sync/sync-errors.js\";\nimport type { SyncLoaders } from \"../sync/sync-loaders.js\";\nimport { RemoteSelectionMismatchError } from \"../sync/sync-policy.js\";\nimport { automaticSyncSummary } from \"../ui/automatic-sync-summary.js\";\nimport type { RunRouteResult } from \"../ui/cancellable-operation.js\";\nimport { setSyncStatus } from \"../ui/sync-status.js\";\nimport { parseOptions, resolveSyncCommand, splitArgs, usage, validateCommandOptions } from \"./command.js\";\nimport type { CommandOptions } from \"./command-types.js\";\n\nexport async function executeRecoveryCommand(\n rawArgs: string,\n ctx: ExtensionContext,\n signal: AbortSignal | undefined,\n loaders: SyncLoaders,\n onCommit?: () => void,\n setup?: string,\n): Promise<RunRouteResult> {\n try {\n const [subcommand, ...rest] = splitArgs(rawArgs);\n if (subcommand !== \"sync\" && subcommand !== \"pull\" && subcommand !== \"push\") {\n throw new Error(`Unsupported sync recovery route: ${subcommand ?? \"missing\"}`);\n }\n const options = parseOptions(rest);\n if (setup !== undefined) options.setup = setup;\n if (signal) options.signal = signal;\n if (onCommit) options.onCommit = onCommit;\n options.reload = false;\n options.auto = false;\n validateCommandOptions(subcommand, options);\n const operations = await loaders.operations();\n throwIfAborted(options.signal);\n if (subcommand === \"push\") {\n const outcome = await withLock(\"push\", () => operations.push(ctx, options));\n return { kind: \"completed\", ...(outcome ? { outcome } : {}) };\n }\n if (subcommand === \"pull\") {\n const outcome = await withLock(\"pull\", () => operations.pull(ctx, options));\n return { kind: \"completed\", ...(outcome ? { outcome } : {}) };\n }\n await withLock(\"sync\", () => operations.syncBoth(ctx, options));\n return { kind: \"completed\" };\n } catch (error) {\n if (signal?.aborted) return { kind: \"failed\" };\n setSyncStatus(ctx, undefined);\n if (error instanceof RemoteSelectionMismatchError) {\n return { kind: \"remote-selection-required\", decision: error.decision };\n }\n if (isSyncDecisionRequiredError(error)) {\n return { kind: \"decision-required\", decision: error.decision };\n }\n ctx.ui.notify(syncErrorGuidance(error), \"error\");\n return { kind: \"failed\" };\n }\n}\n\nexport async function executeCommand(\n rawArgs: string,\n ctx: ExtensionCommandContext,\n signal: AbortSignal | undefined,\n loaders: SyncLoaders,\n onCommit?: () => void,\n setup?: string,\n): Promise<RunRouteResult> {\n try {\n const command = await resolveSyncCommand(rawArgs, ctx);\n if (signal?.aborted || !command) return { kind: \"completed\" };\n const { subcommand, rest } = command;\n const options = parseOptions(rest);\n if (setup !== undefined) options.setup = setup;\n if (signal) options.signal = signal;\n if (onCommit) options.onCommit = onCommit;\n validateCommandOptions(subcommand, options);\n\n switch (subcommand) {\n case \"help\":\n ctx.ui.notify(usage(), \"info\");\n return { kind: \"completed\" };\n case \"use\": {\n const { useSyncSetup } = await loaders.setupSwitch();\n throwIfAborted(options.signal);\n await useSyncSetup(\n ctx,\n options.args[0] ?? \"\",\n async (selectedSetup) => {\n const operations = await loaders.operations();\n throwIfAborted(options.signal);\n return withLock(\"pull\", () => operations.pull(ctx, { ...options, setup: selectedSetup }));\n },\n undefined,\n options.signal,\n );\n return { kind: \"completed\" };\n }\n case \"init\":\n await initConfig(ctx, signal);\n return { kind: \"completed\" };\n case \"config\":\n await showConfig(ctx, options);\n return { kind: \"completed\" };\n case \"files\": {\n const { showFileSelection } = await import(\"../ui/file-selection.js\");\n throwIfAborted(options.signal);\n await showFileSelection(ctx, options.setup, options.signal);\n return { kind: \"completed\" };\n }\n case \"status\": {\n const operations = await loaders.operations();\n throwIfAborted(options.signal);\n await operations.status(ctx, options);\n return { kind: \"completed\" };\n }\n case \"diff\": {\n const operations = await loaders.operations();\n throwIfAborted(options.signal);\n await operations.diff(ctx, options);\n return { kind: \"completed\" };\n }\n case \"doctor\": {\n const operations = await loaders.operations();\n throwIfAborted(options.signal);\n await operations.doctor(ctx, options);\n return { kind: \"completed\" };\n }\n case \"push\": {\n const operations = await loaders.operations();\n throwIfAborted(options.signal);\n const outcome = await withLock(\"push\", () => operations.push(ctx, options));\n return { kind: \"completed\", ...(outcome ? { outcome } : {}) };\n }\n case \"pull\": {\n const operations = await loaders.operations();\n throwIfAborted(options.signal);\n const outcome = await withLock(\"pull\", () => operations.pull(ctx, options));\n return { kind: \"completed\", ...(outcome ? { outcome } : {}) };\n }\n case \"sync\": {\n const operations = await loaders.operations();\n throwIfAborted(options.signal);\n await withLock(\"sync\", () => operations.syncBoth(ctx, options));\n return { kind: \"completed\" };\n }\n case \"history\": {\n const operations = await loaders.operations();\n throwIfAborted(options.signal);\n await operations.history(ctx, options);\n return { kind: \"completed\" };\n }\n case \"rollback\": {\n const operations = await loaders.operations();\n throwIfAborted(options.signal);\n await withLock(\"rollback\", () => operations.rollback(ctx, options));\n return { kind: \"completed\" };\n }\n case \"migrate-state\":\n await migrateStateDirectory(ctx, options);\n return { kind: \"completed\" };\n case \"unlock\":\n await unlock(ctx, options);\n return { kind: \"completed\" };\n default:\n ctx.ui.notify(`Unknown /sync command: ${subcommand}\\n\\n${usage()}`, \"warning\");\n return { kind: \"failed\" };\n }\n } catch (error) {\n if (signal?.aborted) return { kind: \"failed\" };\n setSyncStatus(ctx, undefined);\n if (error instanceof SetupPullRequiresUiError) throw error;\n if (error instanceof RemoteSelectionMismatchError) {\n return { kind: \"remote-selection-required\", decision: error.decision };\n }\n if (isSyncDecisionRequiredError(error)) {\n return { kind: \"decision-required\", decision: error.decision };\n }\n ctx.ui.notify(syncErrorGuidance(error), \"error\");\n return { kind: \"failed\" };\n }\n}\n\nasync function migrateStateDirectory(ctx: ExtensionCommandContext, options: CommandOptions) {\n const notice = stateDirectoryMigrationNotice();\n if (!notice) {\n ctx.ui.notify(\"pi-sync already uses the canonical pi-sync/ state directory.\", \"info\");\n return;\n }\n if (\n !options.yes &&\n !(await ctx.ui.confirm(\n \"Migrate pi-sync state directory\",\n \"Confirm that every other Pi process is closed. pi-sync will atomically rename .pisync/ to pi-sync/ without merging or deleting either root.\",\n { signal: options.signal },\n ))\n ) {\n ctx.ui.notify(\"pi-sync state migration cancelled.\", \"info\");\n return;\n }\n throwIfAborted(options.signal);\n const result = await migrateLegacyStateDirectory();\n throwIfAborted(options.signal);\n if (result.status === \"ready\") {\n ctx.ui.notify(\"pi-sync already uses the canonical pi-sync/ state directory.\", \"info\");\n return;\n }\n ctx.ui.notify(result.message, result.status === \"migrated\" ? \"info\" : \"warning\");\n}\n\nasync function initConfig(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n const configPath = localConfigPath();\n if (await readLocalConfigObject()) {\n ctx.ui.notify(`Config already exists: ${await activeLocalConfigPath()}`, \"info\");\n return;\n }\n\n if (ctx.mode === \"tui\") {\n const { showSetupWizard } = await import(\"../ui/setup/setup-wizard.js\");\n throwIfAborted(signal);\n await showSetupWizard(ctx, signal);\n return;\n }\n await createLocalConfigDocument(localConfigTemplate());\n ctx.ui.notify(`Created ${configPath}. Add a storage connection and sync setup before syncing.`, \"info\");\n}\n\nasync function showConfig(ctx: ExtensionCommandContext, options: CommandOptions) {\n const config = await loadConfig(options.setup);\n const warnings = [\n ...(config.backend.type === \"s3\" ? sessionTokenWarnings(config.backend.profile) : []),\n ...syncSessionsWarnings(config),\n ];\n const storageLines = configStorageLines(config);\n ctx.ui.notify(\n [\n \"pi-sync config:\",\n `sync setup: ${config.setupName}`,\n `storage connection: ${config.connectionName}`,\n ...storageLines,\n `storage path: ${config.storagePath}`,\n `automatic sync: ${automaticSyncSummary(config.automatic)}`,\n `included content: ${config.include.join(\", \") || \"none\"}`,\n `sessions: ${config.include.includes(\"sessions\") ? \"included\" : \"not included\"}`,\n `settings file: ${localConfigPath()}`,\n ...warnings,\n ].join(\"\\n\"),\n warnings.length > 0 ? \"warning\" : \"info\",\n );\n}\n\nfunction configStorageLines(config: AnySyncConfig) {\n switch (config.backend.type) {\n case \"git\":\n return [\n \"kind: git\",\n `remote: ${displayGitRemote(config.backend.profile.remote)}`,\n \"authentication: existing Git/SSH credentials (not stored)\",\n `branch: ${config.backend.destination.branch}`,\n ];\n case \"webdav\":\n return [\n \"kind: webdav\",\n `url: ${displayWebDavUrl(config.backend.profile.url, config.backend.profile.username)}`,\n \"username: configured (value hidden)\",\n \"password: configured\",\n ];\n case \"s3\":\n return [\n \"kind: s3\",\n `endpoint: ${config.backend.profile.endpoint}`,\n `bucket: ${config.backend.destination.bucket}`,\n `region: ${config.backend.profile.region}`,\n \"access key id: configured\",\n \"secret access key: configured\",\n `session token: ${config.backend.profile.sessionToken ? \"configured\" : \"not configured\"}`,\n ];\n }\n}\n\nfunction displayGitRemote(value: string | undefined) {\n if (!value) return \"missing\";\n try {\n const url = new URL(value);\n url.username = \"\";\n url.password = \"\";\n url.search = \"\";\n url.hash = \"\";\n return url.toString();\n } catch {\n return value.replace(/^(?:[^@\\s]+@)?(?<host>[^:]+):.+$/u, \"$<host>:\u2026\");\n }\n}\n\nfunction displayWebDavUrl(value: string | undefined, username: string | undefined) {\n if (!value) return \"missing\";\n try {\n const url = new URL(value);\n url.username = \"\";\n url.password = \"\";\n url.search = \"\";\n url.hash = \"\";\n return username ? `${url.origin}/\u2026` : `${url.origin}${url.pathname}`;\n } catch {\n return \"invalid (value hidden)\";\n }\n}\n", "import type { ExtensionCommandContext, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { loadConfig } from \"../settings/config.js\";\nimport { readStateForConfig, syncStateFingerprint } from \"../state/sync-state-store.js\";\nimport { combineSignals } from \"../sync/signals.js\";\nimport { errorMessage } from \"../sync/sync-errors.js\";\nimport type { SyncLoaders } from \"../sync/sync-loaders.js\";\nimport { formatRemoteSelectionMismatch } from \"../sync/sync-policy.js\";\nimport type { RunRouteResult } from \"../ui/cancellable-operation.js\";\nimport {\n observationMatchesConfig,\n type SyncAttentionController,\n type SyncAttentionOrigin,\n syncAttentionMatchesConfig,\n} from \"../ui/sync-attention.js\";\nimport { setSyncStatus } from \"../ui/sync-status.js\";\nimport { parseOptions, splitArgs } from \"./command.js\";\nimport { executeCommand, executeRecoveryCommand } from \"./command-execution.js\";\n\nexport async function handleCommand(\n rawArgs: string,\n ctx: ExtensionCommandContext,\n sessionSignal: AbortSignal,\n loaders: SyncLoaders,\n attention: SyncAttentionController,\n) {\n await reconcileObservation(attention, sessionSignal);\n if (sessionSignal.aborted) return;\n const run = (route: string, signal?: AbortSignal, onCommit?: () => void, target?: string) =>\n executeCommand(\n route,\n ctx,\n combineSignals(sessionSignal, signal),\n loaders,\n observationCommitCallback(attention, sessionSignal, onCommit),\n target,\n );\n if (!rawArgs.trim()) {\n try {\n const { showSyncManager } = await import(\"../ui/manager-ui.js\");\n if (sessionSignal.aborted) return;\n await showSyncManager(ctx, run, sessionSignal, {\n getAttention: () => attention.current(),\n getObservation: () => attention.observation(),\n onObservationInvalidated: () => attention.clearObservation(),\n onSelectionResolved: (expected) => {\n if (attention.current() === expected) attention.clear(ctx);\n },\n });\n } catch (error) {\n if (sessionSignal.aborted) return;\n setSyncStatus(ctx, undefined);\n ctx.ui.notify(errorMessage(error), \"error\");\n }\n await reconcileObservation(attention, sessionSignal);\n if (!sessionSignal.aborted) await attention.publish(ctx, sessionSignal);\n return;\n }\n const result = await run(rawArgs);\n if (result.kind === \"decision-required\") {\n ctx.ui.notify(result.decision.directMessage, \"error\");\n } else if (result.kind === \"remote-selection-required\") {\n const origin = directSelectionOrigin(rawArgs);\n if (origin) attention.set(result.decision, origin);\n const deterministic = splitArgs(rawArgs).some((arg) => arg === \"--yes\" || arg === \"-y\");\n if (origin && ctx.mode === \"tui\" && !deterministic) {\n await resolveSelectionAttention(ctx, attention, sessionSignal, loaders);\n } else {\n ctx.ui.notify(\n formatRemoteSelectionMismatch(\n result.decision.setupName,\n result.decision.localInclude,\n result.decision.remoteInclude,\n ),\n \"error\",\n );\n }\n }\n await clearAttentionAfterCompletedOperation(rawArgs, result, ctx, attention, sessionSignal);\n await reconcileSelectionAttention(ctx, attention, sessionSignal);\n await reconcileObservation(attention, sessionSignal);\n if (!sessionSignal.aborted) await attention.publish(ctx, sessionSignal);\n}\n\nfunction observationCommitCallback(\n attention: SyncAttentionController,\n sessionSignal: AbortSignal,\n onCommit?: () => void,\n) {\n const observed = attention.observation();\n return () => {\n // Opening or cancelling a review changes nothing. A commit may change data\n // even if later publication/baseline cleanup fails; never restore old hints.\n if (!sessionSignal.aborted && attention.observation() === observed) attention.clearObservation();\n onCommit?.();\n };\n}\n\nasync function reconcileObservation(attention: SyncAttentionController, signal: AbortSignal) {\n const observed = attention.observation();\n if (!observed || signal.aborted) return;\n try {\n const config = await loadConfig();\n if (signal.aborted || attention.observation() !== observed) return;\n if (!observationMatchesConfig(observed, config)) {\n attention.clearObservation();\n return;\n }\n const state = await readStateForConfig(config);\n if (signal.aborted || attention.observation() !== observed) return;\n if (syncStateFingerprint(state) !== observed.inspection.stateIdentity) attention.clearObservation();\n } catch {\n if (!signal.aborted && attention.observation() === observed) attention.clearObservation();\n }\n}\n\nasync function clearAttentionAfterCompletedOperation(\n rawArgs: string,\n result: RunRouteResult,\n ctx: ExtensionContext,\n attention: SyncAttentionController,\n signal: AbortSignal,\n) {\n if (result.kind !== \"completed\" || result.outcome === \"cancelled\" || signal.aborted) return;\n const [command, ...rest] = splitArgs(rawArgs);\n if (command !== \"sync\" && command !== \"pull\" && command !== \"push\") return;\n const current = attention.current();\n if (!current) return;\n try {\n const options = parseOptions(rest);\n const setupName = options.setup ?? (await loadConfig()).setupName;\n if (signal.aborted || attention.current() !== current) return;\n if (current.decision.setupName === setupName) attention.clear(ctx);\n } catch {\n // Attention reconciliation below owns malformed or concurrently changed settings.\n }\n}\n\nasync function reconcileSelectionAttention(\n ctx: ExtensionContext,\n attention: SyncAttentionController,\n signal: AbortSignal,\n) {\n const current = attention.current();\n if (!current || signal.aborted) return;\n try {\n const config = await loadConfig(current.decision.setupName);\n if (signal.aborted || attention.current() !== current) return;\n if (!syncAttentionMatchesConfig(current, config)) attention.clear(ctx);\n } catch {\n if (!signal.aborted && attention.current() === current) attention.clear(ctx);\n }\n}\n\nfunction directSelectionOrigin(rawArgs: string): SyncAttentionOrigin | undefined {\n const command = splitArgs(rawArgs)[0];\n return command === \"sync\" || command === \"pull\" || command === \"push\" ? command : undefined;\n}\n\nexport async function resolveSelectionAttention(\n ctx: ExtensionContext,\n attention: SyncAttentionController,\n signal: AbortSignal,\n loaders: SyncLoaders,\n options: {\n cancelLabel?: string;\n withStateAccess?: <T>(task: () => Promise<T>) => Promise<T>;\n } = {},\n) {\n const current = attention.current();\n if (!current || signal.aborted) return;\n const { dispatchManagerResult } = await import(\"../ui/manager-result-dispatcher.js\");\n if (signal.aborted || attention.current() !== current) return;\n await dispatchManagerResult(\n ctx,\n { kind: \"remote-selection-required\", decision: current.decision },\n current.origin,\n (route, actionSignal, onCommit, target) => {\n const execute = () =>\n executeRecoveryCommand(\n route,\n ctx,\n combineSignals(signal, actionSignal),\n loaders,\n observationCommitCallback(attention, signal, onCommit),\n target,\n );\n return options.withStateAccess ? options.withStateAccess(execute) : execute();\n },\n signal,\n {\n cancelLabel: options.cancelLabel,\n withStateAccess: options.withStateAccess,\n onSelectionResolved: () => {\n if (attention.current() === current) attention.clear(ctx);\n },\n },\n );\n}\n", "export function isMissingConfigError(error: unknown) {\n return (\n error instanceof Error &&\n (error.message.startsWith(\"Missing pi-sync settings.\") || error.message === \"No sync setups are configured.\")\n );\n}\n", "import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { setSyncSetupCompletions } from \"../commands/command.js\";\nimport type { CommandOptions } from \"../commands/command-types.js\";\nimport { loadConfig, loadPartialConfig } from \"../settings/config.js\";\nimport { isMissingConfigError } from \"../settings/config-errors.js\";\nimport { consumeLocalConfigMigrationNotice } from \"../settings/config-file.js\";\nimport { readLocalConfigObject } from \"../settings/settings-store.js\";\nimport { snapshotOptionsForContext } from \"../snapshot/session-paths.js\";\nimport { recoverSnapshotTransactionsOnStartup } from \"../snapshot/snapshot-transaction.js\";\nimport { withLock } from \"../state/lock.js\";\nimport { stateDirectoryMigrationNotice } from \"../state/state-directory.js\";\nimport { ensureStateDir, readStateForConfig } from \"../state/sync-state-store.js\";\nimport { configureSyncStatus, setSyncStatus } from \"../ui/sync-status.js\";\nimport { safeTerminalText } from \"../ui/terminal-text.js\";\nimport { throwIfAborted } from \"./signals.js\";\nimport { errorMessage } from \"./sync-errors.js\";\nimport type { SyncLoaders } from \"./sync-loaders.js\";\n\nconst AUTO_SYNC_OPTIONS: CommandOptions = {\n yes: true,\n force: false,\n stale: false,\n silent: true,\n reload: false,\n auto: true,\n args: [],\n};\n\nexport async function startSession(ctx: ExtensionContext, signal: AbortSignal) {\n throwIfAborted(signal);\n const stateNotice = stateDirectoryMigrationNotice();\n if (stateNotice && ctx.hasUI) ctx.ui.notify(stateNotice, \"warning\");\n // Recovery can restore managed files: finish it before Pi accepts user edits.\n // Unlike remote inspection, it must never be detached behind startup.\n await recoverSnapshotTransactionsOnStartup();\n throwIfAborted(signal);\n try {\n const settings = await readLocalConfigObject();\n throwIfAborted(signal);\n const names = settings ? Object.keys(settings.syncSetups).sort((left, right) => left.localeCompare(right)) : [];\n setSyncSetupCompletions(names);\n configureSyncStatus(ctx, settings?.showStatus ?? true);\n } catch {\n if (signal.aborted) return;\n setSyncSetupCompletions([]);\n }\n const migrationNotice = consumeLocalConfigMigrationNotice();\n if (migrationNotice && ctx.hasUI) ctx.ui.notify(migrationNotice, \"warning\");\n throwIfAborted(signal);\n if (!ctx.hasUI) return;\n try {\n const config = await loadConfig();\n throwIfAborted(signal);\n configureSyncStatus(ctx, config.showStatus);\n return config.automatic ? config : undefined;\n } catch (error) {\n throwIfAborted(signal);\n if (!isMissingConfigError(error)) {\n ctx.ui.notify(`pi-sync startup check skipped: ${safeTerminalText(errorMessage(error))}`, \"warning\");\n }\n }\n}\n\nexport async function autoPushSessions(ctx: ExtensionContext, signal: AbortSignal, loaders: SyncLoaders) {\n try {\n const partial = await loadPartialConfig();\n throwIfAborted(signal);\n if (!partial.automatic) return;\n if (!partial.include.includes(\"sessions\")) return;\n await ensureStateDir();\n throwIfAborted(signal);\n const config = await loadConfig();\n throwIfAborted(signal);\n if (!config.include.includes(\"sessions\")) return;\n const [operations, snapshotModule, syncStateModule] = await Promise.all([\n loaders.operations(),\n loaders.snapshot(),\n loaders.syncState(),\n ]);\n throwIfAborted(signal);\n await withLock(\"auto-session-push\", async () => {\n throwIfAborted(signal);\n const state = await readStateForConfig(config);\n throwIfAborted(signal);\n const local = await snapshotModule.createSnapshot(config.snapshotIdentity, {\n ...snapshotOptionsForContext(ctx, config),\n signal,\n });\n throwIfAborted(signal);\n if (!syncStateModule.hasLocalChanges(local, state, config)) return;\n await operations.push(ctx, { ...AUTO_SYNC_OPTIONS, signal }, { config, state, local });\n });\n } catch (error) {\n if (signal.aborted || isMissingConfigError(error)) return;\n setSyncStatus(ctx, undefined);\n ctx.ui.notify(`pi-sync session push skipped: ${errorMessage(error)}`, \"warning\");\n }\n}\n", "import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { loadConfigForCheck, syncCheckConfigFingerprint } from \"../settings/config.js\";\nimport { isMissingConfigError } from \"../settings/config-errors.js\";\nimport type { AnySyncConfig } from \"../settings/settings-types.js\";\nimport { snapshotOptionsForContext } from \"../snapshot/session-paths.js\";\nimport { withLock } from \"../state/lock.js\";\nimport { withStateDirectoryAccess } from \"../state/state-directory.js\";\nimport { readStateForConfig, syncStateFingerprint } from \"../state/sync-state-store.js\";\nimport type { SyncAttentionController } from \"../ui/sync-attention.js\";\nimport { setSyncStatus } from \"../ui/sync-status.js\";\nimport { safeTerminalText } from \"../ui/terminal-text.js\";\nimport { combineSignals, throwIfAborted } from \"./signals.js\";\nimport { errorMessage } from \"./sync-errors.js\";\nimport type { SyncLoaders } from \"./sync-loaders.js\";\n\n/** One owned task per extension session, never keyed by the shared headless UI. */\nexport function createStartupCheck(loaders: SyncLoaders, attention: SyncAttentionController, timeoutMs = 30_000) {\n let active:\n | {\n controller: AbortController;\n promise: Promise<void>;\n owner: ExtensionContext[\"sessionManager\"];\n }\n | undefined;\n\n return {\n start(ctx: ExtensionContext, sessionSignal: AbortSignal, initialConfig?: AnySyncConfig) {\n if (!ctx.hasUI || sessionSignal.aborted) return;\n if (active) throw new Error(\"Previous startup check has not been drained.\");\n const controller = new AbortController();\n const signal = combineSignals(sessionSignal, controller.signal);\n const task = { controller, owner: ctx.sessionManager, promise: Promise.resolve() };\n active = task;\n const isCurrent = () => !sessionSignal.aborted && active === task && task.owner === ctx.sessionManager;\n const timer = setTimeout(\n () => controller.abort(new DOMException(\"Startup check timed out\", \"TimeoutError\")),\n timeoutMs,\n );\n let config: AnySyncConfig | undefined;\n let checking = false;\n // Handle every detached rejection here; Pi's awaited event runner cannot catch it.\n task.promise = Promise.resolve()\n .then(async () => {\n try {\n throwIfAborted(signal);\n config = initialConfig ?? (await loadConfigForCheck());\n throwIfAborted(signal);\n if (!config.automatic) return;\n const captured = config;\n const identity = syncCheckConfigFingerprint(captured);\n checking = true;\n setSyncStatus(ctx, \"sync ...\");\n const { inspectSync } = await loaders.inspection();\n throwIfAborted(signal);\n const currentConfig = await loadConfigForCheck();\n throwIfAborted(signal);\n if (syncCheckConfigFingerprint(currentConfig) !== identity) return;\n // Lock order: state migration guard \u2192 sync operation \u2192 backend cache.\n // Read heads may write only private cache data. Never call doctor/syncBoth.\n const inspection = await withStateDirectoryAccess(() => {\n throwIfAborted(signal);\n return withLock(\"startup-check\", () => {\n throwIfAborted(signal);\n return inspectSync(captured, snapshotOptionsForContext(ctx, captured), signal);\n });\n });\n throwIfAborted(signal);\n const latest = await loadConfigForCheck();\n throwIfAborted(signal);\n if (syncCheckConfigFingerprint(latest) !== identity) return;\n const state = await withStateDirectoryAccess(() => readStateForConfig(latest));\n throwIfAborted(signal);\n if (syncStateFingerprint(state) !== inspection.stateIdentity || !isCurrent()) return;\n attention.observe({\n setupName: captured.setupName,\n configIdentity: identity,\n checkedAt: new Date().toISOString(),\n inspection,\n });\n if (ctx.mode === \"rpc\") attention.notifyObservation(ctx);\n } catch (error) {\n if (!isCurrent() || sessionSignal.aborted || isMissingConfigError(error)) return;\n if (signal.aborted && controller.signal.reason?.name !== \"TimeoutError\") return;\n // A settings edit invalidates failures as well as successful observations.\n if (config) {\n const latest = await loadConfigForCheck().catch(() => undefined);\n if (!isCurrent() || (signal.aborted && controller.signal.reason?.name !== \"TimeoutError\")) return;\n if (!latest || syncCheckConfigFingerprint(latest) !== syncCheckConfigFingerprint(config)) return;\n }\n ctx.ui.notify(\n `pi-sync startup check skipped: ${safeTerminalText(errorMessage(error))}. Run /sync status to retry. No startup transfer was performed.`,\n \"warning\",\n );\n } finally {\n clearTimeout(timer);\n if (isCurrent() && checking) await attention.publish(ctx, sessionSignal);\n if (active === task) active = undefined;\n }\n })\n .catch(() => {\n // UI teardown can itself throw. No unhandled rejection or retained timer.\n clearTimeout(timer);\n if (active === task) active = undefined;\n });\n },\n async stop() {\n const task = active;\n if (!task) return;\n task.controller.abort(new DOMException(\"Startup check cancelled\", \"AbortError\"));\n // Drain the actual work, including child/ref cleanup, before foreground guards.\n await task.promise;\n },\n };\n}\n", "type SetupSwitchModule = Pick<typeof import(\"./setup-switch.js\"), \"useSyncSetup\">;\ntype SnapshotModule = Pick<typeof import(\"../snapshot/snapshot.js\"), \"createSnapshot\">;\ntype SyncStateModule = Pick<typeof import(\"./sync-state.js\"), \"hasLocalChanges\">;\ntype SyncOperations = typeof import(\"./sync-operations.js\");\n\ntype SyncInspectionModule = Pick<typeof import(\"./sync-inspection.js\"), \"inspectSync\">;\n\nexport interface SyncDependencies {\n loadSyncInspection(): Promise<SyncInspectionModule>;\n loadSetupSwitch(): Promise<SetupSwitchModule>;\n loadSnapshot(): Promise<SnapshotModule>;\n loadSyncState(): Promise<SyncStateModule>;\n loadSyncOperations(): Promise<SyncOperations>;\n}\n\nexport interface SyncLoaders {\n inspection(): Promise<SyncInspectionModule>;\n setupSwitch(): Promise<SetupSwitchModule>;\n snapshot(): Promise<SnapshotModule>;\n syncState(): Promise<SyncStateModule>;\n operations(): Promise<SyncOperations>;\n}\n\nexport function createSyncLoaders(dependencies: Partial<SyncDependencies>): SyncLoaders {\n const loaders: SyncLoaders = {\n inspection: cachedModuleLoader(dependencies.loadSyncInspection ?? (() => import(\"./sync-inspection.js\"))),\n setupSwitch: cachedModuleLoader(dependencies.loadSetupSwitch ?? (() => import(\"./setup-switch.js\"))),\n snapshot: cachedModuleLoader(dependencies.loadSnapshot ?? (() => import(\"../snapshot/snapshot.js\"))),\n syncState: cachedModuleLoader(dependencies.loadSyncState ?? (() => import(\"./sync-state.js\"))),\n operations: cachedModuleLoader(dependencies.loadSyncOperations ?? (() => import(\"./sync-operations.js\"))),\n };\n return loaders;\n}\n\nfunction cachedModuleLoader<Module>(load: () => Promise<Module>): () => Promise<Module> {\n let pending: Promise<Module> | undefined;\n return () => {\n if (!pending) {\n pending = load().catch((error) => {\n pending = undefined;\n throw error;\n });\n }\n return pending;\n };\n}\n", "import type { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport { completeSyncArguments, splitArgs } from \"./commands/command.js\";\nimport { handleCommand } from \"./commands/command-handler.js\";\nimport type { AnySyncConfig } from \"./settings/settings-types.js\";\nimport { withStateDirectoryAccess } from \"./state/state-directory.js\";\nimport { autoPushSessions, startSession } from \"./sync/automatic-sync.js\";\nimport { combineSignals } from \"./sync/signals.js\";\nimport { createStartupCheck } from \"./sync/startup-check.js\";\nimport { errorMessage } from \"./sync/sync-errors.js\";\nimport { createSyncLoaders, type SyncDependencies } from \"./sync/sync-loaders.js\";\nimport { createSyncAttentionController } from \"./ui/sync-attention.js\";\nimport { setSyncStatus } from \"./ui/sync-status.js\";\nimport { safeTerminalText } from \"./ui/terminal-text.js\";\n\nexport default function sync(pi: ExtensionAPI, dependencies: Partial<SyncDependencies> = {}) {\n const loaders = createSyncLoaders(dependencies);\n const attention = createSyncAttentionController();\n const check = createStartupCheck(loaders, attention);\n let sessionAbort = new AbortController();\n let shutdownAbort: AbortController | undefined;\n let initialization = Promise.resolve<AnySyncConfig | false | undefined>(undefined);\n\n pi.registerCommand(\"sync\", {\n description: \"Sync Pi settings through Git, WebDAV, R2, or S3-compatible storage\",\n getArgumentCompletions: completeSyncArguments,\n handler: async (args, ctx) => {\n if (!ctx.hasUI) {\n throw new Error(\"/sync requires TUI or RPC mode so results and safety prompts are observable.\");\n }\n const signal = sessionAbort.signal;\n const ready = await initialization;\n if (signal.aborted) return;\n await check.stop();\n if (signal.aborted) return;\n const command = splitArgs(args)[0];\n if (ready === false && command !== \"help\" && command !== \"unlock\" && command !== \"migrate-state\") {\n ctx.ui.notify(\n \"pi-sync recovery required. Repair the startup error, then /reload before syncing. Use /sync help for recovery guidance.\",\n \"error\",\n );\n return;\n }\n const run = () => handleCommand(args, ctx, signal, loaders, attention);\n // Drain background cache/child cleanup before entering any foreground guard.\n // Help must remain reachable when the state roots themselves need repair.\n if (command === \"migrate-state\" || command === \"help\") await run();\n else await withStateDirectoryAccess(run);\n },\n });\n\n pi.on(\"session_start\", async (_event, ctx) => {\n shutdownAbort?.abort(new DOMException(\"Session replaced\", \"AbortError\"));\n shutdownAbort = undefined;\n sessionAbort.abort(new DOMException(\"Session replaced\", \"AbortError\"));\n sessionAbort = new AbortController();\n const signal = sessionAbort.signal;\n attention.reset(ctx);\n const previous = initialization;\n initialization = (async () => {\n await previous;\n if (signal.aborted) return false;\n await check.stop();\n if (signal.aborted) return false;\n try {\n const config = await withStateDirectoryAccess(() => startSession(ctx, signal));\n return signal.aborted ? false : config;\n } catch (error) {\n if (!signal.aborted && ctx.hasUI) {\n ctx.ui.notify(`pi-sync recovery required: ${safeTerminalText(errorMessage(error))}`, \"error\");\n }\n return false;\n }\n })();\n const ready = await initialization;\n if (ready && !signal.aborted) check.start(ctx, signal, ready);\n });\n\n pi.on(\"session_shutdown\", async (event, ctx) => {\n sessionAbort.abort(new DOMException(\"Session shut down\", \"AbortError\"));\n attention.reset(ctx);\n shutdownAbort?.abort(new DOMException(\"Session shut down again\", \"AbortError\"));\n const controller = new AbortController();\n shutdownAbort = controller;\n const signal = combineSignals(controller.signal, AbortSignal.timeout(30_000));\n const reason = typeof event === \"object\" && event ? (event as { reason?: string }).reason : undefined;\n try {\n const ready = await initialization;\n if (signal.aborted) return;\n await check.stop();\n if (signal.aborted) return;\n if (ready !== false && reason !== \"reload\") {\n await withStateDirectoryAccess(async () => {\n if (signal.aborted) return;\n await autoPushSessions(ctx, signal, loaders);\n });\n }\n } catch (error) {\n if (!signal.aborted) {\n ctx.ui.notify(`pi-sync session push skipped: ${errorMessage(error)}`, \"warning\");\n }\n } finally {\n if (shutdownAbort === controller) shutdownAbort = undefined;\n }\n if (signal.aborted) return;\n setSyncStatus(ctx, undefined);\n });\n}\n\nexport type { SyncDependencies } from \"./sync/sync-loaders.js\";\n"],
5
+ "mappings": "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",
6
+ "names": []
7
7
  }