@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.
- package/README.md +4 -1
- package/dist/chunks/{chunk-6LP3MCR2.ts → chunk-2JZFHNLM.ts} +3 -5
- package/dist/chunks/chunk-2JZFHNLM.ts.map +7 -0
- package/dist/chunks/{chunk-LCRI3ABW.ts → chunk-2RZSQWBH.ts} +8 -19
- package/dist/chunks/chunk-2RZSQWBH.ts.map +7 -0
- package/dist/chunks/{chunk-IJ6FJFA5.ts → chunk-4AIHXRKE.ts} +11 -17
- package/dist/chunks/chunk-4AIHXRKE.ts.map +7 -0
- package/dist/chunks/{chunk-C7XY5NF5.ts → chunk-4MPIH46N.ts} +29 -51
- package/dist/chunks/chunk-4MPIH46N.ts.map +7 -0
- package/dist/chunks/{chunk-5B3FXBLE.ts → chunk-6546TS54.ts} +16 -20
- package/dist/chunks/chunk-6546TS54.ts.map +7 -0
- package/dist/chunks/{chunk-Q2TUM5X6.ts → chunk-6NT3YFGY.ts} +2 -2
- package/dist/chunks/chunk-6NT3YFGY.ts.map +7 -0
- package/dist/chunks/{chunk-2B2ELUF5.ts → chunk-7D5SF7P3.ts} +1 -1
- package/dist/chunks/chunk-7D5SF7P3.ts.map +7 -0
- package/dist/chunks/{chunk-YDWUZVPN.ts → chunk-7KHKWL3Q.ts} +28 -47
- package/dist/chunks/chunk-7KHKWL3Q.ts.map +7 -0
- package/dist/chunks/{chunk-ZI5MXMEX.ts → chunk-BVVP33U5.ts} +2 -4
- package/dist/chunks/chunk-BVVP33U5.ts.map +7 -0
- package/dist/chunks/{chunk-SZWBGPID.ts → chunk-DM4X4FIA.ts} +8 -13
- package/dist/chunks/chunk-DM4X4FIA.ts.map +7 -0
- package/dist/chunks/{chunk-SL64RLXR.ts → chunk-DZUSTGQV.ts} +8 -16
- package/dist/chunks/chunk-DZUSTGQV.ts.map +7 -0
- package/dist/chunks/{chunk-YHEMENKV.ts → chunk-E42GXD6D.ts} +13 -19
- package/dist/chunks/chunk-E42GXD6D.ts.map +7 -0
- package/dist/chunks/{chunk-Z4DQF6L3.ts → chunk-ECYCNZOE.ts} +1 -1
- package/dist/chunks/chunk-ECYCNZOE.ts.map +7 -0
- package/dist/chunks/{chunk-OEX4ABY6.ts → chunk-EEJPYTWE.ts} +11 -21
- package/dist/chunks/chunk-EEJPYTWE.ts.map +7 -0
- package/dist/chunks/{chunk-CPEHGXJV.ts → chunk-G4RUXRWZ.ts} +3 -5
- package/dist/chunks/chunk-G4RUXRWZ.ts.map +7 -0
- package/dist/chunks/{chunk-T2B5IU74.ts → chunk-HGJH56KR.ts} +4 -4
- package/dist/chunks/chunk-HGJH56KR.ts.map +7 -0
- package/dist/chunks/{chunk-JAAKLL6M.ts → chunk-IVXEDPAD.ts} +10 -34
- package/dist/chunks/chunk-IVXEDPAD.ts.map +7 -0
- package/dist/chunks/chunk-K3RIEL6J.ts +20 -0
- package/dist/chunks/chunk-K3RIEL6J.ts.map +7 -0
- package/dist/chunks/{chunk-LTBWGSBV.ts → chunk-MSSW6F3R.ts} +1 -1
- package/dist/chunks/chunk-MSSW6F3R.ts.map +7 -0
- package/dist/chunks/{chunk-T3HH3UEJ.ts → chunk-OVDTF5CH.ts} +4 -10
- package/dist/chunks/chunk-OVDTF5CH.ts.map +7 -0
- package/dist/chunks/{chunk-NJFUIVYL.ts → chunk-PWMWOJP4.ts} +1 -1
- package/dist/chunks/chunk-PWMWOJP4.ts.map +7 -0
- package/dist/chunks/{chunk-HUDQATCL.ts → chunk-Q32CQWPM.ts} +6 -8
- package/dist/chunks/chunk-Q32CQWPM.ts.map +7 -0
- package/dist/chunks/{chunk-ETTRJDNP.ts → chunk-QLSN7AGX.ts} +6 -13
- package/dist/chunks/chunk-QLSN7AGX.ts.map +7 -0
- package/dist/chunks/{chunk-THMF4BVL.ts → chunk-SWUXA3MH.ts} +1 -1
- package/dist/chunks/chunk-SWUXA3MH.ts.map +7 -0
- package/dist/chunks/{chunk-TEN2ZBJV.ts → chunk-T2SJD3N7.ts} +2 -4
- package/dist/chunks/chunk-T2SJD3N7.ts.map +7 -0
- package/dist/chunks/{chunk-AUSDLD6F.ts → chunk-T56RNRZJ.ts} +10 -26
- package/dist/chunks/chunk-T56RNRZJ.ts.map +7 -0
- package/dist/chunks/{chunk-DHVFS4QK.ts → chunk-UA7RXOIT.ts} +37 -90
- package/dist/chunks/chunk-UA7RXOIT.ts.map +7 -0
- package/dist/chunks/{chunk-D5X27LCA.ts → chunk-UETBKTDI.ts} +1 -1
- package/dist/chunks/chunk-UETBKTDI.ts.map +7 -0
- package/dist/chunks/{chunk-CHH26D4F.ts → chunk-YFADF5ZQ.ts} +7 -6
- package/dist/chunks/chunk-YFADF5ZQ.ts.map +7 -0
- package/dist/chunks/{chunk-CCSN3F47.ts → chunk-YPXGU5OR.ts} +4 -4
- package/dist/chunks/chunk-YPXGU5OR.ts.map +7 -0
- package/dist/chunks/{file-selection-FTTKAOYX.ts → file-selection-RAVHRYFG.ts} +14 -26
- package/dist/chunks/file-selection-RAVHRYFG.ts.map +7 -0
- package/dist/chunks/{git-backend-GMVS4PD4.ts → git-backend-IAANDL3K.ts} +41 -104
- package/dist/chunks/git-backend-IAANDL3K.ts.map +7 -0
- package/dist/chunks/manager-result-dispatcher-OTUMQM26.ts +23 -0
- package/dist/chunks/{manager-ui-IPAOAWZA.ts → manager-ui-763NEKJY.ts} +124 -251
- package/dist/chunks/manager-ui-763NEKJY.ts.map +7 -0
- package/dist/chunks/remote-selection-ui-TZTJF32Y.ts +22 -0
- package/dist/chunks/{s3-backend-66O4FGBH.ts → s3-backend-XGXUOPUN.ts} +23 -54
- package/dist/chunks/s3-backend-XGXUOPUN.ts.map +7 -0
- package/dist/chunks/{setup-switch-IS2PEZ3J.ts → setup-switch-5G2VNJHL.ts} +9 -9
- package/dist/chunks/{setup-wizard-JUJZYNNM.ts → setup-wizard-YIEWGX32.ts} +12 -12
- package/dist/chunks/setup-wizard-YIEWGX32.ts.map +7 -0
- package/dist/chunks/{snapshot-HKEWCVK6.ts → snapshot-JL5DFSXI.ts} +5 -5
- package/dist/chunks/sync-inspection-P3ENJLNF.ts +20 -0
- package/dist/chunks/{sync-operations-LBX3GKCM.ts → sync-operations-AR76EB6C.ts} +85 -201
- package/dist/chunks/sync-operations-AR76EB6C.ts.map +7 -0
- package/dist/chunks/{sync-state-Q2FTXTW6.ts → sync-state-VHJUZ4YG.ts} +6 -6
- package/dist/chunks/{webdav-backend-ECIKD7SO.ts → webdav-backend-3EGUONAT.ts} +20 -51
- package/dist/chunks/webdav-backend-3EGUONAT.ts.map +7 -0
- package/dist/index.ts +49 -74
- package/dist/index.ts.map +3 -3
- package/docs/settings.md +9 -0
- package/package.json +61 -62
- package/src/backends/backend-factory.ts +15 -15
- package/src/backends/backend-identity.ts +31 -31
- package/src/backends/backend-types.ts +42 -42
- package/src/backends/git/git-backend.ts +714 -788
- package/src/backends/git/git-config.ts +104 -111
- package/src/backends/git/git-runner.ts +230 -247
- package/src/backends/git/git-storage.ts +228 -245
- package/src/backends/s3/s3-backend.ts +408 -441
- package/src/backends/s3/s3-client.ts +288 -333
- package/src/backends/sync-backend.ts +65 -65
- package/src/backends/webdav/webdav-backend.ts +542 -589
- package/src/backends/webdav/webdav-client.ts +292 -316
- package/src/backends/webdav/webdav-config.ts +57 -68
- package/src/commands/command-execution.ts +270 -289
- package/src/commands/command-handler.ts +160 -163
- package/src/commands/command-types.ts +13 -13
- package/src/commands/command.ts +190 -196
- package/src/commands/setup-completions.ts +1 -1
- package/src/paths.ts +47 -47
- package/src/settings/config-errors.ts +4 -5
- package/src/settings/config-file.ts +473 -506
- package/src/settings/config.ts +171 -174
- package/src/settings/settings-management.ts +191 -216
- package/src/settings/settings-store.ts +63 -77
- package/src/settings/settings-types.ts +78 -75
- package/src/settings/settings-validation.ts +328 -364
- package/src/snapshot/session-paths.ts +41 -55
- package/src/snapshot/snapshot-apply.ts +197 -229
- package/src/snapshot/snapshot-codec.ts +29 -31
- package/src/snapshot/snapshot-paths.ts +4 -6
- package/src/snapshot/snapshot-transaction.ts +161 -170
- package/src/snapshot/snapshot-types.ts +24 -24
- package/src/snapshot/snapshot.ts +310 -343
- package/src/state/json-file.ts +11 -11
- package/src/state/lock.ts +226 -242
- package/src/state/lockfile-fs.ts +20 -20
- package/src/state/operation-availability.ts +36 -41
- package/src/state/state-directory.ts +171 -173
- package/src/state/state-types.ts +15 -15
- package/src/state/sync-state-store.ts +23 -23
- package/src/sync/automatic-sync.ts +75 -80
- package/src/sync/remote-snapshot.ts +52 -60
- package/src/sync/setup-switch.ts +99 -114
- package/src/sync/signals.ts +3 -5
- package/src/sync/startup-check.ts +97 -111
- package/src/sync/sync-decision.ts +76 -80
- package/src/sync/sync-error-guidance.ts +41 -48
- package/src/sync/sync-errors.ts +10 -10
- package/src/sync/sync-inspection.ts +29 -33
- package/src/sync/sync-loaders.ts +28 -36
- package/src/sync/sync-mutations.ts +510 -622
- package/src/sync/sync-operations.ts +7 -7
- package/src/sync/sync-policy.ts +296 -326
- package/src/sync/sync-queries.ts +175 -194
- package/src/sync/sync-state.ts +74 -100
- package/src/sync-extension.ts +89 -101
- package/src/sync.ts +26 -26
- package/src/types.ts +37 -37
- package/src/ui/automatic-sync-summary.ts +1 -3
- package/src/ui/cancellable-operation.ts +89 -101
- package/src/ui/file-selection.ts +250 -274
- package/src/ui/manager-attention.ts +51 -63
- package/src/ui/manager-recovery.ts +48 -57
- package/src/ui/manager-result-dispatcher.ts +62 -76
- package/src/ui/manager-state.ts +200 -232
- package/src/ui/manager-ui.ts +264 -362
- package/src/ui/remote-selection-ui.ts +547 -588
- package/src/ui/secret-input.ts +197 -205
- package/src/ui/settings-ui.ts +175 -172
- package/src/ui/setup/git-ui.ts +232 -261
- package/src/ui/setup/s3-credentials-ui.ts +58 -65
- package/src/ui/setup/s3-ui.ts +171 -195
- package/src/ui/setup/setup-actions.ts +91 -101
- package/src/ui/setup/setup-location-ui.ts +121 -137
- package/src/ui/setup/setup-name-ui.ts +27 -27
- package/src/ui/setup/setup-prompts.ts +65 -65
- package/src/ui/setup/setup-review.ts +58 -59
- package/src/ui/setup/setup-switcher.ts +156 -160
- package/src/ui/setup/setup-wizard.ts +28 -28
- package/src/ui/setup/text-input.ts +54 -58
- package/src/ui/setup/webdav-ui.ts +246 -293
- package/src/ui/storage-connections-ui.ts +317 -369
- package/src/ui/sync-attention.ts +148 -164
- package/src/ui/sync-format.ts +110 -121
- package/src/ui/sync-resolution-ui.ts +147 -153
- package/src/ui/sync-setups-ui.ts +218 -238
- package/src/ui/sync-status.ts +17 -0
- package/src/ui/terminal-text.ts +2 -2
- package/dist/chunks/chunk-2B2ELUF5.ts.map +0 -7
- package/dist/chunks/chunk-5B3FXBLE.ts.map +0 -7
- package/dist/chunks/chunk-6LP3MCR2.ts.map +0 -7
- package/dist/chunks/chunk-AUSDLD6F.ts.map +0 -7
- package/dist/chunks/chunk-C7XY5NF5.ts.map +0 -7
- package/dist/chunks/chunk-CCSN3F47.ts.map +0 -7
- package/dist/chunks/chunk-CHH26D4F.ts.map +0 -7
- package/dist/chunks/chunk-CPEHGXJV.ts.map +0 -7
- package/dist/chunks/chunk-D5X27LCA.ts.map +0 -7
- package/dist/chunks/chunk-DHVFS4QK.ts.map +0 -7
- package/dist/chunks/chunk-ETTRJDNP.ts.map +0 -7
- package/dist/chunks/chunk-HUDQATCL.ts.map +0 -7
- package/dist/chunks/chunk-IJ6FJFA5.ts.map +0 -7
- package/dist/chunks/chunk-JAAKLL6M.ts.map +0 -7
- package/dist/chunks/chunk-LCRI3ABW.ts.map +0 -7
- package/dist/chunks/chunk-LTBWGSBV.ts.map +0 -7
- package/dist/chunks/chunk-NJFUIVYL.ts.map +0 -7
- package/dist/chunks/chunk-OEX4ABY6.ts.map +0 -7
- package/dist/chunks/chunk-Q2TUM5X6.ts.map +0 -7
- package/dist/chunks/chunk-SL64RLXR.ts.map +0 -7
- package/dist/chunks/chunk-SZWBGPID.ts.map +0 -7
- package/dist/chunks/chunk-T2B5IU74.ts.map +0 -7
- package/dist/chunks/chunk-T3HH3UEJ.ts.map +0 -7
- package/dist/chunks/chunk-TEN2ZBJV.ts.map +0 -7
- package/dist/chunks/chunk-THMF4BVL.ts.map +0 -7
- package/dist/chunks/chunk-YDWUZVPN.ts.map +0 -7
- package/dist/chunks/chunk-YHEMENKV.ts.map +0 -7
- package/dist/chunks/chunk-Z4DQF6L3.ts.map +0 -7
- package/dist/chunks/chunk-ZI5MXMEX.ts.map +0 -7
- package/dist/chunks/file-selection-FTTKAOYX.ts.map +0 -7
- package/dist/chunks/git-backend-GMVS4PD4.ts.map +0 -7
- package/dist/chunks/manager-result-dispatcher-ASKGOSW5.ts +0 -22
- package/dist/chunks/manager-ui-IPAOAWZA.ts.map +0 -7
- package/dist/chunks/remote-selection-ui-QDNR7WEI.ts +0 -21
- package/dist/chunks/s3-backend-66O4FGBH.ts.map +0 -7
- package/dist/chunks/setup-wizard-JUJZYNNM.ts.map +0 -7
- package/dist/chunks/sync-inspection-CST2KL65.ts +0 -20
- package/dist/chunks/sync-operations-LBX3GKCM.ts.map +0 -7
- package/dist/chunks/webdav-backend-ECIKD7SO.ts.map +0 -7
- /package/dist/chunks/{manager-result-dispatcher-ASKGOSW5.ts.map → manager-result-dispatcher-OTUMQM26.ts.map} +0 -0
- /package/dist/chunks/{remote-selection-ui-QDNR7WEI.ts.map → remote-selection-ui-TZTJF32Y.ts.map} +0 -0
- /package/dist/chunks/{setup-switch-IS2PEZ3J.ts.map → setup-switch-5G2VNJHL.ts.map} +0 -0
- /package/dist/chunks/{snapshot-HKEWCVK6.ts.map → snapshot-JL5DFSXI.ts.map} +0 -0
- /package/dist/chunks/{sync-inspection-CST2KL65.ts.map → sync-inspection-P3ENJLNF.ts.map} +0 -0
- /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-
|
|
7
|
+
} from "./chunks/chunk-6546TS54.ts";
|
|
8
8
|
import {
|
|
9
9
|
recoverSnapshotTransactionsOnStartup
|
|
10
|
-
} from "./chunks/chunk-
|
|
10
|
+
} from "./chunks/chunk-4AIHXRKE.ts";
|
|
11
11
|
import {
|
|
12
12
|
unlock,
|
|
13
13
|
withLock
|
|
14
|
-
} from "./chunks/chunk-
|
|
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-
|
|
22
|
+
} from "./chunks/chunk-PWMWOJP4.ts";
|
|
19
23
|
import {
|
|
20
24
|
ensureStateDir,
|
|
21
25
|
readStateForConfig,
|
|
22
26
|
syncStateFingerprint
|
|
23
|
-
} from "./chunks/chunk-
|
|
27
|
+
} from "./chunks/chunk-YPXGU5OR.ts";
|
|
24
28
|
import {
|
|
25
29
|
automaticSyncSummary
|
|
26
|
-
} from "./chunks/chunk-
|
|
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-
|
|
39
|
+
} from "./chunks/chunk-YFADF5ZQ.ts";
|
|
36
40
|
import {
|
|
37
41
|
safeTerminalText
|
|
38
|
-
} from "./chunks/chunk-
|
|
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-
|
|
54
|
-
import "./chunks/chunk-
|
|
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-
|
|
60
|
-
import "./chunks/chunk-
|
|
62
|
+
} from "./chunks/chunk-BVVP33U5.ts";
|
|
63
|
+
import "./chunks/chunk-T2SJD3N7.ts";
|
|
61
64
|
import {
|
|
62
65
|
syncErrorGuidance
|
|
63
|
-
} from "./chunks/chunk-
|
|
66
|
+
} from "./chunks/chunk-G4RUXRWZ.ts";
|
|
64
67
|
import {
|
|
65
68
|
SetupPullRequiresUiError,
|
|
66
69
|
errorMessage,
|
|
67
70
|
isSyncDecisionRequiredError
|
|
68
|
-
} from "./chunks/chunk-
|
|
69
|
-
import "./chunks/chunk-
|
|
71
|
+
} from "./chunks/chunk-7D5SF7P3.ts";
|
|
72
|
+
import "./chunks/chunk-SWUXA3MH.ts";
|
|
70
73
|
import {
|
|
71
74
|
snapshotOptionsForContext
|
|
72
|
-
} from "./chunks/chunk-
|
|
75
|
+
} from "./chunks/chunk-OVDTF5CH.ts";
|
|
73
76
|
import {
|
|
74
77
|
RemoteSelectionMismatchError,
|
|
75
78
|
formatRemoteSelectionMismatch
|
|
76
|
-
} from "./chunks/chunk-
|
|
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
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
678
|
-
),
|
|
679
|
-
|
|
680
|
-
|
|
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
|
|
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": "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",
|
|
6
|
-
"names": [
|
|
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
|
}
|