@narumitw/pi-sync 0.50.2 → 0.51.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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-4CHTZMEO.ts → chunk-7KHKWL3Q.ts} +37 -55
- 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-G4RNQQZS.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-KW7YQEZN.ts → chunk-UA7RXOIT.ts} +48 -100
- 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-5KLKVMRC.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-IUB6ESEU.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 +92 -112
- 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 +198 -214
- 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-4CHTZMEO.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-ETTRJDNP.ts.map +0 -7
- package/dist/chunks/chunk-G4RNQQZS.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-KW7YQEZN.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-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-FKIBM3GO.ts +0 -22
- package/dist/chunks/manager-ui-5KLKVMRC.ts.map +0 -7
- package/dist/chunks/remote-selection-ui-D7RBRJNL.ts +0 -21
- package/dist/chunks/s3-backend-66O4FGBH.ts.map +0 -7
- package/dist/chunks/setup-wizard-IUB6ESEU.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-FKIBM3GO.ts.map → manager-result-dispatcher-OTUMQM26.ts.map} +0 -0
- /package/dist/chunks/{remote-selection-ui-D7RBRJNL.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
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/commands/setup-completions.ts", "../../src/ui/setup/text-input.ts", "../../src/ui/setup/setup-location-ui.ts", "../../src/ui/setup/setup-prompts.ts", "../../src/ui/setup/setup-review.ts", "../../src/ui/setup/git-ui.ts", "../../src/ui/secret-input.ts", "../../src/ui/setup/s3-credentials-ui.ts", "../../src/ui/setup/s3-ui.ts", "../../src/ui/setup/webdav-ui.ts"],
|
|
4
|
+
"sourcesContent": ["import { configuredSyncSetupNames } from \"../settings/settings-store.js\";\nimport { setSyncSetupCompletions } from \"./command.js\";\n\nexport async function refreshTargetCompletions() {\n setSyncSetupCompletions(await configuredSyncSetupNames());\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { normalizeS3Bucket, requiredString } from \"../../settings/settings-validation.js\";\nimport { errorMessage } from \"../../sync/sync-errors.js\";\nimport { safeTerminalText } from \"../terminal-text.js\";\n\nexport type ValidateInput = (value: string) => string | Promise<string>;\n\nexport async function requiredExistingBucket(ctx: ExtensionCommandContext, example: string, signal?: AbortSignal) {\n return requiredValueInput(\n ctx,\n \"Existing bucket\\n\\nThe bucket must already exist; pi-sync will not create it.\",\n example,\n signal,\n normalizeS3Bucket,\n );\n}\n\nexport async function requiredInput(\n ctx: ExtensionCommandContext,\n title: string,\n defaultValue: string,\n signal?: AbortSignal,\n validate?: ValidateInput,\n) {\n return promptTextInput(ctx, title, { defaultValue, validate, rejectPlaceholders: true }, signal);\n}\n\nexport async function requiredValueInput(\n ctx: ExtensionCommandContext,\n title: string,\n example: string,\n signal?: AbortSignal,\n validate?: ValidateInput,\n) {\n return promptTextInput(ctx, title, { example, validate, rejectPlaceholders: true }, signal);\n}\n\nexport async function promptTextInput(\n ctx: ExtensionCommandContext,\n title: string,\n options: {\n defaultValue?: string;\n example?: string;\n validate?: ValidateInput;\n rejectPlaceholders?: boolean;\n },\n signal?: AbortSignal,\n) {\n // Pi ignores placeholders. Keep defaults/examples visible; only an explicit blank accepts a default.\n const hint =\n options.defaultValue !== undefined\n ? `Default: ${safeTerminalText(options.defaultValue)} (leave blank to keep)`\n : `Example: ${safeTerminalText(options.example ?? \"\")}\\nEnter your own value; this example is not a default.`;\n while (true) {\n signal?.throwIfAborted();\n const value = await ctx.ui.input(`${title}\\n\\n${hint}`, undefined, { signal });\n signal?.throwIfAborted();\n if (value === undefined) return undefined;\n try {\n const normalized = value.trim() || options.defaultValue;\n if (!normalized) throw new Error(`${title.split(\"\\n\")[0]} is required.`);\n if (options.rejectPlaceholders && /[<>]/u.test(normalized)) {\n throw new Error(\"Replace example placeholders such as <account-id> with your own value.\");\n }\n const checked = requiredString(normalized, title.split(\"\\n\")[0] ?? \"value\");\n const result = options.validate ? await options.validate(checked) : checked;\n signal?.throwIfAborted();\n return result;\n } catch (error) {\n signal?.throwIfAborted();\n ctx.ui.notify(`${errorMessage(error)} Enter a corrected value, or cancel.`, \"warning\");\n }\n }\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { normalizeGitBranch } from \"../../backends/git/git-config.js\";\nimport { readLocalConfigObject } from \"../../settings/settings-store.js\";\nimport type { StorageConnectionSettings, SyncSetupSettings } from \"../../settings/settings-types.js\";\nimport {\n effectiveSyncSetupRemoteIdentity,\n normalizeStoragePath,\n ownRecord,\n} from \"../../settings/settings-validation.js\";\nimport { errorMessage } from \"../../sync/sync-errors.js\";\nimport { safeTerminalText } from \"../terminal-text.js\";\nimport { promptTextInput, requiredExistingBucket, requiredInput, requiredValueInput } from \"./text-input.js\";\n\ninterface ChosenRemoteLocation {\n connectionName: string;\n bucket: string;\n path: string;\n}\n\nexport async function chooseInitialRemoteLocation(\n ctx: ExtensionCommandContext,\n _preset: string,\n setupName: string,\n signal?: AbortSignal,\n): Promise<ChosenRemoteLocation | undefined> {\n const choice = await ctx.ui.select(\n \"Choose storage location\\n\\nUse an existing bucket. ./ stores snapshots at the bucket root; a custom path keeps them in a separate folder.\",\n [\"Use an existing bucket at ./\", \"Customize remote location\", \"Cancel\"],\n { signal },\n );\n if (signal?.aborted || !choice || choice === \"Cancel\") return undefined;\n if (choice === \"Customize remote location\") return chooseCustomRemoteLocation(ctx, setupName, signal);\n const bucket = await requiredExistingBucket(ctx, \"pi-sync\", signal);\n return bucket ? { connectionName: setupName, bucket, path: \"./\" } : undefined;\n}\n\nexport async function chooseAdditionalRemoteLocation(\n ctx: ExtensionCommandContext,\n settings: Record<string, unknown>,\n connectionName: string,\n setupName: string,\n signal?: AbortSignal,\n): Promise<Omit<ChosenRemoteLocation, \"connectionName\"> | undefined> {\n const setups = ownRecord(settings.syncSetups) ?? {};\n const currentSetup = typeof settings.activeSyncSetup === \"string\" ? settings.activeSyncSetup : undefined;\n const candidates = Object.entries(setups)\n .map(([name, value]) => ({ name, storage: ownRecord(ownRecord(value)?.storage) }))\n .filter(\n (item): item is { name: string; storage: Record<string, unknown> } =>\n item.storage?.connection === connectionName && typeof item.storage.bucket === \"string\",\n );\n const source =\n candidates.find((item) => item.name === currentSetup) ??\n candidates.sort((left, right) => left.name.localeCompare(right.name))[0];\n if (source) {\n const suggestedPath = \"./\";\n const sameBucketLabel = `Same bucket as \u201C${safeTerminalText(source.name)}\u201D`;\n const choice = await ctx.ui.select(\n [\n `Storage location for \u201C${safeTerminalText(setupName)}\u201D`,\n \"\",\n `Existing bucket: ${safeTerminalText(String(source.storage.bucket))}`,\n `Remote path: ${safeTerminalText(suggestedPath)}`,\n \"./ uses the bucket root. Use a different path or bucket for independent setups.\",\n ].join(\"\\n\"),\n [sameBucketLabel, \"Use a different bucket\", \"Customize remote location\", \"Cancel\"],\n { signal },\n );\n if (signal?.aborted || !choice || choice === \"Cancel\") return undefined;\n if (choice === sameBucketLabel) {\n return { bucket: String(source.storage.bucket), path: suggestedPath };\n }\n if (choice === \"Use a different bucket\") {\n const bucket = await requiredExistingBucket(ctx, \"pi-sync\", signal);\n return bucket ? { bucket, path: \"./\" } : undefined;\n }\n const custom = await chooseCustomRemoteLocation(ctx, connectionName, signal);\n return custom ? { bucket: custom.bucket, path: custom.path } : undefined;\n }\n\n const location = await chooseInitialRemoteLocation(ctx, \"S3\", setupName, signal);\n return location ? { bucket: location.bucket, path: location.path } : undefined;\n}\n\nasync function chooseCustomRemoteLocation(\n ctx: ExtensionCommandContext,\n connectionName: string,\n signal?: AbortSignal,\n): Promise<ChosenRemoteLocation | undefined> {\n const bucket = await requiredExistingBucket(ctx, \"pi-sync\", signal);\n if (!bucket) return undefined;\n const storagePath = await requiredInput(\n ctx,\n \"Storage path\\n\\nPath inside the bucket, not your local filesystem.\\n./ uses the bucket root. Use different paths for independent setups.\",\n \"./\",\n signal,\n normalizeStoragePath,\n );\n if (!storagePath) return undefined;\n return { connectionName, bucket, path: normalizeStoragePath(storagePath) };\n}\n\n/** Early UI check only; the settings writer still validates uniqueness under its lock. */\nexport async function promptAvailableSetupStorage<T extends SyncSetupSettings[\"storage\"]>(\n ctx: ExtensionCommandContext,\n initial: T,\n signal?: AbortSignal,\n): Promise<T | undefined> {\n let storage = initial;\n while (!signal?.aborted) {\n const settings = await readLocalConfigObject();\n if (signal?.aborted) return undefined;\n const connection = settings?.storageConnections[storage.connection];\n if (!settings || !connection) throw new Error(\"Storage connection changed; reopen setup.\");\n const identity = setupPublicationIdentity(storage, connection);\n const occupied = Object.entries(settings.syncSetups).find(\n ([, setup]) =>\n setupPublicationIdentity(setup.storage, settings.storageConnections[setup.storage.connection]) === identity,\n );\n if (!occupied) return storage;\n const git = connection.type === \"git\";\n const message = `${git ? \"Git branch\" : \"Storage location\"} is already used by \u201C${safeTerminalText(occupied[0])}\u201D. ${git ? \"Use a different branch; pi-sync owns the entire branch.\" : \"Enter a different storage path, or cancel to choose another connection or bucket.\"}`;\n ctx.ui.notify(message, \"warning\");\n const title = `${git ? \"Git branch for the new setup\" : \"Storage path for the new setup\"}\\n\\n${message}`;\n const example = git ? \"pi-sync/work\" : \"backups/work\";\n const value =\n connection.type === \"webdav\"\n ? await promptTextInput(ctx, title, { example }, signal)\n : await requiredValueInput(ctx, title, example, signal);\n if (signal?.aborted || value === undefined) return undefined;\n try {\n storage = git\n ? { ...storage, branch: normalizeGitBranch(value) }\n : { ...storage, path: normalizeStoragePath(value) };\n } catch (error) {\n ctx.ui.notify(safeTerminalText(errorMessage(error)), \"warning\");\n }\n }\n return undefined;\n}\n\nfunction setupPublicationIdentity(storage: SyncSetupSettings[\"storage\"], connection: StorageConnectionSettings) {\n // Git publications own a complete branch tree; changing only its directory is not isolation.\n return effectiveSyncSetupRemoteIdentity(\n {\n storage: connection.type === \"git\" ? { ...storage, path: \"./\" } : storage,\n sync: { include: [], automatic: false },\n },\n connection,\n );\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { readLocalConfigObject } from \"../../settings/settings-store.js\";\nimport { validateConfigName } from \"../../settings/settings-validation.js\";\nimport { DEFAULT_SYNC_INCLUDE } from \"../../sync/sync-policy.js\";\nimport { safeTerminalText } from \"../terminal-text.js\";\nimport { promptTextInput } from \"./text-input.js\";\n\nexport async function readSetupConnection(name: string, signal?: AbortSignal) {\n const connection = (await readLocalConfigObject())?.storageConnections[name];\n signal?.throwIfAborted();\n if (!connection) throw new Error(\"Storage connection changed; reopen setup.\");\n return connection;\n}\n\nexport const AUTOMATIC_SYNC_DESCRIPTION =\n \"Check the current setup in the background at startup; review changes in /sync before transferring. At shutdown, automatically push selected content only when sessions are included. No startup dialogs.\";\n\nexport async function chooseSetupContent(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n const choice = await ctx.ui.select(\n \"Choose included content\\n\\nRecommended: Pi settings, instructions, skills, prompts, themes, and extensions.\\nMinimal: settings.json and AGENTS.md.\\nReview the exact paths before saving.\",\n [\"Recommended Pi settings\", \"Minimal settings\", \"Cancel\"],\n { signal },\n );\n signal?.throwIfAborted();\n if (!choice || choice === \"Cancel\") return undefined;\n return choice === \"Minimal settings\" ? [\"settings.json\", \"AGENTS.md\"] : [...DEFAULT_SYNC_INCLUDE];\n}\n\nexport async function chooseAutomaticSync(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n const choice = await ctx.ui.select(\n `Automatic sync for this setup\\n\\n${AUTOMATIC_SYNC_DESCRIPTION}`,\n [\"Keep automatic sync off\", \"Enable automatic sync\", \"Cancel\"],\n { signal },\n );\n signal?.throwIfAborted();\n return !choice || choice === \"Cancel\" ? undefined : choice === \"Enable automatic sync\";\n}\n\nexport async function chooseSessions(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n const choice = await ctx.ui.select(\n \"Session conversations\\n\\nSessions can contain prompts, tool output, paths, screenshots, and secrets.\",\n [\"Keep sessions off (recommended)\", \"Include session conversations\", \"Cancel\"],\n { signal },\n );\n signal?.throwIfAborted();\n if (!choice || choice === \"Cancel\") return undefined;\n if (choice !== \"Include session conversations\") return false;\n const confirmed = await ctx.ui.confirm(\n \"Include session conversations?\",\n \"I understand that session JSONL can contain prompts, tool output, paths, screenshots, and secrets.\",\n { signal },\n );\n signal?.throwIfAborted();\n return confirmed ? true : undefined;\n}\n\nexport function includedContentLines(include: readonly string[], sessions = false) {\n const paths = [...include, ...(sessions && !include.includes(\"sessions\") ? [\"sessions\"] : [])];\n return [\n `Included content: ${paths.length} paths`,\n ...paths.map((item) => ` ${safeTerminalText(item)}`),\n `Sessions: ${sessions ? \"On \u2014 privacy warning acknowledged\" : \"Off\"}`,\n ];\n}\n\nexport async function promptResourceName(\n ctx: ExtensionCommandContext,\n kind: \"sync setup\" | \"storage connection\",\n defaultValue: string,\n signal?: AbortSignal,\n literalBrackets = false,\n) {\n return promptTextInput(\n ctx,\n `Name this ${kind}\\n\\nA local label, such as home or work.`,\n {\n defaultValue,\n rejectPlaceholders: !literalBrackets,\n validate: async (name) => {\n validateConfigName(name, kind);\n const settings = await readLocalConfigObject();\n signal?.throwIfAborted();\n const names = kind === \"sync setup\" ? settings?.syncSetups : settings?.storageConnections;\n if (names && Object.hasOwn(names, name)) {\n throw new Error(`A ${kind} with this name already exists. Choose a different name.`);\n }\n return name;\n },\n },\n signal,\n );\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport { syncErrorGuidance } from \"../../sync/sync-error-guidance.js\";\n\n/** A settings draft is committed only after review; retryable I/O failures retain the same draft. */\nexport async function saveReviewedDraft(\n ctx: ExtensionCommandContext,\n title: string,\n lines: readonly string[],\n label: string,\n save: (signal: AbortSignal) => Promise<unknown>,\n signal?: AbortSignal,\n) {\n let saved = false;\n let failure: unknown;\n let failureText: string | undefined;\n const menu = defineMenu<undefined, \"review\", \"save\", ExtensionCommandContext>({\n start: \"review\",\n screens: {\n review: () => ({\n kind: \"review\",\n title,\n content: [...(failureText ? [failureText, \"\"] : []), ...lines].join(\"\\n\"),\n lines: [\"Review before saving. Back cancels this draft.\"],\n format: { kind: \"text\" },\n viewportSize: \"adaptive\",\n confirm: { id: \"save\", label, action: \"save\" },\n hint: \"back\",\n }),\n },\n actions: {\n save: async ({ signal: actionSignal }) => {\n try {\n actionSignal.throwIfAborted();\n await save(actionSignal);\n saved = true;\n return { kind: \"close\" };\n } catch (error) {\n if (actionSignal.aborted) return { kind: \"close\" };\n // Do not silently rebase a stale review or overwrite an invalid settings file.\n // The caller must reopen current settings for those failures.\n if (!retryableSettingsError(error)) {\n failure = error;\n return { kind: \"close\" };\n }\n failureText = `Not saved. ${syncErrorGuidance(error)}\\nYour draft is retained. Fix the problem, then save again, or cancel.`;\n ctx.ui.notify(failureText, \"error\");\n return { kind: \"stay\" };\n }\n },\n },\n });\n const result = await runMenu(ctx, menu, {\n getState: () => undefined,\n signal,\n isCurrent: () => !signal?.aborted,\n });\n if (signal?.aborted) return false;\n if (failure) throw failure;\n if (result.kind === \"error\") throw result.error;\n return saved;\n}\n\nfunction retryableSettingsError(error: unknown) {\n const code = (error as NodeJS.ErrnoException | undefined)?.code;\n return (\n code !== undefined && [\"EACCES\", \"EPERM\", \"ENOSPC\", \"EBUSY\", \"EIO\", \"EMFILE\", \"ENFILE\", \"EROFS\"].includes(code)\n );\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { normalizeGitBranch, normalizeGitDirectory, normalizeGitRemote } from \"../../backends/git/git-config.js\";\nimport {\n addStorageConnection,\n addSyncSetup,\n saveNewV3Settings,\n updateStorageConnection,\n updateSyncSetup,\n} from \"../../settings/settings-management.js\";\nimport type { PartialConfig } from \"../../settings/settings-types.js\";\nimport { automaticSyncSummary } from \"../automatic-sync-summary.js\";\nimport { safeTerminalText } from \"../terminal-text.js\";\nimport { promptAvailableSetupStorage } from \"./setup-location-ui.js\";\nimport {\n chooseAutomaticSync,\n chooseSetupContent,\n includedContentLines,\n promptResourceName,\n readSetupConnection,\n} from \"./setup-prompts.js\";\nimport { saveReviewedDraft } from \"./setup-review.js\";\nimport { requiredInput, requiredValueInput } from \"./text-input.js\";\n\nexport async function showGitSetup(ctx: ExtensionCommandContext, targetName: string, signal?: AbortSignal) {\n const remote = await promptGitRemote(ctx, signal);\n if (!remote) return false;\n const destination = await promptGitDestination(ctx, signal);\n if (!destination) return false;\n const include = await chooseSetupContent(ctx, signal);\n if (!include) return false;\n const automatic = await chooseAutomaticSync(ctx, signal);\n if (automatic === undefined) return false;\n const saved = await saveReviewedDraft(\n ctx,\n \"Review Git sync setup\",\n [\n `Sync setup: ${safeTerminalText(targetName)}`,\n `Storage connection: ${safeTerminalText(targetName)} (Git)`,\n `Remote: ${safeTerminalText(remote)}`,\n `Sync branch: ${safeTerminalText(destination.branch)}`,\n `Storage location: ${safeTerminalText(destination.directory)}`,\n ...includedContentLines(include),\n `Automatic sync: ${automaticSyncSummary(automatic)}`,\n \"Authentication: existing Git credential helper or SSH configuration (not stored by pi-sync).\",\n \"pi-sync manages the entire branch. The repository must already exist; a new branch is created on first push.\",\n \"Saving does not contact remote storage or start syncing.\",\n ],\n \"Save setup\",\n (saveSignal) =>\n saveNewV3Settings(\n {\n setupName: targetName,\n connectionName: targetName,\n connection: { type: \"git\", remote },\n setup: {\n storage: {\n connection: targetName,\n branch: destination.branch,\n path: destination.directory,\n },\n sync: { include, automatic },\n },\n },\n saveSignal,\n ),\n signal,\n );\n if (saved && !signal?.aborted)\n ctx.ui.notify(`Saved Git sync setup \u201C${safeTerminalText(targetName)}\u201D. Choose Sync now to start.`, \"info\");\n return saved;\n}\n\nexport async function showAddGitStorageProfile(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n const name = await promptResourceName(ctx, \"storage connection\", \"git\", signal);\n if (!name) return false;\n const remote = await promptGitRemote(ctx, signal);\n if (!remote) return false;\n const saved = await saveReviewedDraft(\n ctx,\n \"Review storage connection\",\n [\n `Name: ${safeTerminalText(name)}`,\n \"Type: Git\",\n `Remote: ${safeTerminalText(remote)}`,\n \"Credentials: existing Git/SSH authentication (not stored)\",\n \"Adding a connection does not contact the remote or start syncing.\",\n ],\n \"Add storage connection\",\n (saveSignal) => addStorageConnection(name, { type: \"git\", remote }, saveSignal),\n signal,\n );\n if (saved && !signal?.aborted) ctx.ui.notify(`Added storage connection \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n return saved;\n}\n\nexport async function showEditGitStorageProfile(\n ctx: ExtensionCommandContext,\n name: string,\n profile: Record<string, unknown>,\n signal?: AbortSignal,\n affectedSetups?: string[],\n) {\n const remote = await promptGitRemote(ctx, signal, typeof profile.remote === \"string\" ? profile.remote : undefined);\n if (!remote) return false;\n const saved = await saveReviewedDraft(\n ctx,\n \"Review storage connection\",\n [\n `Storage connection: ${safeTerminalText(name)}`,\n `Remote: ${safeTerminalText(String(profile.remote ?? \"missing\"))} \u2192 ${safeTerminalText(remote)}`,\n `Affected sync setups: ${affectedSetups?.length ? affectedSetups.map(safeTerminalText).join(\", \") : \"None\"}`,\n \"Saving changes future storage access for every affected setup; it does not move or delete remote history.\",\n ],\n \"Save storage connection\",\n (saveSignal) =>\n updateStorageConnection(\n name,\n (current) => {\n if (current.type !== \"git\" || current.remote !== profile.remote)\n throw new Error(\"Storage connection changed while it was open; reopen it.\");\n return { ...current, remote };\n },\n affectedSetups,\n saveSignal,\n ),\n signal,\n );\n if (saved && !signal?.aborted) ctx.ui.notify(`Saved storage connection \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n return saved;\n}\n\nexport async function showAddGitTarget(\n ctx: ExtensionCommandContext,\n name: string,\n profile: string,\n signal?: AbortSignal,\n) {\n const selected = await promptGitDestination(ctx, signal);\n if (!selected) return false;\n const storage = await promptAvailableSetupStorage(\n ctx,\n { connection: profile, branch: selected.branch, path: selected.directory },\n signal,\n );\n if (!storage) return false;\n const include = await chooseSetupContent(ctx, signal);\n if (!include) return false;\n const automatic = await chooseAutomaticSync(ctx, signal);\n if (automatic === undefined) return false;\n const connection = await readSetupConnection(profile, signal);\n if (connection?.type !== \"git\") throw new Error(\"Storage connection changed; reopen setup.\");\n const saved = await saveReviewedDraft(\n ctx,\n \"Review Git sync setup\",\n [\n `Sync setup: ${safeTerminalText(name)}`,\n `Storage connection: ${safeTerminalText(profile)}`,\n `Remote: ${safeTerminalText(connection.remote)}`,\n `Sync branch: ${safeTerminalText(storage.branch)}`,\n `Storage location: ${safeTerminalText(storage.path)}`,\n ...includedContentLines(include),\n `Automatic sync: ${automaticSyncSummary(automatic)}`,\n \"pi-sync manages the entire branch. Adding this setup does not sync or modify remote data.\",\n ],\n \"Add sync setup\",\n (saveSignal) => addSyncSetup(name, { storage, sync: { include, automatic } }, saveSignal, connection),\n signal,\n );\n if (saved && !signal?.aborted) ctx.ui.notify(`Added sync setup \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n return saved;\n}\n\nexport async function showEditGitTarget(ctx: ExtensionCommandContext, partial: PartialConfig, signal?: AbortSignal) {\n let destination = await promptGitDestination(ctx, signal, partial);\n if (!destination) return false;\n while (destination.directory !== partial.storagePath && destination.branch === partial.branch) {\n ctx.ui.notify(\n \"Changing a Git storage path requires a new Git branch so the existing branch remains readable.\",\n \"warning\",\n );\n const branch = await requiredValueInput(\n ctx,\n \"New Git branch\\n\\nKeep the previous branch unchanged; enter a new branch for this path.\",\n \"pi-sync/archive\",\n signal,\n normalizeGitBranch,\n );\n if (!branch) return false;\n destination = { ...destination, branch };\n }\n const chosen = destination;\n const connection = await readSetupConnection(partial.connectionName, signal);\n if (connection.type !== \"git\") throw new Error(\"Storage connection changed; reopen setup.\");\n const saved = await saveReviewedDraft(\n ctx,\n \"Review sync setup\",\n [\n `Sync setup: ${safeTerminalText(partial.setupName)}`,\n `Storage connection: ${safeTerminalText(partial.connectionName)}`,\n `Remote: ${safeTerminalText(connection.remote)}`,\n `Branch: ${safeTerminalText(partial.branch ?? \"missing\")} \u2192 ${safeTerminalText(chosen.branch)}`,\n `Storage path: ${safeTerminalText(partial.storagePath)} \u2192 ${safeTerminalText(chosen.directory)}`,\n \"Saving changes the future storage location only; it does not move or delete remote history.\",\n ],\n \"Save sync setup\",\n (saveSignal) =>\n updateSyncSetup(\n partial.setupName,\n (setup) => {\n if (typeof setup.storage.branch !== \"string\") throw new Error(\"Sync setup storage type changed; reopen it.\");\n return {\n ...setup,\n storage: { ...setup.storage, branch: chosen.branch, path: chosen.directory },\n };\n },\n { expectedStorage: partial, expectedConnection: connection, signal: saveSignal },\n ),\n signal,\n );\n if (saved && !signal?.aborted) ctx.ui.notify(`Saved sync setup \u201C${safeTerminalText(partial.setupName)}\u201D.`, \"info\");\n return saved;\n}\n\nasync function promptGitRemote(ctx: ExtensionCommandContext, signal?: AbortSignal, current?: string) {\n const title =\n \"Git remote URL (SSH or HTTPS)\\n\\nUse an existing private repository with Git/SSH authentication already configured.\";\n const validate = (value: string) => {\n const remote = normalizeGitRemote(value);\n if (!remote) throw new Error(\"Git remote URL is required.\");\n return remote;\n };\n return current\n ? requiredInput(ctx, title, current, signal, validate)\n : requiredValueInput(\n ctx,\n title,\n \"git@github.com:owner/private-pi-sync.git (SSH) or https://github.com/owner/private-pi-sync.git (HTTPS)\",\n signal,\n validate,\n );\n}\n\nasync function promptGitDestination(\n ctx: ExtensionCommandContext,\n signal?: AbortSignal,\n current: Partial<PartialConfig> = {},\n) {\n const branch = await requiredInput(\n ctx,\n \"Git branch for sync snapshots\\n\\npi-sync manages this entire branch, not your local working branch.\\nUse a new branch or one already used by pi-sync; unrelated content is rejected.\",\n current.branch ?? \"main\",\n signal,\n normalizeGitBranch,\n );\n if (!branch) return undefined;\n const directory = await requiredInput(\n ctx,\n \"Git storage path\\n\\nRelative to the repository root, not your local filesystem.\\n./ stores manifest.json and files/ at the repository root.\",\n current.storagePath ?? \"./\",\n signal,\n normalizeGitDirectory,\n );\n return directory ? { branch, directory } : undefined;\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport {\n CURSOR_MARKER,\n decodeKittyPrintable,\n type Focusable,\n Key,\n type KeybindingsManager,\n matchesKey,\n Text,\n truncateToWidth,\n} from \"@earendil-works/pi-tui\";\nimport { formatInteractionHints, runCustomInteraction } from \"@narumitw/pi-tui-kit\";\n\nconst MASK = \"\u2022\";\n\nexport async function promptSecret(\n ctx: ExtensionCommandContext,\n title: string,\n options: { required?: boolean; signal?: AbortSignal } = { required: true },\n) {\n if (ctx.mode !== \"tui\" || options.signal?.aborted) return undefined;\n const result = await runCustomInteraction<string | undefined>(ctx, {\n signal: options.signal,\n isCurrent: () => !options.signal?.aborted,\n create: ({ tui, theme, keybindings, complete }) => {\n const heading = new Text(\"\", 0, 0);\n const hint = new Text(\"\", 0, 0);\n const interactionHint = formatInteractionHints(keybindings, [\n {\n keys: keybindings.getKeys(\"tui.input.submit\").filter((key) => !hasControlCharacter(key)),\n label: \"continue\",\n },\n {\n keys: [...keybindings.getKeys(\"tui.select.cancel\").filter((key) => !hasControlCharacter(key)), \"ctrl+c\"],\n label: \"cancel\",\n },\n ]);\n const applyTheme = () => {\n heading.setText(theme.fg(\"accent\", theme.bold(title)));\n hint.setText(theme.fg(\"dim\", `${interactionHint} \u2022 Input is hidden`));\n };\n applyTheme();\n const input = new MaskedInput(keybindings);\n const component: Focusable & {\n render(width: number): string[];\n invalidate(): void;\n handleInput(data: string): void;\n dispose(): void;\n } = {\n get focused() {\n return input.focused;\n },\n set focused(focused: boolean) {\n input.focused = focused;\n },\n render(width: number) {\n const safeWidth = Math.max(1, width);\n return [...heading.render(safeWidth), ...input.render(safeWidth), ...hint.render(safeWidth)].map((line) =>\n truncateToWidth(line, safeWidth),\n );\n },\n invalidate() {\n applyTheme();\n heading.invalidate();\n input.invalidate();\n hint.invalidate();\n },\n handleInput(data: string) {\n if (matchesKey(data, Key.ctrl(\"c\"))) {\n complete(undefined);\n } else if (input.isPasting || data.includes(\"\\u001b[200~\")) {\n input.handleInput(data);\n } else if (keybindings.matches(data, \"tui.select.cancel\")) {\n complete(undefined);\n } else if (keybindings.matches(data, \"tui.input.submit\")) {\n if (options.required !== false && input.getValue().length === 0) {\n ctx.ui.notify(`${title} is required. Enter a value, or cancel.`, \"warning\");\n } else if (hasControlCharacter(input.getValue())) {\n ctx.ui.notify(\n `${title} contains control characters. Remove them or re-enter the value, then continue.`,\n \"warning\",\n );\n } else complete(input.getValue());\n } else input.handleInput(data);\n tui.requestRender();\n },\n dispose() {\n input.clear();\n },\n };\n return component;\n },\n });\n if (result.kind === \"error\") throw result.error;\n if (result.kind !== \"completed\" || result.value === undefined) return undefined;\n const value = result.value;\n if (options.required !== false && value.length === 0) {\n ctx.ui.notify(`${title} is required.`, \"warning\");\n return undefined;\n }\n return value;\n}\n\nclass MaskedInput implements Focusable {\n focused = false;\n private value: string[] = [];\n private cursor = 0;\n private paste = \"\";\n private pasting = false;\n\n constructor(private readonly keybindings: KeybindingsManager) {}\n\n get isPasting() {\n return this.pasting;\n }\n\n getValue() {\n return this.value.join(\"\");\n }\n\n handleInput(data: string) {\n if (data.includes(\"\\u001b[200~\")) {\n this.pasting = true;\n this.paste = \"\";\n data = data.replace(\"\\u001b[200~\", \"\");\n }\n if (this.pasting) {\n this.paste += data;\n const end = this.paste.indexOf(\"\\u001b[201~\");\n if (end < 0) return;\n const pasted = this.paste\n .slice(0, end)\n .replace(/[\\r\\n]/gu, \"\")\n .replace(/\\t/gu, \" \");\n this.insert(pasted);\n const remaining = this.paste.slice(end + 6);\n this.paste = \"\";\n this.pasting = false;\n if (remaining) this.handleInput(remaining);\n return;\n }\n if (this.keybindings.matches(data, \"tui.editor.deleteCharBackward\")) {\n if (this.cursor > 0) this.value.splice(--this.cursor, 1);\n return;\n }\n if (this.keybindings.matches(data, \"tui.editor.deleteCharForward\")) {\n if (this.cursor < this.value.length) this.value.splice(this.cursor, 1);\n return;\n }\n if (this.keybindings.matches(data, \"tui.editor.cursorLeft\")) {\n this.cursor = Math.max(0, this.cursor - 1);\n return;\n }\n if (this.keybindings.matches(data, \"tui.editor.cursorRight\")) {\n this.cursor = Math.min(this.value.length, this.cursor + 1);\n return;\n }\n if (this.keybindings.matches(data, \"tui.editor.cursorLineStart\")) {\n this.cursor = 0;\n return;\n }\n if (this.keybindings.matches(data, \"tui.editor.cursorLineEnd\")) {\n this.cursor = this.value.length;\n return;\n }\n if (this.keybindings.matches(data, \"tui.editor.deleteToLineStart\")) {\n this.value.splice(0, this.cursor);\n this.cursor = 0;\n return;\n }\n if (this.keybindings.matches(data, \"tui.editor.deleteToLineEnd\")) {\n this.value.splice(this.cursor);\n return;\n }\n const printable = decodeKittyPrintable(data) ?? data;\n if (!hasControlCharacter(printable)) this.insert(printable);\n }\n\n render(width: number) {\n const prompt = \"> \";\n const available = width - prompt.length;\n if (available <= 0) return [truncateToWidth(prompt, Math.max(1, width))];\n const contentWidth = Math.max(0, available - 1);\n let start = 0;\n if (this.value.length > contentWidth) {\n start = Math.max(0, Math.min(this.cursor - Math.floor(contentWidth / 2), this.value.length - contentWidth));\n }\n const end = Math.min(this.value.length, start + contentWidth);\n const visibleCursor = Math.max(0, Math.min(this.cursor - start, end - start));\n const masks = Array.from({ length: end - start }, () => MASK);\n const before = masks.slice(0, visibleCursor).join(\"\");\n const atCursor = visibleCursor < masks.length ? MASK : \" \";\n const after = masks.slice(visibleCursor + (visibleCursor < masks.length ? 1 : 0)).join(\"\");\n const marker = this.focused ? CURSOR_MARKER : \"\";\n const line = `${prompt}${before}${marker}\\u001b[7m${atCursor}\\u001b[27m${after}`;\n return [truncateToWidth(line, width, \"\")];\n }\n\n invalidate() {}\n\n clear() {\n this.value.fill(\"\");\n this.value = [];\n this.paste = \"\";\n this.cursor = 0;\n this.pasting = false;\n }\n\n private insert(value: string) {\n const characters = Array.from(value);\n this.value.splice(this.cursor, 0, ...characters);\n this.cursor += characters.length;\n }\n}\n\nfunction hasControlCharacter(value: string) {\n return [...value].some((character) => {\n const code = character.codePointAt(0) ?? 0;\n return code < 0x20 || (code >= 0x7f && code <= 0x9f);\n });\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { promptSecret } from \"../secret-input.js\";\nimport { requiredValueInput } from \"./text-input.js\";\n\nexport interface ChosenS3Credentials {\n profileFields: { accessKeyId?: string; secretAccessKey?: string };\n summary: string;\n ready: boolean;\n replace?: boolean;\n}\n\nexport async function chooseS3CredentialUpdate(\n ctx: ExtensionCommandContext,\n profile: Record<string, unknown>,\n signal?: AbortSignal,\n) {\n const hasStored =\n typeof profile.accessKeyId === \"string\" &&\n profile.accessKeyId.length > 0 &&\n typeof profile.secretAccessKey === \"string\" &&\n profile.secretAccessKey.length > 0;\n if (hasStored) {\n const action = await ctx.ui.select(\"Credentials\", [\"Keep current credentials\", \"Replace credentials\", \"Cancel\"], {\n signal,\n });\n throwIfAborted(signal);\n if (!action || action === \"Cancel\") return undefined;\n if (action === \"Keep current credentials\") {\n return { profileFields: {}, summary: \"Unchanged (values hidden)\", ready: true };\n }\n }\n const selected = await chooseS3Credentials(ctx, signal);\n return selected ? { ...selected, replace: true } : undefined;\n}\n\nexport function applyS3CredentialUpdate(profile: Record<string, unknown>, credentials: ChosenS3Credentials) {\n const next = { ...profile };\n if (credentials.replace) {\n delete next.accessKeyId;\n delete next.secretAccessKey;\n delete next.sessionToken;\n }\n return { ...next, ...credentials.profileFields };\n}\n\nexport async function chooseS3Credentials(\n ctx: ExtensionCommandContext,\n signal?: AbortSignal,\n): Promise<ChosenS3Credentials | undefined> {\n const choice = await ctx.ui.select(\n \"Credentials\\n\\nCredentials are stored in the private pi-sync settings file. Secret values are masked during input and never shown afterward.\",\n [\"Store credentials privately\", \"Cancel\"],\n { signal },\n );\n throwIfAborted(signal);\n if (choice !== \"Store credentials privately\") return undefined;\n const accessKeyId = await requiredValueInput(\n ctx,\n \"Access key ID\\n\\nUse the S3 API access key ID issued by your provider, not the secret access key.\",\n \"access-key-id\",\n signal,\n );\n if (!accessKeyId) return undefined;\n const secretAccessKey = await promptSecret(ctx, \"Secret access key\", { signal });\n throwIfAborted(signal);\n if (secretAccessKey === undefined) return undefined;\n return {\n profileFields: { accessKeyId, secretAccessKey },\n summary: \"Stored privately (values hidden)\",\n ready: true,\n };\n}\n\nfunction throwIfAborted(signal?: AbortSignal) {\n if (!signal?.aborted) return;\n throw signal.reason instanceof Error ? signal.reason : new DOMException(\"The operation was aborted\", \"AbortError\");\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { refreshTargetCompletions } from \"../../commands/setup-completions.js\";\nimport { addSyncSetup, saveNewV3Settings, updateSyncSetup } from \"../../settings/settings-management.js\";\nimport type { PartialConfig } from \"../../settings/settings-types.js\";\nimport { normalizeS3Bucket, normalizeS3Endpoint, normalizeStoragePath } from \"../../settings/settings-validation.js\";\nimport { automaticSyncSummary } from \"../automatic-sync-summary.js\";\nimport { safeTerminalText } from \"../terminal-text.js\";\nimport { chooseS3Credentials } from \"./s3-credentials-ui.js\";\nimport {\n chooseAdditionalRemoteLocation,\n chooseInitialRemoteLocation,\n promptAvailableSetupStorage,\n} from \"./setup-location-ui.js\";\nimport {\n chooseAutomaticSync,\n chooseSessions,\n chooseSetupContent,\n includedContentLines,\n readSetupConnection,\n} from \"./setup-prompts.js\";\nimport { saveReviewedDraft } from \"./setup-review.js\";\nimport { requiredInput, requiredValueInput } from \"./text-input.js\";\n\nexport async function showS3Setup(\n ctx: ExtensionCommandContext,\n preset: string,\n targetName: string,\n signal?: AbortSignal,\n) {\n const endpoint = await requiredValueInput(\n ctx,\n preset === \"Cloudflare R2\"\n ? \"Cloudflare R2 endpoint\\n\\nCopy the S3 API endpoint from your R2 account; replace <account-id>.\"\n : \"S3-compatible endpoint\\n\\nUse your provider's S3 API URL, not its web console.\",\n preset === \"Cloudflare R2\" ? \"https://<account-id>.r2.cloudflarestorage.com\" : \"https://s3.example.com\",\n signal,\n normalizeS3Endpoint,\n );\n if (!endpoint) return false;\n const region =\n preset === \"Cloudflare R2\"\n ? \"auto\"\n : await requiredInput(\n ctx,\n \"Storage region\\n\\nUse the region assigned to your bucket by the provider.\",\n \"us-east-1\",\n signal,\n );\n if (!region) return false;\n const location = await chooseInitialRemoteLocation(ctx, preset, targetName, signal);\n if (!location) return false;\n const credentials = await chooseS3Credentials(ctx, signal);\n if (!credentials) return false;\n const include = await chooseSetupContent(ctx, signal);\n if (!include) return false;\n const automatic = await chooseAutomaticSync(ctx, signal);\n if (automatic === undefined) return false;\n const sessions = await chooseSessions(ctx, signal);\n if (sessions === undefined) return false;\n const saved = await saveReviewedDraft(\n ctx,\n \"Review sync setup\",\n [\n `Sync setup: ${safeTerminalText(targetName)}`,\n `Storage connection: ${safeTerminalText(location.connectionName)} (${preset})`,\n `Endpoint: ${safeTerminalText(endpoint)}`,\n `Region: ${safeTerminalText(region)}`,\n `Bucket: ${safeTerminalText(location.bucket)}`,\n `Storage location: ${safeTerminalText(location.path)}`,\n ...includedContentLines(include, sessions),\n `Automatic sync: ${automaticSyncSummary(automatic)}`,\n `Credentials: ${credentials.summary}`,\n \"The bucket must already exist. Saving does not contact remote storage or start syncing.\",\n ],\n \"Save sync setup\",\n (saveSignal) =>\n saveNewV3Settings(\n {\n setupName: targetName,\n connectionName: location.connectionName,\n connection: {\n type: \"s3\",\n endpoint,\n region,\n credentials: {\n accessKeyId: credentials.profileFields.accessKeyId ?? \"\",\n secretAccessKey: credentials.profileFields.secretAccessKey ?? \"\",\n },\n },\n setup: {\n storage: {\n connection: location.connectionName,\n bucket: location.bucket,\n path: location.path,\n },\n sync: { include: [...include, ...(sessions ? [\"sessions\"] : [])], automatic },\n },\n },\n saveSignal,\n ),\n signal,\n );\n if (!saved || signal?.aborted) return false;\n await refreshTargetCompletions();\n if (!signal?.aborted)\n ctx.ui.notify(`Sync setup \u201C${safeTerminalText(targetName)}\u201D saved. Choose Sync now to start.`, \"info\");\n return true;\n}\n\nexport async function showAddS3Target(\n ctx: ExtensionCommandContext,\n raw: Record<string, unknown>,\n profile: string,\n name: string,\n signal?: AbortSignal,\n) {\n const location = await chooseAdditionalRemoteLocation(ctx, raw, profile, name, signal);\n if (!location) return;\n const storage = await promptAvailableSetupStorage(ctx, { connection: profile, ...location }, signal);\n if (!storage) return;\n const include = await chooseSetupContent(ctx, signal);\n if (!include) return;\n const automatic = await chooseAutomaticSync(ctx, signal);\n if (automatic === undefined) return;\n const connection = await readSetupConnection(profile, signal);\n if (connection.type !== \"s3\") throw new Error(\"Storage connection changed; reopen setup.\");\n const saved = await saveReviewedDraft(\n ctx,\n \"Review new sync setup\",\n [\n `Sync setup: ${safeTerminalText(name)}`,\n `Storage connection: ${safeTerminalText(profile)}`,\n `Endpoint: ${safeTerminalText(connection.endpoint)}`,\n `Bucket: ${safeTerminalText(storage.bucket)}`,\n `Storage location: ${safeTerminalText(storage.path)}`,\n ...includedContentLines(include),\n `Automatic sync: ${automaticSyncSummary(automatic)}`,\n \"Only the current setup is checked at startup. Shutdown can push selected content when sessions are included.\",\n \"The bucket must already exist. Adding this setup does not sync or modify remote data.\",\n ],\n \"Add sync setup\",\n (saveSignal) => addSyncSetup(name, { storage, sync: { include, automatic } }, saveSignal, connection),\n signal,\n );\n if (!saved || signal?.aborted) return;\n await refreshTargetCompletions();\n if (!signal?.aborted) ctx.ui.notify(`Added sync setup \u201C${safeTerminalText(name)}\u201D.`, \"info\");\n}\n\nexport async function showEditS3Target(ctx: ExtensionCommandContext, partial: PartialConfig, signal?: AbortSignal) {\n const bucket = await requiredInput(\n ctx,\n \"Bucket\\n\\nUse an existing bucket; pi-sync will not create it.\",\n partial.bucket ?? \"pi-sync\",\n signal,\n normalizeS3Bucket,\n );\n if (!bucket) return;\n const storagePath = await requiredInput(\n ctx,\n \"Storage path\\n\\nPath inside the bucket, not your local filesystem. ./ uses the bucket root.\",\n partial.storagePath,\n signal,\n normalizeStoragePath,\n );\n if (!storagePath) return;\n const connection = await readSetupConnection(partial.connectionName, signal);\n if (connection.type !== \"s3\") throw new Error(\"Storage connection changed; reopen setup.\");\n const saved = await saveReviewedDraft(\n ctx,\n \"Review sync setup\",\n [\n `Sync setup: ${safeTerminalText(partial.setupName)}`,\n `Storage connection: ${safeTerminalText(partial.connectionName)}`,\n `Endpoint: ${safeTerminalText(connection.endpoint)}`,\n `Bucket: ${safeTerminalText(partial.bucket ?? \"missing\")} \u2192 ${safeTerminalText(bucket)}`,\n `Storage path: ${safeTerminalText(partial.storagePath)} \u2192 ${safeTerminalText(storagePath)}`,\n \"Saving changes the future storage location only; it does not move or delete remote data.\",\n ],\n \"Save sync setup\",\n (saveSignal) =>\n updateSyncSetup(\n partial.setupName,\n (setup) => {\n if (typeof setup.storage.bucket !== \"string\") throw new Error(\"Sync setup storage type changed; reopen it.\");\n return { ...setup, storage: { ...setup.storage, bucket, path: storagePath } };\n },\n { expectedStorage: partial, expectedConnection: connection, signal: saveSignal },\n ),\n signal,\n );\n if (saved && !signal?.aborted) ctx.ui.notify(`Saved sync setup \u201C${safeTerminalText(partial.setupName)}\u201D.`, \"info\");\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport {\n normalizeWebDavPath,\n normalizeWebDavUrl,\n validateWebDavCredentials,\n} from \"../../backends/webdav/webdav-config.js\";\nimport {\n addStorageConnection,\n addSyncSetup,\n saveNewV3Settings,\n updateStorageConnection,\n updateSyncSetup,\n} from \"../../settings/settings-management.js\";\nimport type { PartialConfig } from \"../../settings/settings-types.js\";\nimport { automaticSyncSummary } from \"../automatic-sync-summary.js\";\nimport { promptSecret } from \"../secret-input.js\";\nimport { safeTerminalText as safe } from \"../terminal-text.js\";\nimport { promptAvailableSetupStorage } from \"./setup-location-ui.js\";\nimport {\n chooseAutomaticSync,\n chooseSessions,\n chooseSetupContent,\n includedContentLines,\n promptResourceName,\n readSetupConnection,\n} from \"./setup-prompts.js\";\nimport { saveReviewedDraft } from \"./setup-review.js\";\nimport { promptTextInput } from \"./text-input.js\";\n\nexport async function showWebDavSetup(ctx: ExtensionCommandContext, targetName: string, signal?: AbortSignal) {\n const url = await promptWebDavUrl(ctx, signal);\n if (!url) return false;\n const username = await promptUsername(ctx, signal);\n if (!username) return false;\n const password = await promptSecret(ctx, \"WebDAV password\", { signal });\n signal?.throwIfAborted();\n if (password === undefined) return false;\n const remotePath = await chooseDestination(ctx, signal);\n if (!remotePath) return false;\n const include = await chooseSetupContent(ctx, signal);\n if (!include) return false;\n const automatic = await chooseAutomaticSync(ctx, signal);\n if (automatic === undefined) return false;\n const sessions = await chooseSessions(ctx, signal);\n if (sessions === undefined) return false;\n const saved = await saveReviewedDraft(\n ctx,\n \"Review WebDAV setup\",\n [\n `Sync setup: ${safe(targetName)}`,\n `Storage connection: ${safe(targetName)} (WebDAV)`,\n `URL: ${safe(url)}`,\n `Storage location: ${safe(remotePath)}`,\n \"Username and password: stored privately (values hidden)\",\n ...includedContentLines(include, sessions),\n `Automatic sync: ${automaticSyncSummary(automatic)}`,\n \"Check setup tests whether this server can safely save sync updates using a temporary probe.\",\n \"Saving does not contact remote storage or start syncing.\",\n ],\n \"Save setup\",\n (saveSignal) =>\n saveNewV3Settings(\n {\n setupName: targetName,\n connectionName: targetName,\n connection: { type: \"webdav\", url, credentials: { username, password } },\n setup: {\n storage: { connection: targetName, path: remotePath },\n sync: { include: [...include, ...(sessions ? [\"sessions\"] : [])], automatic },\n },\n },\n saveSignal,\n ),\n signal,\n );\n if (saved && !signal?.aborted)\n ctx.ui.notify(`Sync setup \u201C${safe(targetName)}\u201D saved. Choose Sync now to start.`, \"info\");\n return saved;\n}\n\nexport async function showAddWebDavTarget(\n ctx: ExtensionCommandContext,\n name: string,\n profile: string,\n signal?: AbortSignal,\n) {\n const remotePath = await chooseDestination(ctx, signal);\n if (!remotePath) return false;\n const storage = await promptAvailableSetupStorage(ctx, { connection: profile, path: remotePath }, signal);\n if (!storage) return false;\n const include = await chooseSetupContent(ctx, signal);\n if (!include) return false;\n const automatic = await chooseAutomaticSync(ctx, signal);\n if (automatic === undefined) return false;\n const connection = await readSetupConnection(profile, signal);\n if (connection.type !== \"webdav\") throw new Error(\"Storage connection changed; reopen setup.\");\n const saved = await saveReviewedDraft(\n ctx,\n \"Review WebDAV sync setup\",\n [\n `Sync setup: ${safe(name)}`,\n `Storage connection: ${safe(profile)}`,\n `URL: ${safe(connection.url)}`,\n `Storage location: ${safe(storage.path)}`,\n ...includedContentLines(include),\n `Automatic sync: ${automaticSyncSummary(automatic)}`,\n \"Adding this setup does not sync or modify remote data.\",\n ],\n \"Add sync setup\",\n (saveSignal) => addSyncSetup(name, { storage, sync: { include, automatic } }, saveSignal, connection),\n signal,\n );\n if (saved && !signal?.aborted) ctx.ui.notify(`Added sync setup \u201C${safe(name)}\u201D.`, \"info\");\n return saved;\n}\n\nexport async function showEditWebDavTarget(ctx: ExtensionCommandContext, partial: PartialConfig, signal?: AbortSignal) {\n const remotePath = await chooseDestination(ctx, signal, partial.storagePath);\n if (!remotePath) return false;\n const connection = await readSetupConnection(partial.connectionName, signal);\n if (connection.type !== \"webdav\") throw new Error(\"Storage connection changed; reopen setup.\");\n const saved = await saveReviewedDraft(\n ctx,\n \"Review sync setup\",\n [\n `Sync setup: ${safe(partial.setupName)}`,\n `Storage connection: ${safe(partial.connectionName)}`,\n `URL: ${safe(connection.url)}`,\n `Storage path: ${safe(partial.storagePath)} \u2192 ${safe(remotePath)}`,\n \"Saving changes the future storage location only; it does not move or delete remote data.\",\n ],\n \"Save sync setup\",\n (saveSignal) =>\n updateSyncSetup(\n partial.setupName,\n (setup) => ({\n ...setup,\n storage: { ...setup.storage, path: remotePath },\n }),\n { expectedStorage: partial, expectedConnection: connection, signal: saveSignal },\n ),\n signal,\n );\n if (saved && !signal?.aborted) ctx.ui.notify(`Saved sync setup \u201C${safe(partial.setupName)}\u201D.`, \"info\");\n return saved;\n}\n\nexport async function showAddWebDavStorageProfile(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n const name = await promptResourceName(ctx, \"storage connection\", \"webdav\", signal, true);\n if (!name) return false;\n const url = await promptWebDavUrl(ctx, signal);\n if (!url) return false;\n const username = await promptUsername(ctx, signal);\n if (!username) return false;\n const password = await promptSecret(ctx, \"WebDAV password\", { signal });\n signal?.throwIfAborted();\n if (password === undefined) return false;\n const saved = await saveReviewedDraft(\n ctx,\n \"Review storage connection\",\n [\n `Name: ${safe(name)}`,\n \"Type: WebDAV\",\n `URL: ${safe(url)}`,\n \"Username and password: stored privately (values hidden)\",\n \"Adding a connection does not contact the server or start syncing.\",\n ],\n \"Add storage connection\",\n (saveSignal) =>\n addStorageConnection(name, { type: \"webdav\", url, credentials: { username, password } }, saveSignal),\n signal,\n );\n if (saved && !signal?.aborted) ctx.ui.notify(`Added storage connection \u201C${safe(name)}\u201D.`, \"info\");\n return saved;\n}\n\nexport async function showEditWebDavStorageProfile(\n ctx: ExtensionCommandContext,\n name: string,\n profile: Record<string, unknown>,\n signal?: AbortSignal,\n affectedSetups?: string[],\n) {\n const url = await promptWebDavUrl(ctx, signal, typeof profile.url === \"string\" ? profile.url : undefined);\n if (!url) return false;\n const username = await promptUsername(ctx, signal);\n if (!username) return false;\n const hasPassword = typeof profile.password === \"string\" && profile.password.length > 0;\n const passwordAction = hasPassword\n ? await select(ctx, \"WebDAV password\", [\"Keep current password\", \"Replace password\", \"Cancel\"], signal)\n : \"Replace password\";\n if (!passwordAction || passwordAction === \"Cancel\") return false;\n const replacePassword = passwordAction === \"Replace password\";\n const password = replacePassword ? await promptSecret(ctx, \"New WebDAV password\", { signal }) : undefined;\n signal?.throwIfAborted();\n if (replacePassword && password === undefined) return false;\n const saved = await saveReviewedDraft(\n ctx,\n \"Review storage connection\",\n [\n `Storage connection: ${safe(name)}`,\n `URL: ${safe(String(profile.url))} \u2192 ${safe(url)}`,\n \"Username: stored privately (value hidden)\",\n `Password: ${replacePassword ? \"will be replaced\" : \"unchanged\"} (value hidden)`,\n `Affected sync setups: ${affectedSetups?.length ? affectedSetups.map(safe).join(\", \") : \"None\"}`,\n \"Saving changes future storage access for every affected setup; it does not move remote data.\",\n ],\n \"Save storage connection\",\n (saveSignal) =>\n updateStorageConnection(\n name,\n (current) => {\n if (\n current.type !== \"webdav\" ||\n current.url !== profile.url ||\n current.credentials.username !== profile.username ||\n current.credentials.password !== profile.password\n )\n throw new Error(\"Storage connection changed while it was open; reopen it.\");\n return {\n ...current,\n url,\n credentials: {\n ...current.credentials,\n username,\n password: password ?? current.credentials.password,\n },\n };\n },\n affectedSetups,\n saveSignal,\n ),\n signal,\n );\n if (saved && !signal?.aborted) ctx.ui.notify(`Saved storage connection \u201C${safe(name)}\u201D.`, \"info\");\n return saved;\n}\n\nasync function chooseDestination(ctx: ExtensionCommandContext, signal?: AbortSignal, current = \"./\") {\n return promptTextInput(\n ctx,\n \"WebDAV storage path\\n\\nFolder relative to the collection URL, not your local filesystem.\\n./ uses the collection root. Use different folders for independent setups.\",\n { defaultValue: current, validate: normalizeWebDavPath },\n signal,\n );\n}\n\nasync function promptUsername(ctx: ExtensionCommandContext, signal?: AbortSignal) {\n return promptTextInput(\n ctx,\n \"WebDAV username\\n\\nEnter the account username; stored values remain hidden.\",\n {\n example: \"user\",\n validate: (value) => {\n validateWebDavCredentials(value);\n return value;\n },\n },\n signal,\n );\n}\n\nasync function promptWebDavUrl(ctx: ExtensionCommandContext, signal?: AbortSignal, current?: string) {\n return promptTextInput(\n ctx,\n \"WebDAV collection URL\\n\\nUse the HTTPS WebDAV URL from your provider, not its web login page.\",\n {\n ...(current ? { defaultValue: current } : { example: \"https://cloud.example.com/remote.php/dav/files/user\" }),\n validate: (value) => {\n const url = normalizeWebDavUrl(value);\n if (!url) throw new Error(\"WebDAV URL is required.\");\n return url;\n },\n },\n signal,\n );\n}\n\nasync function select(ctx: ExtensionCommandContext, title: string, options: string[], signal?: AbortSignal) {\n const value = await ctx.ui.select(title, options, { signal });\n signal?.throwIfAborted();\n return value;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,eAAsB,2BAA2B;AAC/C,0BAAwB,MAAM,yBAAyB,CAAC;AAC1D;;;ACEA,eAAsB,uBAAuB,KAA8B,SAAiB,QAAsB;AAChH,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,cACpB,KACA,OACA,cACA,QACA,UACA;AACA,SAAO,gBAAgB,KAAK,OAAO,EAAE,cAAc,UAAU,oBAAoB,KAAK,GAAG,MAAM;AACjG;AAEA,eAAsB,mBACpB,KACA,OACA,SACA,QACA,UACA;AACA,SAAO,gBAAgB,KAAK,OAAO,EAAE,SAAS,UAAU,oBAAoB,KAAK,GAAG,MAAM;AAC5F;AAEA,eAAsB,gBACpB,KACA,OACA,SAMA,QACA;AAEA,QAAM,OACJ,QAAQ,iBAAiB,SACrB,YAAY,iBAAiB,QAAQ,YAAY,CAAC,2BAClD,YAAY,iBAAiB,QAAQ,WAAW,EAAE,CAAC;AAAA;AACzD,SAAO,MAAM;AACX,YAAQ,eAAe;AACvB,UAAM,QAAQ,MAAM,IAAI,GAAG,MAAM,GAAG,KAAK;AAAA;AAAA,EAAO,IAAI,IAAI,QAAW,EAAE,OAAO,CAAC;AAC7E,YAAQ,eAAe;AACvB,QAAI,UAAU,OAAW,QAAO;AAChC,QAAI;AACF,YAAM,aAAa,MAAM,KAAK,KAAK,QAAQ;AAC3C,UAAI,CAAC,WAAY,OAAM,IAAI,MAAM,GAAG,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC,eAAe;AACvE,UAAI,QAAQ,sBAAsB,QAAQ,KAAK,UAAU,GAAG;AAC1D,cAAM,IAAI,MAAM,wEAAwE;AAAA,MAC1F;AACA,YAAM,UAAU,eAAe,YAAY,MAAM,MAAM,IAAI,EAAE,CAAC,KAAK,OAAO;AAC1E,YAAM,SAAS,QAAQ,WAAW,MAAM,QAAQ,SAAS,OAAO,IAAI;AACpE,cAAQ,eAAe;AACvB,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,eAAe;AACvB,UAAI,GAAG,OAAO,GAAG,aAAa,KAAK,CAAC,wCAAwC,SAAS;AAAA,IACvF;AAAA,EACF;AACF;;;ACtDA,eAAsB,4BACpB,KACA,SACA,WACA,QAC2C;AAC3C,QAAM,SAAS,MAAM,IAAI,GAAG;AAAA,IAC1B;AAAA,IACA,CAAC,gCAAgC,6BAA6B,QAAQ;AAAA,IACtE,EAAE,OAAO;AAAA,EACX;AACA,MAAI,QAAQ,WAAW,CAAC,UAAU,WAAW,SAAU,QAAO;AAC9D,MAAI,WAAW,4BAA6B,QAAO,2BAA2B,KAAK,WAAW,MAAM;AACpG,QAAM,SAAS,MAAM,uBAAuB,KAAK,WAAW,MAAM;AAClE,SAAO,SAAS,EAAE,gBAAgB,WAAW,QAAQ,MAAM,KAAK,IAAI;AACtE;AAEA,eAAsB,+BACpB,KACA,UACA,gBACA,WACA,QACmE;AACnE,QAAM,SAAS,UAAU,SAAS,UAAU,KAAK,CAAC;AAClD,QAAM,eAAe,OAAO,SAAS,oBAAoB,WAAW,SAAS,kBAAkB;AAC/F,QAAM,aAAa,OAAO,QAAQ,MAAM,EACrC,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,EAAE,MAAM,SAAS,UAAU,UAAU,KAAK,GAAG,OAAO,EAAE,EAAE,EAChF;AAAA,IACC,CAAC,SACC,KAAK,SAAS,eAAe,kBAAkB,OAAO,KAAK,QAAQ,WAAW;AAAA,EAClF;AACF,QAAM,SACJ,WAAW,KAAK,CAAC,SAAS,KAAK,SAAS,YAAY,KACpD,WAAW,KAAK,CAAC,MAAM,UAAU,KAAK,KAAK,cAAc,MAAM,IAAI,CAAC,EAAE,CAAC;AACzE,MAAI,QAAQ;AACV,UAAM,gBAAgB;AACtB,UAAM,kBAAkB,wBAAmB,iBAAiB,OAAO,IAAI,CAAC;AACxE,UAAM,SAAS,MAAM,IAAI,GAAG;AAAA,MAC1B;AAAA,QACE,8BAAyB,iBAAiB,SAAS,CAAC;AAAA,QACpD;AAAA,QACA,oBAAoB,iBAAiB,OAAO,OAAO,QAAQ,MAAM,CAAC,CAAC;AAAA,QACnE,gBAAgB,iBAAiB,aAAa,CAAC;AAAA,QAC/C;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,MACX,CAAC,iBAAiB,0BAA0B,6BAA6B,QAAQ;AAAA,MACjF,EAAE,OAAO;AAAA,IACX;AACA,QAAI,QAAQ,WAAW,CAAC,UAAU,WAAW,SAAU,QAAO;AAC9D,QAAI,WAAW,iBAAiB;AAC9B,aAAO,EAAE,QAAQ,OAAO,OAAO,QAAQ,MAAM,GAAG,MAAM,cAAc;AAAA,IACtE;AACA,QAAI,WAAW,0BAA0B;AACvC,YAAM,SAAS,MAAM,uBAAuB,KAAK,WAAW,MAAM;AAClE,aAAO,SAAS,EAAE,QAAQ,MAAM,KAAK,IAAI;AAAA,IAC3C;AACA,UAAM,SAAS,MAAM,2BAA2B,KAAK,gBAAgB,MAAM;AAC3E,WAAO,SAAS,EAAE,QAAQ,OAAO,QAAQ,MAAM,OAAO,KAAK,IAAI;AAAA,EACjE;AAEA,QAAM,WAAW,MAAM,4BAA4B,KAAK,MAAM,WAAW,MAAM;AAC/E,SAAO,WAAW,EAAE,QAAQ,SAAS,QAAQ,MAAM,SAAS,KAAK,IAAI;AACvE;AAEA,eAAe,2BACb,KACA,gBACA,QAC2C;AAC3C,QAAM,SAAS,MAAM,uBAAuB,KAAK,WAAW,MAAM;AAClE,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,cAAc,MAAM;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,YAAa,QAAO;AACzB,SAAO,EAAE,gBAAgB,QAAQ,MAAM,qBAAqB,WAAW,EAAE;AAC3E;AAGA,eAAsB,4BACpB,KACA,SACA,QACwB;AACxB,MAAI,UAAU;AACd,SAAO,CAAC,QAAQ,SAAS;AACvB,UAAM,WAAW,MAAM,sBAAsB;AAC7C,QAAI,QAAQ,QAAS,QAAO;AAC5B,UAAM,aAAa,UAAU,mBAAmB,QAAQ,UAAU;AAClE,QAAI,CAAC,YAAY,CAAC,WAAY,OAAM,IAAI,MAAM,2CAA2C;AACzF,UAAM,WAAW,yBAAyB,SAAS,UAAU;AAC7D,UAAM,WAAW,OAAO,QAAQ,SAAS,UAAU,EAAE;AAAA,MACnD,CAAC,CAAC,EAAE,KAAK,MACP,yBAAyB,MAAM,SAAS,SAAS,mBAAmB,MAAM,QAAQ,UAAU,CAAC,MAAM;AAAA,IACvG;AACA,QAAI,CAAC,SAAU,QAAO;AACtB,UAAM,MAAM,WAAW,SAAS;AAChC,UAAM,UAAU,GAAG,MAAM,eAAe,kBAAkB,6BAAwB,iBAAiB,SAAS,CAAC,CAAC,CAAC,WAAM,MAAM,4DAA4D,mFAAmF;AAC1Q,QAAI,GAAG,OAAO,SAAS,SAAS;AAChC,UAAM,QAAQ,GAAG,MAAM,iCAAiC,gCAAgC;AAAA;AAAA,EAAO,OAAO;AACtG,UAAM,UAAU,MAAM,iBAAiB;AACvC,UAAM,QACJ,WAAW,SAAS,WAChB,MAAM,gBAAgB,KAAK,OAAO,EAAE,QAAQ,GAAG,MAAM,IACrD,MAAM,mBAAmB,KAAK,OAAO,SAAS,MAAM;AAC1D,QAAI,QAAQ,WAAW,UAAU,OAAW,QAAO;AACnD,QAAI;AACF,gBAAU,MACN,EAAE,GAAG,SAAS,QAAQ,mBAAmB,KAAK,EAAE,IAChD,EAAE,GAAG,SAAS,MAAM,qBAAqB,KAAK,EAAE;AAAA,IACtD,SAAS,OAAO;AACd,UAAI,GAAG,OAAO,iBAAiB,aAAa,KAAK,CAAC,GAAG,SAAS;AAAA,IAChE;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,SAAuC,YAAuC;AAE9G,SAAO;AAAA,IACL;AAAA,MACE,SAAS,WAAW,SAAS,QAAQ,EAAE,GAAG,SAAS,MAAM,KAAK,IAAI;AAAA,MAClE,MAAM,EAAE,SAAS,CAAC,GAAG,WAAW,MAAM;AAAA,IACxC;AAAA,IACA;AAAA,EACF;AACF;;;AC/IA,eAAsB,oBAAoB,MAAc,QAAsB;AAC5E,QAAM,cAAc,MAAM,sBAAsB,IAAI,mBAAmB,IAAI;AAC3E,UAAQ,eAAe;AACvB,MAAI,CAAC,WAAY,OAAM,IAAI,MAAM,2CAA2C;AAC5E,SAAO;AACT;AAEO,IAAM,6BACX;AAEF,eAAsB,mBAAmB,KAA8B,QAAsB;AAC3F,QAAM,SAAS,MAAM,IAAI,GAAG;AAAA,IAC1B;AAAA,IACA,CAAC,2BAA2B,oBAAoB,QAAQ;AAAA,IACxD,EAAE,OAAO;AAAA,EACX;AACA,UAAQ,eAAe;AACvB,MAAI,CAAC,UAAU,WAAW,SAAU,QAAO;AAC3C,SAAO,WAAW,qBAAqB,CAAC,iBAAiB,WAAW,IAAI,CAAC,GAAG,oBAAoB;AAClG;AAEA,eAAsB,oBAAoB,KAA8B,QAAsB;AAC5F,QAAM,SAAS,MAAM,IAAI,GAAG;AAAA,IAC1B;AAAA;AAAA,EAAoC,0BAA0B;AAAA,IAC9D,CAAC,2BAA2B,yBAAyB,QAAQ;AAAA,IAC7D,EAAE,OAAO;AAAA,EACX;AACA,UAAQ,eAAe;AACvB,SAAO,CAAC,UAAU,WAAW,WAAW,SAAY,WAAW;AACjE;AAEA,eAAsB,eAAe,KAA8B,QAAsB;AACvF,QAAM,SAAS,MAAM,IAAI,GAAG;AAAA,IAC1B;AAAA,IACA,CAAC,mCAAmC,iCAAiC,QAAQ;AAAA,IAC7E,EAAE,OAAO;AAAA,EACX;AACA,UAAQ,eAAe;AACvB,MAAI,CAAC,UAAU,WAAW,SAAU,QAAO;AAC3C,MAAI,WAAW,gCAAiC,QAAO;AACvD,QAAM,YAAY,MAAM,IAAI,GAAG;AAAA,IAC7B;AAAA,IACA;AAAA,IACA,EAAE,OAAO;AAAA,EACX;AACA,UAAQ,eAAe;AACvB,SAAO,YAAY,OAAO;AAC5B;AAEO,SAAS,qBAAqB,SAA4B,WAAW,OAAO;AACjF,QAAM,QAAQ,CAAC,GAAG,SAAS,GAAI,YAAY,CAAC,QAAQ,SAAS,UAAU,IAAI,CAAC,UAAU,IAAI,CAAC,CAAE;AAC7F,SAAO;AAAA,IACL,qBAAqB,MAAM,MAAM;AAAA,IACjC,GAAG,MAAM,IAAI,CAAC,SAAS,KAAK,iBAAiB,IAAI,CAAC,EAAE;AAAA,IACpD,aAAa,WAAW,2CAAsC,KAAK;AAAA,EACrE;AACF;AAEA,eAAsB,mBACpB,KACA,MACA,cACA,QACA,kBAAkB,OAClB;AACA,SAAO;AAAA,IACL;AAAA,IACA,aAAa,IAAI;AAAA;AAAA;AAAA,IACjB;AAAA,MACE;AAAA,MACA,oBAAoB,CAAC;AAAA,MACrB,UAAU,OAAO,SAAS;AACxB,2BAAmB,MAAM,IAAI;AAC7B,cAAM,WAAW,MAAM,sBAAsB;AAC7C,gBAAQ,eAAe;AACvB,cAAM,QAAQ,SAAS,eAAe,UAAU,aAAa,UAAU;AACvE,YAAI,SAAS,OAAO,OAAO,OAAO,IAAI,GAAG;AACvC,gBAAM,IAAI,MAAM,KAAK,IAAI,0DAA0D;AAAA,QACrF;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;;;AC1FA,SAAS,YAAY,eAAe;AAIpC,eAAsB,kBACpB,KACA,OACA,OACA,OACA,MACA,QACA;AACA,MAAI,QAAQ;AACZ,MAAI;AACJ,MAAI;AACJ,QAAM,OAAO,WAAiE;AAAA,IAC5E,OAAO;AAAA,IACP,SAAS;AAAA,MACP,QAAQ,OAAO;AAAA,QACb,MAAM;AAAA,QACN;AAAA,QACA,SAAS,CAAC,GAAI,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,GAAI,GAAG,KAAK,EAAE,KAAK,IAAI;AAAA,QACxE,OAAO,CAAC,gDAAgD;AAAA,QACxD,QAAQ,EAAE,MAAM,OAAO;AAAA,QACvB,cAAc;AAAA,QACd,SAAS,EAAE,IAAI,QAAQ,OAAO,QAAQ,OAAO;AAAA,QAC7C,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,MAAM,OAAO,EAAE,QAAQ,aAAa,MAAM;AACxC,YAAI;AACF,uBAAa,eAAe;AAC5B,gBAAM,KAAK,YAAY;AACvB,kBAAQ;AACR,iBAAO,EAAE,MAAM,QAAQ;AAAA,QACzB,SAAS,OAAO;AACd,cAAI,aAAa,QAAS,QAAO,EAAE,MAAM,QAAQ;AAGjD,cAAI,CAAC,uBAAuB,KAAK,GAAG;AAClC,sBAAU;AACV,mBAAO,EAAE,MAAM,QAAQ;AAAA,UACzB;AACA,wBAAc,cAAc,kBAAkB,KAAK,CAAC;AAAA;AACpD,cAAI,GAAG,OAAO,aAAa,OAAO;AAClC,iBAAO,EAAE,MAAM,OAAO;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACD,QAAM,SAAS,MAAM,QAAQ,KAAK,MAAM;AAAA,IACtC,UAAU,MAAM;AAAA,IAChB;AAAA,IACA,WAAW,MAAM,CAAC,QAAQ;AAAA,EAC5B,CAAC;AACD,MAAI,QAAQ,QAAS,QAAO;AAC5B,MAAI,QAAS,OAAM;AACnB,MAAI,OAAO,SAAS,QAAS,OAAM,OAAO;AAC1C,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAgB;AAC9C,QAAM,OAAQ,OAA6C;AAC3D,SACE,SAAS,UAAa,CAAC,UAAU,SAAS,UAAU,SAAS,OAAO,UAAU,UAAU,OAAO,EAAE,SAAS,IAAI;AAElH;;;AC7CA,eAAsB,aAAa,KAA8B,YAAoB,QAAsB;AACzG,QAAM,SAAS,MAAM,gBAAgB,KAAK,MAAM;AAChD,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,cAAc,MAAM,qBAAqB,KAAK,MAAM;AAC1D,MAAI,CAAC,YAAa,QAAO;AACzB,QAAM,UAAU,MAAM,mBAAmB,KAAK,MAAM;AACpD,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,YAAY,MAAM,oBAAoB,KAAK,MAAM;AACvD,MAAI,cAAc,OAAW,QAAO;AACpC,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,MACE,eAAe,iBAAiB,UAAU,CAAC;AAAA,MAC3C,uBAAuB,iBAAiB,UAAU,CAAC;AAAA,MACnD,WAAW,iBAAiB,MAAM,CAAC;AAAA,MACnC,gBAAgB,iBAAiB,YAAY,MAAM,CAAC;AAAA,MACpD,qBAAqB,iBAAiB,YAAY,SAAS,CAAC;AAAA,MAC5D,GAAG,qBAAqB,OAAO;AAAA,MAC/B,mBAAmB,qBAAqB,SAAS,CAAC;AAAA,MAClD;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACA,CAAC,eACC;AAAA,MACE;AAAA,QACE,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,YAAY,EAAE,MAAM,OAAO,OAAO;AAAA,QAClC,OAAO;AAAA,UACL,SAAS;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ,YAAY;AAAA,YACpB,MAAM,YAAY;AAAA,UACpB;AAAA,UACA,MAAM,EAAE,SAAS,UAAU;AAAA,QAC7B;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,CAAC,QAAQ;AACpB,QAAI,GAAG,OAAO,8BAAyB,iBAAiB,UAAU,CAAC,qCAAgC,MAAM;AAC3G,SAAO;AACT;AAEA,eAAsB,yBAAyB,KAA8B,QAAsB;AACjG,QAAM,OAAO,MAAM,mBAAmB,KAAK,sBAAsB,OAAO,MAAM;AAC9E,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,SAAS,MAAM,gBAAgB,KAAK,MAAM;AAChD,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAAS,iBAAiB,IAAI,CAAC;AAAA,MAC/B;AAAA,MACA,WAAW,iBAAiB,MAAM,CAAC;AAAA,MACnC;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACA,CAAC,eAAe,qBAAqB,MAAM,EAAE,MAAM,OAAO,OAAO,GAAG,UAAU;AAAA,IAC9E;AAAA,EACF;AACA,MAAI,SAAS,CAAC,QAAQ,QAAS,KAAI,GAAG,OAAO,kCAA6B,iBAAiB,IAAI,CAAC,WAAM,MAAM;AAC5G,SAAO;AACT;AAEA,eAAsB,0BACpB,KACA,MACA,SACA,QACA,gBACA;AACA,QAAM,SAAS,MAAM,gBAAgB,KAAK,QAAQ,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS,MAAS;AACjH,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,MACE,uBAAuB,iBAAiB,IAAI,CAAC;AAAA,MAC7C,WAAW,iBAAiB,OAAO,QAAQ,UAAU,SAAS,CAAC,CAAC,WAAM,iBAAiB,MAAM,CAAC;AAAA,MAC9F,yBAAyB,gBAAgB,SAAS,eAAe,IAAI,gBAAgB,EAAE,KAAK,IAAI,IAAI,MAAM;AAAA,MAC1G;AAAA,IACF;AAAA,IACA;AAAA,IACA,CAAC,eACC;AAAA,MACE;AAAA,MACA,CAAC,YAAY;AACX,YAAI,QAAQ,SAAS,SAAS,QAAQ,WAAW,QAAQ;AACvD,gBAAM,IAAI,MAAM,0DAA0D;AAC5E,eAAO,EAAE,GAAG,SAAS,OAAO;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,CAAC,QAAQ,QAAS,KAAI,GAAG,OAAO,kCAA6B,iBAAiB,IAAI,CAAC,WAAM,MAAM;AAC5G,SAAO;AACT;AAEA,eAAsB,iBACpB,KACA,MACA,SACA,QACA;AACA,QAAM,WAAW,MAAM,qBAAqB,KAAK,MAAM;AACvD,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,UAAU,MAAM;AAAA,IACpB;AAAA,IACA,EAAE,YAAY,SAAS,QAAQ,SAAS,QAAQ,MAAM,SAAS,UAAU;AAAA,IACzE;AAAA,EACF;AACA,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,UAAU,MAAM,mBAAmB,KAAK,MAAM;AACpD,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,YAAY,MAAM,oBAAoB,KAAK,MAAM;AACvD,MAAI,cAAc,OAAW,QAAO;AACpC,QAAM,aAAa,MAAM,oBAAoB,SAAS,MAAM;AAC5D,MAAI,YAAY,SAAS,MAAO,OAAM,IAAI,MAAM,2CAA2C;AAC3F,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,MACE,eAAe,iBAAiB,IAAI,CAAC;AAAA,MACrC,uBAAuB,iBAAiB,OAAO,CAAC;AAAA,MAChD,WAAW,iBAAiB,WAAW,MAAM,CAAC;AAAA,MAC9C,gBAAgB,iBAAiB,QAAQ,MAAM,CAAC;AAAA,MAChD,qBAAqB,iBAAiB,QAAQ,IAAI,CAAC;AAAA,MACnD,GAAG,qBAAqB,OAAO;AAAA,MAC/B,mBAAmB,qBAAqB,SAAS,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,IACA;AAAA,IACA,CAAC,eAAe,aAAa,MAAM,EAAE,SAAS,MAAM,EAAE,SAAS,UAAU,EAAE,GAAG,YAAY,UAAU;AAAA,IACpG;AAAA,EACF;AACA,MAAI,SAAS,CAAC,QAAQ,QAAS,KAAI,GAAG,OAAO,0BAAqB,iBAAiB,IAAI,CAAC,WAAM,MAAM;AACpG,SAAO;AACT;AAEA,eAAsB,kBAAkB,KAA8B,SAAwB,QAAsB;AAClH,MAAI,cAAc,MAAM,qBAAqB,KAAK,QAAQ,OAAO;AACjE,MAAI,CAAC,YAAa,QAAO;AACzB,SAAO,YAAY,cAAc,QAAQ,eAAe,YAAY,WAAW,QAAQ,QAAQ;AAC7F,QAAI,GAAG;AAAA,MACL;AAAA,MACA;AAAA,IACF;AACA,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,OAAQ,QAAO;AACpB,kBAAc,EAAE,GAAG,aAAa,OAAO;AAAA,EACzC;AACA,QAAM,SAAS;AACf,QAAM,aAAa,MAAM,oBAAoB,QAAQ,gBAAgB,MAAM;AAC3E,MAAI,WAAW,SAAS,MAAO,OAAM,IAAI,MAAM,2CAA2C;AAC1F,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,MACE,eAAe,iBAAiB,QAAQ,SAAS,CAAC;AAAA,MAClD,uBAAuB,iBAAiB,QAAQ,cAAc,CAAC;AAAA,MAC/D,WAAW,iBAAiB,WAAW,MAAM,CAAC;AAAA,MAC9C,WAAW,iBAAiB,QAAQ,UAAU,SAAS,CAAC,WAAM,iBAAiB,OAAO,MAAM,CAAC;AAAA,MAC7F,iBAAiB,iBAAiB,QAAQ,WAAW,CAAC,WAAM,iBAAiB,OAAO,SAAS,CAAC;AAAA,MAC9F;AAAA,IACF;AAAA,IACA;AAAA,IACA,CAAC,eACC;AAAA,MACE,QAAQ;AAAA,MACR,CAAC,UAAU;AACT,YAAI,OAAO,MAAM,QAAQ,WAAW,SAAU,OAAM,IAAI,MAAM,6CAA6C;AAC3G,eAAO;AAAA,UACL,GAAG;AAAA,UACH,SAAS,EAAE,GAAG,MAAM,SAAS,QAAQ,OAAO,QAAQ,MAAM,OAAO,UAAU;AAAA,QAC7E;AAAA,MACF;AAAA,MACA,EAAE,iBAAiB,SAAS,oBAAoB,YAAY,QAAQ,WAAW;AAAA,IACjF;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,CAAC,QAAQ,QAAS,KAAI,GAAG,OAAO,0BAAqB,iBAAiB,QAAQ,SAAS,CAAC,WAAM,MAAM;AACjH,SAAO;AACT;AAEA,eAAe,gBAAgB,KAA8B,QAAsB,SAAkB;AACnG,QAAM,QACJ;AACF,QAAM,WAAW,CAAC,UAAkB;AAClC,UAAM,SAAS,mBAAmB,KAAK;AACvC,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,6BAA6B;AAC1D,WAAO;AAAA,EACT;AACA,SAAO,UACH,cAAc,KAAK,OAAO,SAAS,QAAQ,QAAQ,IACnD;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACN;AAEA,eAAe,qBACb,KACA,QACA,UAAkC,CAAC,GACnC;AACA,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA,QAAQ,UAAU;AAAA,IAClB;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,YAAY,MAAM;AAAA,IACtB;AAAA,IACA;AAAA,IACA,QAAQ,eAAe;AAAA,IACvB;AAAA,IACA;AAAA,EACF;AACA,SAAO,YAAY,EAAE,QAAQ,UAAU,IAAI;AAC7C;;;ACtQA;AAAA,EACE;AAAA,EACA;AAAA,EAEA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,wBAAwB,4BAA4B;AAE7D,IAAM,OAAO;AAEb,eAAsB,aACpB,KACA,OACA,UAAwD,EAAE,UAAU,KAAK,GACzE;AACA,MAAI,IAAI,SAAS,SAAS,QAAQ,QAAQ,QAAS,QAAO;AAC1D,QAAM,SAAS,MAAM,qBAAyC,KAAK;AAAA,IACjE,QAAQ,QAAQ;AAAA,IAChB,WAAW,MAAM,CAAC,QAAQ,QAAQ;AAAA,IAClC,QAAQ,CAAC,EAAE,KAAK,OAAO,aAAa,SAAS,MAAM;AACjD,YAAM,UAAU,IAAI,KAAK,IAAI,GAAG,CAAC;AACjC,YAAM,OAAO,IAAI,KAAK,IAAI,GAAG,CAAC;AAC9B,YAAM,kBAAkB,uBAAuB,aAAa;AAAA,QAC1D;AAAA,UACE,MAAM,YAAY,QAAQ,kBAAkB,EAAE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,GAAG,CAAC;AAAA,UACvF,OAAO;AAAA,QACT;AAAA,QACA;AAAA,UACE,MAAM,CAAC,GAAG,YAAY,QAAQ,mBAAmB,EAAE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,GAAG,CAAC,GAAG,QAAQ;AAAA,UACvG,OAAO;AAAA,QACT;AAAA,MACF,CAAC;AACD,YAAM,aAAa,MAAM;AACvB,gBAAQ,QAAQ,MAAM,GAAG,UAAU,MAAM,KAAK,KAAK,CAAC,CAAC;AACrD,aAAK,QAAQ,MAAM,GAAG,OAAO,GAAG,eAAe,yBAAoB,CAAC;AAAA,MACtE;AACA,iBAAW;AACX,YAAM,QAAQ,IAAI,YAAY,WAAW;AACzC,YAAM,YAKF;AAAA,QACF,IAAI,UAAU;AACZ,iBAAO,MAAM;AAAA,QACf;AAAA,QACA,IAAI,QAAQ,SAAkB;AAC5B,gBAAM,UAAU;AAAA,QAClB;AAAA,QACA,OAAO,OAAe;AACpB,gBAAM,YAAY,KAAK,IAAI,GAAG,KAAK;AACnC,iBAAO,CAAC,GAAG,QAAQ,OAAO,SAAS,GAAG,GAAG,MAAM,OAAO,SAAS,GAAG,GAAG,KAAK,OAAO,SAAS,CAAC,EAAE;AAAA,YAAI,CAAC,SAChG,gBAAgB,MAAM,SAAS;AAAA,UACjC;AAAA,QACF;AAAA,QACA,aAAa;AACX,qBAAW;AACX,kBAAQ,WAAW;AACnB,gBAAM,WAAW;AACjB,eAAK,WAAW;AAAA,QAClB;AAAA,QACA,YAAY,MAAc;AACxB,cAAI,WAAW,MAAM,IAAI,KAAK,GAAG,CAAC,GAAG;AACnC,qBAAS,MAAS;AAAA,UACpB,WAAW,MAAM,aAAa,KAAK,SAAS,WAAa,GAAG;AAC1D,kBAAM,YAAY,IAAI;AAAA,UACxB,WAAW,YAAY,QAAQ,MAAM,mBAAmB,GAAG;AACzD,qBAAS,MAAS;AAAA,UACpB,WAAW,YAAY,QAAQ,MAAM,kBAAkB,GAAG;AACxD,gBAAI,QAAQ,aAAa,SAAS,MAAM,SAAS,EAAE,WAAW,GAAG;AAC/D,kBAAI,GAAG,OAAO,GAAG,KAAK,2CAA2C,SAAS;AAAA,YAC5E,WAAW,oBAAoB,MAAM,SAAS,CAAC,GAAG;AAChD,kBAAI,GAAG;AAAA,gBACL,GAAG,KAAK;AAAA,gBACR;AAAA,cACF;AAAA,YACF,MAAO,UAAS,MAAM,SAAS,CAAC;AAAA,UAClC,MAAO,OAAM,YAAY,IAAI;AAC7B,cAAI,cAAc;AAAA,QACpB;AAAA,QACA,UAAU;AACR,gBAAM,MAAM;AAAA,QACd;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACD,MAAI,OAAO,SAAS,QAAS,OAAM,OAAO;AAC1C,MAAI,OAAO,SAAS,eAAe,OAAO,UAAU,OAAW,QAAO;AACtE,QAAM,QAAQ,OAAO;AACrB,MAAI,QAAQ,aAAa,SAAS,MAAM,WAAW,GAAG;AACpD,QAAI,GAAG,OAAO,GAAG,KAAK,iBAAiB,SAAS;AAChD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,IAAM,cAAN,MAAuC;AAAA,EAOrC,YAA6B,aAAiC;AAAjC;AAAA,EAAkC;AAAA,EAAlC;AAAA,EAN7B,UAAU;AAAA,EACF,QAAkB,CAAC;AAAA,EACnB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EAIlB,IAAI,YAAY;AACd,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,WAAW;AACT,WAAO,KAAK,MAAM,KAAK,EAAE;AAAA,EAC3B;AAAA,EAEA,YAAY,MAAc;AACxB,QAAI,KAAK,SAAS,WAAa,GAAG;AAChC,WAAK,UAAU;AACf,WAAK,QAAQ;AACb,aAAO,KAAK,QAAQ,aAAe,EAAE;AAAA,IACvC;AACA,QAAI,KAAK,SAAS;AAChB,WAAK,SAAS;AACd,YAAM,MAAM,KAAK,MAAM,QAAQ,WAAa;AAC5C,UAAI,MAAM,EAAG;AACb,YAAM,SAAS,KAAK,MACjB,MAAM,GAAG,GAAG,EACZ,QAAQ,YAAY,EAAE,EACtB,QAAQ,QAAQ,MAAM;AACzB,WAAK,OAAO,MAAM;AAClB,YAAM,YAAY,KAAK,MAAM,MAAM,MAAM,CAAC;AAC1C,WAAK,QAAQ;AACb,WAAK,UAAU;AACf,UAAI,UAAW,MAAK,YAAY,SAAS;AACzC;AAAA,IACF;AACA,QAAI,KAAK,YAAY,QAAQ,MAAM,+BAA+B,GAAG;AACnE,UAAI,KAAK,SAAS,EAAG,MAAK,MAAM,OAAO,EAAE,KAAK,QAAQ,CAAC;AACvD;AAAA,IACF;AACA,QAAI,KAAK,YAAY,QAAQ,MAAM,8BAA8B,GAAG;AAClE,UAAI,KAAK,SAAS,KAAK,MAAM,OAAQ,MAAK,MAAM,OAAO,KAAK,QAAQ,CAAC;AACrE;AAAA,IACF;AACA,QAAI,KAAK,YAAY,QAAQ,MAAM,uBAAuB,GAAG;AAC3D,WAAK,SAAS,KAAK,IAAI,GAAG,KAAK,SAAS,CAAC;AACzC;AAAA,IACF;AACA,QAAI,KAAK,YAAY,QAAQ,MAAM,wBAAwB,GAAG;AAC5D,WAAK,SAAS,KAAK,IAAI,KAAK,MAAM,QAAQ,KAAK,SAAS,CAAC;AACzD;AAAA,IACF;AACA,QAAI,KAAK,YAAY,QAAQ,MAAM,4BAA4B,GAAG;AAChE,WAAK,SAAS;AACd;AAAA,IACF;AACA,QAAI,KAAK,YAAY,QAAQ,MAAM,0BAA0B,GAAG;AAC9D,WAAK,SAAS,KAAK,MAAM;AACzB;AAAA,IACF;AACA,QAAI,KAAK,YAAY,QAAQ,MAAM,8BAA8B,GAAG;AAClE,WAAK,MAAM,OAAO,GAAG,KAAK,MAAM;AAChC,WAAK,SAAS;AACd;AAAA,IACF;AACA,QAAI,KAAK,YAAY,QAAQ,MAAM,4BAA4B,GAAG;AAChE,WAAK,MAAM,OAAO,KAAK,MAAM;AAC7B;AAAA,IACF;AACA,UAAM,YAAY,qBAAqB,IAAI,KAAK;AAChD,QAAI,CAAC,oBAAoB,SAAS,EAAG,MAAK,OAAO,SAAS;AAAA,EAC5D;AAAA,EAEA,OAAO,OAAe;AACpB,UAAM,SAAS;AACf,UAAM,YAAY,QAAQ,OAAO;AACjC,QAAI,aAAa,EAAG,QAAO,CAAC,gBAAgB,QAAQ,KAAK,IAAI,GAAG,KAAK,CAAC,CAAC;AACvE,UAAM,eAAe,KAAK,IAAI,GAAG,YAAY,CAAC;AAC9C,QAAI,QAAQ;AACZ,QAAI,KAAK,MAAM,SAAS,cAAc;AACpC,cAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,SAAS,KAAK,MAAM,eAAe,CAAC,GAAG,KAAK,MAAM,SAAS,YAAY,CAAC;AAAA,IAC5G;AACA,UAAM,MAAM,KAAK,IAAI,KAAK,MAAM,QAAQ,QAAQ,YAAY;AAC5D,UAAM,gBAAgB,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,SAAS,OAAO,MAAM,KAAK,CAAC;AAC5E,UAAM,QAAQ,MAAM,KAAK,EAAE,QAAQ,MAAM,MAAM,GAAG,MAAM,IAAI;AAC5D,UAAM,SAAS,MAAM,MAAM,GAAG,aAAa,EAAE,KAAK,EAAE;AACpD,UAAM,WAAW,gBAAgB,MAAM,SAAS,OAAO;AACvD,UAAM,QAAQ,MAAM,MAAM,iBAAiB,gBAAgB,MAAM,SAAS,IAAI,EAAE,EAAE,KAAK,EAAE;AACzF,UAAM,SAAS,KAAK,UAAU,gBAAgB;AAC9C,UAAM,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,UAAY,QAAQ,WAAa,KAAK;AAC9E,WAAO,CAAC,gBAAgB,MAAM,OAAO,EAAE,CAAC;AAAA,EAC1C;AAAA,EAEA,aAAa;AAAA,EAAC;AAAA,EAEd,QAAQ;AACN,SAAK,MAAM,KAAK,EAAE;AAClB,SAAK,QAAQ,CAAC;AACd,SAAK,QAAQ;AACb,SAAK,SAAS;AACd,SAAK,UAAU;AAAA,EACjB;AAAA,EAEQ,OAAO,OAAe;AAC5B,UAAM,aAAa,MAAM,KAAK,KAAK;AACnC,SAAK,MAAM,OAAO,KAAK,QAAQ,GAAG,GAAG,UAAU;AAC/C,SAAK,UAAU,WAAW;AAAA,EAC5B;AACF;AAEA,SAAS,oBAAoB,OAAe;AAC1C,SAAO,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,cAAc;AACpC,UAAM,OAAO,UAAU,YAAY,CAAC,KAAK;AACzC,WAAO,OAAO,MAAS,QAAQ,OAAQ,QAAQ;AAAA,EACjD,CAAC;AACH;;;ACjNA,eAAsB,yBACpB,KACA,SACA,QACA;AACA,QAAM,YACJ,OAAO,QAAQ,gBAAgB,YAC/B,QAAQ,YAAY,SAAS,KAC7B,OAAO,QAAQ,oBAAoB,YACnC,QAAQ,gBAAgB,SAAS;AACnC,MAAI,WAAW;AACb,UAAM,SAAS,MAAM,IAAI,GAAG,OAAO,eAAe,CAAC,4BAA4B,uBAAuB,QAAQ,GAAG;AAAA,MAC/G;AAAA,IACF,CAAC;AACD,mBAAe,MAAM;AACrB,QAAI,CAAC,UAAU,WAAW,SAAU,QAAO;AAC3C,QAAI,WAAW,4BAA4B;AACzC,aAAO,EAAE,eAAe,CAAC,GAAG,SAAS,6BAA6B,OAAO,KAAK;AAAA,IAChF;AAAA,EACF;AACA,QAAM,WAAW,MAAM,oBAAoB,KAAK,MAAM;AACtD,SAAO,WAAW,EAAE,GAAG,UAAU,SAAS,KAAK,IAAI;AACrD;AAEO,SAAS,wBAAwB,SAAkC,aAAkC;AAC1G,QAAM,OAAO,EAAE,GAAG,QAAQ;AAC1B,MAAI,YAAY,SAAS;AACvB,WAAO,KAAK;AACZ,WAAO,KAAK;AACZ,WAAO,KAAK;AAAA,EACd;AACA,SAAO,EAAE,GAAG,MAAM,GAAG,YAAY,cAAc;AACjD;AAEA,eAAsB,oBACpB,KACA,QAC0C;AAC1C,QAAM,SAAS,MAAM,IAAI,GAAG;AAAA,IAC1B;AAAA,IACA,CAAC,+BAA+B,QAAQ;AAAA,IACxC,EAAE,OAAO;AAAA,EACX;AACA,iBAAe,MAAM;AACrB,MAAI,WAAW,8BAA+B,QAAO;AACrD,QAAM,cAAc,MAAM;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,YAAa,QAAO;AACzB,QAAM,kBAAkB,MAAM,aAAa,KAAK,qBAAqB,EAAE,OAAO,CAAC;AAC/E,iBAAe,MAAM;AACrB,MAAI,oBAAoB,OAAW,QAAO;AAC1C,SAAO;AAAA,IACL,eAAe,EAAE,aAAa,gBAAgB;AAAA,IAC9C,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AACF;AAEA,SAAS,eAAe,QAAsB;AAC5C,MAAI,CAAC,QAAQ,QAAS;AACtB,QAAM,OAAO,kBAAkB,QAAQ,OAAO,SAAS,IAAI,aAAa,6BAA6B,YAAY;AACnH;;;ACrDA,eAAsB,YACpB,KACA,QACA,YACA,QACA;AACA,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA,WAAW,kBACP,mGACA;AAAA,IACJ,WAAW,kBAAkB,kDAAkD;AAAA,IAC/E;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,SACJ,WAAW,kBACP,SACA,MAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACN,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,WAAW,MAAM,4BAA4B,KAAK,QAAQ,YAAY,MAAM;AAClF,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,cAAc,MAAM,oBAAoB,KAAK,MAAM;AACzD,MAAI,CAAC,YAAa,QAAO;AACzB,QAAM,UAAU,MAAM,mBAAmB,KAAK,MAAM;AACpD,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,YAAY,MAAM,oBAAoB,KAAK,MAAM;AACvD,MAAI,cAAc,OAAW,QAAO;AACpC,QAAM,WAAW,MAAM,eAAe,KAAK,MAAM;AACjD,MAAI,aAAa,OAAW,QAAO;AACnC,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,MACE,eAAe,iBAAiB,UAAU,CAAC;AAAA,MAC3C,uBAAuB,iBAAiB,SAAS,cAAc,CAAC,KAAK,MAAM;AAAA,MAC3E,aAAa,iBAAiB,QAAQ,CAAC;AAAA,MACvC,WAAW,iBAAiB,MAAM,CAAC;AAAA,MACnC,WAAW,iBAAiB,SAAS,MAAM,CAAC;AAAA,MAC5C,qBAAqB,iBAAiB,SAAS,IAAI,CAAC;AAAA,MACpD,GAAG,qBAAqB,SAAS,QAAQ;AAAA,MACzC,mBAAmB,qBAAqB,SAAS,CAAC;AAAA,MAClD,gBAAgB,YAAY,OAAO;AAAA,MACnC;AAAA,IACF;AAAA,IACA;AAAA,IACA,CAAC,eACC;AAAA,MACE;AAAA,QACE,WAAW;AAAA,QACX,gBAAgB,SAAS;AAAA,QACzB,YAAY;AAAA,UACV,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,aAAa;AAAA,YACX,aAAa,YAAY,cAAc,eAAe;AAAA,YACtD,iBAAiB,YAAY,cAAc,mBAAmB;AAAA,UAChE;AAAA,QACF;AAAA,QACA,OAAO;AAAA,UACL,SAAS;AAAA,YACP,YAAY,SAAS;AAAA,YACrB,QAAQ,SAAS;AAAA,YACjB,MAAM,SAAS;AAAA,UACjB;AAAA,UACA,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,GAAI,WAAW,CAAC,UAAU,IAAI,CAAC,CAAE,GAAG,UAAU;AAAA,QAC9E;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,SAAS,QAAQ,QAAS,QAAO;AACtC,QAAM,yBAAyB;AAC/B,MAAI,CAAC,QAAQ;AACX,QAAI,GAAG,OAAO,oBAAe,iBAAiB,UAAU,CAAC,2CAAsC,MAAM;AACvG,SAAO;AACT;AAEA,eAAsB,gBACpB,KACA,KACA,SACA,MACA,QACA;AACA,QAAM,WAAW,MAAM,+BAA+B,KAAK,KAAK,SAAS,MAAM,MAAM;AACrF,MAAI,CAAC,SAAU;AACf,QAAM,UAAU,MAAM,4BAA4B,KAAK,EAAE,YAAY,SAAS,GAAG,SAAS,GAAG,MAAM;AACnG,MAAI,CAAC,QAAS;AACd,QAAM,UAAU,MAAM,mBAAmB,KAAK,MAAM;AACpD,MAAI,CAAC,QAAS;AACd,QAAM,YAAY,MAAM,oBAAoB,KAAK,MAAM;AACvD,MAAI,cAAc,OAAW;AAC7B,QAAM,aAAa,MAAM,oBAAoB,SAAS,MAAM;AAC5D,MAAI,WAAW,SAAS,KAAM,OAAM,IAAI,MAAM,2CAA2C;AACzF,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,MACE,eAAe,iBAAiB,IAAI,CAAC;AAAA,MACrC,uBAAuB,iBAAiB,OAAO,CAAC;AAAA,MAChD,aAAa,iBAAiB,WAAW,QAAQ,CAAC;AAAA,MAClD,WAAW,iBAAiB,QAAQ,MAAM,CAAC;AAAA,MAC3C,qBAAqB,iBAAiB,QAAQ,IAAI,CAAC;AAAA,MACnD,GAAG,qBAAqB,OAAO;AAAA,MAC/B,mBAAmB,qBAAqB,SAAS,CAAC;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACA,CAAC,eAAe,aAAa,MAAM,EAAE,SAAS,MAAM,EAAE,SAAS,UAAU,EAAE,GAAG,YAAY,UAAU;AAAA,IACpG;AAAA,EACF;AACA,MAAI,CAAC,SAAS,QAAQ,QAAS;AAC/B,QAAM,yBAAyB;AAC/B,MAAI,CAAC,QAAQ,QAAS,KAAI,GAAG,OAAO,0BAAqB,iBAAiB,IAAI,CAAC,WAAM,MAAM;AAC7F;AAEA,eAAsB,iBAAiB,KAA8B,SAAwB,QAAsB;AACjH,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA,QAAQ,UAAU;AAAA,IAClB;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,OAAQ;AACb,QAAM,cAAc,MAAM;AAAA,IACxB;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,YAAa;AAClB,QAAM,aAAa,MAAM,oBAAoB,QAAQ,gBAAgB,MAAM;AAC3E,MAAI,WAAW,SAAS,KAAM,OAAM,IAAI,MAAM,2CAA2C;AACzF,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,MACE,eAAe,iBAAiB,QAAQ,SAAS,CAAC;AAAA,MAClD,uBAAuB,iBAAiB,QAAQ,cAAc,CAAC;AAAA,MAC/D,aAAa,iBAAiB,WAAW,QAAQ,CAAC;AAAA,MAClD,WAAW,iBAAiB,QAAQ,UAAU,SAAS,CAAC,WAAM,iBAAiB,MAAM,CAAC;AAAA,MACtF,iBAAiB,iBAAiB,QAAQ,WAAW,CAAC,WAAM,iBAAiB,WAAW,CAAC;AAAA,MACzF;AAAA,IACF;AAAA,IACA;AAAA,IACA,CAAC,eACC;AAAA,MACE,QAAQ;AAAA,MACR,CAAC,UAAU;AACT,YAAI,OAAO,MAAM,QAAQ,WAAW,SAAU,OAAM,IAAI,MAAM,6CAA6C;AAC3G,eAAO,EAAE,GAAG,OAAO,SAAS,EAAE,GAAG,MAAM,SAAS,QAAQ,MAAM,YAAY,EAAE;AAAA,MAC9E;AAAA,MACA,EAAE,iBAAiB,SAAS,oBAAoB,YAAY,QAAQ,WAAW;AAAA,IACjF;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,CAAC,QAAQ,QAAS,KAAI,GAAG,OAAO,0BAAqB,iBAAiB,QAAQ,SAAS,CAAC,WAAM,MAAM;AACnH;;;ACnKA,eAAsB,gBAAgB,KAA8B,YAAoB,QAAsB;AAC5G,QAAM,MAAM,MAAM,gBAAgB,KAAK,MAAM;AAC7C,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,WAAW,MAAM,eAAe,KAAK,MAAM;AACjD,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,WAAW,MAAM,aAAa,KAAK,mBAAmB,EAAE,OAAO,CAAC;AACtE,UAAQ,eAAe;AACvB,MAAI,aAAa,OAAW,QAAO;AACnC,QAAM,aAAa,MAAM,kBAAkB,KAAK,MAAM;AACtD,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,UAAU,MAAM,mBAAmB,KAAK,MAAM;AACpD,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,YAAY,MAAM,oBAAoB,KAAK,MAAM;AACvD,MAAI,cAAc,OAAW,QAAO;AACpC,QAAM,WAAW,MAAM,eAAe,KAAK,MAAM;AACjD,MAAI,aAAa,OAAW,QAAO;AACnC,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,MACE,eAAe,iBAAK,UAAU,CAAC;AAAA,MAC/B,uBAAuB,iBAAK,UAAU,CAAC;AAAA,MACvC,QAAQ,iBAAK,GAAG,CAAC;AAAA,MACjB,qBAAqB,iBAAK,UAAU,CAAC;AAAA,MACrC;AAAA,MACA,GAAG,qBAAqB,SAAS,QAAQ;AAAA,MACzC,mBAAmB,qBAAqB,SAAS,CAAC;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACA,CAAC,eACC;AAAA,MACE;AAAA,QACE,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,YAAY,EAAE,MAAM,UAAU,KAAK,aAAa,EAAE,UAAU,SAAS,EAAE;AAAA,QACvE,OAAO;AAAA,UACL,SAAS,EAAE,YAAY,YAAY,MAAM,WAAW;AAAA,UACpD,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,GAAI,WAAW,CAAC,UAAU,IAAI,CAAC,CAAE,GAAG,UAAU;AAAA,QAC9E;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,CAAC,QAAQ;AACpB,QAAI,GAAG,OAAO,oBAAe,iBAAK,UAAU,CAAC,2CAAsC,MAAM;AAC3F,SAAO;AACT;AAEA,eAAsB,oBACpB,KACA,MACA,SACA,QACA;AACA,QAAM,aAAa,MAAM,kBAAkB,KAAK,MAAM;AACtD,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,UAAU,MAAM,4BAA4B,KAAK,EAAE,YAAY,SAAS,MAAM,WAAW,GAAG,MAAM;AACxG,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,UAAU,MAAM,mBAAmB,KAAK,MAAM;AACpD,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,YAAY,MAAM,oBAAoB,KAAK,MAAM;AACvD,MAAI,cAAc,OAAW,QAAO;AACpC,QAAM,aAAa,MAAM,oBAAoB,SAAS,MAAM;AAC5D,MAAI,WAAW,SAAS,SAAU,OAAM,IAAI,MAAM,2CAA2C;AAC7F,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,MACE,eAAe,iBAAK,IAAI,CAAC;AAAA,MACzB,uBAAuB,iBAAK,OAAO,CAAC;AAAA,MACpC,QAAQ,iBAAK,WAAW,GAAG,CAAC;AAAA,MAC5B,qBAAqB,iBAAK,QAAQ,IAAI,CAAC;AAAA,MACvC,GAAG,qBAAqB,OAAO;AAAA,MAC/B,mBAAmB,qBAAqB,SAAS,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,IACA;AAAA,IACA,CAAC,eAAe,aAAa,MAAM,EAAE,SAAS,MAAM,EAAE,SAAS,UAAU,EAAE,GAAG,YAAY,UAAU;AAAA,IACpG;AAAA,EACF;AACA,MAAI,SAAS,CAAC,QAAQ,QAAS,KAAI,GAAG,OAAO,0BAAqB,iBAAK,IAAI,CAAC,WAAM,MAAM;AACxF,SAAO;AACT;AAEA,eAAsB,qBAAqB,KAA8B,SAAwB,QAAsB;AACrH,QAAM,aAAa,MAAM,kBAAkB,KAAK,QAAQ,QAAQ,WAAW;AAC3E,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,aAAa,MAAM,oBAAoB,QAAQ,gBAAgB,MAAM;AAC3E,MAAI,WAAW,SAAS,SAAU,OAAM,IAAI,MAAM,2CAA2C;AAC7F,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,MACE,eAAe,iBAAK,QAAQ,SAAS,CAAC;AAAA,MACtC,uBAAuB,iBAAK,QAAQ,cAAc,CAAC;AAAA,MACnD,QAAQ,iBAAK,WAAW,GAAG,CAAC;AAAA,MAC5B,iBAAiB,iBAAK,QAAQ,WAAW,CAAC,WAAM,iBAAK,UAAU,CAAC;AAAA,MAChE;AAAA,IACF;AAAA,IACA;AAAA,IACA,CAAC,eACC;AAAA,MACE,QAAQ;AAAA,MACR,CAAC,WAAW;AAAA,QACV,GAAG;AAAA,QACH,SAAS,EAAE,GAAG,MAAM,SAAS,MAAM,WAAW;AAAA,MAChD;AAAA,MACA,EAAE,iBAAiB,SAAS,oBAAoB,YAAY,QAAQ,WAAW;AAAA,IACjF;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,CAAC,QAAQ,QAAS,KAAI,GAAG,OAAO,0BAAqB,iBAAK,QAAQ,SAAS,CAAC,WAAM,MAAM;AACrG,SAAO;AACT;AAEA,eAAsB,4BAA4B,KAA8B,QAAsB;AACpG,QAAM,OAAO,MAAM,mBAAmB,KAAK,sBAAsB,UAAU,QAAQ,IAAI;AACvF,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,MAAM,MAAM,gBAAgB,KAAK,MAAM;AAC7C,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,WAAW,MAAM,eAAe,KAAK,MAAM;AACjD,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,WAAW,MAAM,aAAa,KAAK,mBAAmB,EAAE,OAAO,CAAC;AACtE,UAAQ,eAAe;AACvB,MAAI,aAAa,OAAW,QAAO;AACnC,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAAS,iBAAK,IAAI,CAAC;AAAA,MACnB;AAAA,MACA,QAAQ,iBAAK,GAAG,CAAC;AAAA,MACjB;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACA,CAAC,eACC,qBAAqB,MAAM,EAAE,MAAM,UAAU,KAAK,aAAa,EAAE,UAAU,SAAS,EAAE,GAAG,UAAU;AAAA,IACrG;AAAA,EACF;AACA,MAAI,SAAS,CAAC,QAAQ,QAAS,KAAI,GAAG,OAAO,kCAA6B,iBAAK,IAAI,CAAC,WAAM,MAAM;AAChG,SAAO;AACT;AAEA,eAAsB,6BACpB,KACA,MACA,SACA,QACA,gBACA;AACA,QAAM,MAAM,MAAM,gBAAgB,KAAK,QAAQ,OAAO,QAAQ,QAAQ,WAAW,QAAQ,MAAM,MAAS;AACxG,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,WAAW,MAAM,eAAe,KAAK,MAAM;AACjD,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,cAAc,OAAO,QAAQ,aAAa,YAAY,QAAQ,SAAS,SAAS;AACtF,QAAM,iBAAiB,cACnB,MAAM,OAAO,KAAK,mBAAmB,CAAC,yBAAyB,oBAAoB,QAAQ,GAAG,MAAM,IACpG;AACJ,MAAI,CAAC,kBAAkB,mBAAmB,SAAU,QAAO;AAC3D,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,WAAW,kBAAkB,MAAM,aAAa,KAAK,uBAAuB,EAAE,OAAO,CAAC,IAAI;AAChG,UAAQ,eAAe;AACvB,MAAI,mBAAmB,aAAa,OAAW,QAAO;AACtD,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,MACE,uBAAuB,iBAAK,IAAI,CAAC;AAAA,MACjC,QAAQ,iBAAK,OAAO,QAAQ,GAAG,CAAC,CAAC,WAAM,iBAAK,GAAG,CAAC;AAAA,MAChD;AAAA,MACA,aAAa,kBAAkB,qBAAqB,WAAW;AAAA,MAC/D,yBAAyB,gBAAgB,SAAS,eAAe,IAAI,gBAAI,EAAE,KAAK,IAAI,IAAI,MAAM;AAAA,MAC9F;AAAA,IACF;AAAA,IACA;AAAA,IACA,CAAC,eACC;AAAA,MACE;AAAA,MACA,CAAC,YAAY;AACX,YACE,QAAQ,SAAS,YACjB,QAAQ,QAAQ,QAAQ,OACxB,QAAQ,YAAY,aAAa,QAAQ,YACzC,QAAQ,YAAY,aAAa,QAAQ;AAEzC,gBAAM,IAAI,MAAM,0DAA0D;AAC5E,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,UACA,aAAa;AAAA,YACX,GAAG,QAAQ;AAAA,YACX;AAAA,YACA,UAAU,YAAY,QAAQ,YAAY;AAAA,UAC5C;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,CAAC,QAAQ,QAAS,KAAI,GAAG,OAAO,kCAA6B,iBAAK,IAAI,CAAC,WAAM,MAAM;AAChG,SAAO;AACT;AAEA,eAAe,kBAAkB,KAA8B,QAAsB,UAAU,MAAM;AACnG,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,cAAc,SAAS,UAAU,oBAAoB;AAAA,IACvD;AAAA,EACF;AACF;AAEA,eAAe,eAAe,KAA8B,QAAsB;AAChF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,UAAU,CAAC,UAAU;AACnB,kCAA0B,KAAK;AAC/B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,gBAAgB,KAA8B,QAAsB,SAAkB;AACnG,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,GAAI,UAAU,EAAE,cAAc,QAAQ,IAAI,EAAE,SAAS,sDAAsD;AAAA,MAC3G,UAAU,CAAC,UAAU;AACnB,cAAM,MAAM,mBAAmB,KAAK;AACpC,YAAI,CAAC,IAAK,OAAM,IAAI,MAAM,yBAAyB;AACnD,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,OAAO,KAA8B,OAAe,SAAmB,QAAsB;AAC1G,QAAM,QAAQ,MAAM,IAAI,GAAG,OAAO,OAAO,SAAS,EAAE,OAAO,CAAC;AAC5D,UAAQ,eAAe;AACvB,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/backends/sync-backend.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Snapshot, SnapshotSelection } from \"../snapshot/snapshot-types.js\";\n\nexport type PublicationCapability =\n | \"read-check-write-verify\"\n | \"conditional-required\"\n | \"atomic-conditional\"\n | \"lease-protected\";\n\nexport interface RemoteHead {\n /** Backend-owned reference used only to retrieve this immutable snapshot. */\n snapshotRef: string;\n /** Backend-neutral snapshot content identity retained in local sync state. */\n snapshotId: string;\n revision: string;\n createdAt: string;\n machine: string;\n syncSessions: boolean;\n /** Validated lightweight projection; revalidate it against the immutable snapshot before adoption. */\n selection?: SnapshotSelection;\n}\n\nexport interface RemoteHistoryEntry {\n snapshotRef: string;\n snapshotId: string;\n createdAt: string;\n machine: string;\n syncSessions: boolean;\n}\n\nexport type ExpectedRemoteHead = { kind: \"missing\" } | { kind: \"revision\"; revision: string };\n\nexport interface PublishSnapshotOptions {\n signal?: AbortSignal;\n /** Called at the backend's active-head commit boundary. */\n onCommit?: () => void;\n}\n\nexport interface PublishSnapshotResult {\n head: RemoteHead;\n warnings: string[];\n}\n\nexport interface BackendDiagnostic {\n key: string;\n level: \"info\" | \"warning\" | \"error\";\n message: string;\n}\n\nexport interface SyncBackend {\n readonly identity: string;\n readonly destination: string;\n readonly capability: PublicationCapability;\n /** Compare opaque revisions produced by this backend identity. */\n sameRevision(left: string, right: string): boolean;\n readHead(signal?: AbortSignal): Promise<RemoteHead | undefined>;\n readSnapshot(reference: string, signal?: AbortSignal): Promise<Snapshot>;\n publishSnapshot(\n snapshot: Snapshot,\n expected: ExpectedRemoteHead,\n options?: PublishSnapshotOptions,\n ): Promise<PublishSnapshotResult>;\n listHistory(signal?: AbortSignal): Promise<RemoteHistoryEntry[]>;\n diagnose(signal?: AbortSignal): Promise<BackendDiagnostic[]>;\n}\n\nexport class SyncBackendConflictError extends Error {\n readonly code = \"SYNC_BACKEND_CONFLICT\";\n readonly phase: \"before-commit\" | \"after-commit\";\n readonly currentHead?: RemoteHead;\n readonly candidateMayHaveBeenActive: boolean;\n\n constructor(\n message: string,\n options: ErrorOptions & {\n phase?: \"before-commit\" | \"after-commit\";\n currentHead?: RemoteHead;\n candidateMayHaveBeenActive?: boolean;\n } = {},\n ) {\n super(message, options);\n this.name = \"SyncBackendConflictError\";\n this.phase = options.phase ?? \"before-commit\";\n this.currentHead = options.currentHead;\n this.candidateMayHaveBeenActive = options.candidateMayHaveBeenActive ?? false;\n }\n}\n\nexport class SyncBackendPublicationOutcomeUnknownError extends Error {\n readonly code = \"SYNC_BACKEND_PUBLICATION_OUTCOME_UNKNOWN\";\n\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"SyncBackendPublicationOutcomeUnknownError\";\n }\n}\n\nexport function expectedRemoteHead(head: RemoteHead | undefined): ExpectedRemoteHead {\n return head ? { kind: \"revision\", revision: head.revision } : { kind: \"missing\" };\n}\n"],
|
|
5
|
+
"mappings": ";;;;AAiEO,IAAM,2BAAN,cAAuC,MAAM;AAAA,EACzC,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EAET,YACE,SACA,UAII,CAAC,GACL;AACA,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO;AACZ,SAAK,QAAQ,QAAQ,SAAS;AAC9B,SAAK,cAAc,QAAQ;AAC3B,SAAK,6BAA6B,QAAQ,8BAA8B;AAAA,EAC1E;AACF;AAEO,IAAM,4CAAN,cAAwD,MAAM;AAAA,EAC1D,OAAO;AAAA,EAEhB,YAAY,SAAiB,SAAwB;AACnD,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO;AAAA,EACd;AACF;AAEO,SAAS,mBAAmB,MAAkD;AACnF,SAAO,OAAO,EAAE,MAAM,YAAY,UAAU,KAAK,SAAS,IAAI,EAAE,MAAM,UAAU;AAClF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -23,9 +23,11 @@ var SYNC_COMMANDS = [
|
|
|
23
23
|
{ name: "migrate-state", description: "Move legacy state into pi-sync/" },
|
|
24
24
|
{ name: "unlock", description: "Remove a stale local lock", usageSuffix: " --stale" }
|
|
25
25
|
];
|
|
26
|
-
var SYNC_COMMAND_COMPLETIONS = SYNC_COMMANDS.map(
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
var SYNC_COMMAND_COMPLETIONS = SYNC_COMMANDS.map(({ name, description }) => ({
|
|
27
|
+
value: name,
|
|
28
|
+
label: name,
|
|
29
|
+
description
|
|
30
|
+
}));
|
|
29
31
|
var setupCompletionNames = [];
|
|
30
32
|
function setSyncSetupCompletions(names) {
|
|
31
33
|
setupCompletionNames = [...new Set(names)].sort((left, right) => left.localeCompare(right));
|
|
@@ -123,8 +125,7 @@ function validateCommandOptions(command, options) {
|
|
|
123
125
|
}
|
|
124
126
|
const expectedValues = command === "rollback" || command === "use" ? 1 : 0;
|
|
125
127
|
if (options.args.length !== expectedValues) {
|
|
126
|
-
if (command === "rollback")
|
|
127
|
-
throw new Error("Usage: /sync rollback <snapshot-id> [--yes] [--setup <name>]");
|
|
128
|
+
if (command === "rollback") throw new Error("Usage: /sync rollback <snapshot-id> [--yes] [--setup <name>]");
|
|
128
129
|
if (command === "use") throw new Error("Usage: /sync use <setup>");
|
|
129
130
|
throw new Error(`Unexpected argument for /sync ${command}: ${options.args.join(" ")}`);
|
|
130
131
|
}
|
|
@@ -219,4 +220,4 @@ export {
|
|
|
219
220
|
resolveSyncCommand,
|
|
220
221
|
usage
|
|
221
222
|
};
|
|
222
|
-
//# sourceMappingURL=chunk-
|
|
223
|
+
//# sourceMappingURL=chunk-YFADF5ZQ.ts.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/commands/command.ts"],
|
|
4
|
+
"sourcesContent": ["import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport type { CommandArgumentCompletion, CommandOptions } from \"./command-types.js\";\n\nconst YES_FLAG_COMPLETIONS: readonly CommandArgumentCompletion[] = [\n { value: \"--yes\", label: \"--yes\", description: \"Skip confirmation prompts\" },\n { value: \"-y\", label: \"-y\", description: \"Skip confirmation prompts\" },\n];\nexport const SYNC_COMMANDS = [\n { name: \"help\", description: \"Show command usage\" },\n { name: \"use\", description: \"Switch the current sync setup\", usageSuffix: \" <setup>\" },\n { name: \"init\", description: \"Create local config template\" },\n { name: \"config\", description: \"Show resolved configuration\" },\n { name: \"files\", description: \"Choose included content\" },\n { name: \"status\", description: \"Show sync status\" },\n { name: \"diff\", description: \"Show local/remote diff\" },\n { name: \"doctor\", description: \"Check config, secrets, and lock state\" },\n { name: \"push\", description: \"Upload local settings\" },\n { name: \"pull\", description: \"Apply remote settings\" },\n { name: \"sync\", description: \"Push or pull as needed\" },\n { name: \"history\", description: \"Show recent remote snapshots\" },\n { name: \"rollback\", description: \"Apply a previous snapshot\", usageSuffix: \" <snapshot>\" },\n { name: \"migrate-state\", description: \"Move legacy state into pi-sync/\" },\n { name: \"unlock\", description: \"Remove a stale local lock\", usageSuffix: \" --stale\" },\n] as const;\n\nexport type SyncCommandName = (typeof SYNC_COMMANDS)[number][\"name\"];\n\nconst SYNC_COMMAND_COMPLETIONS: readonly CommandArgumentCompletion[] = SYNC_COMMANDS.map(({ name, description }) => ({\n value: name,\n label: name,\n description,\n}));\nlet setupCompletionNames: string[] = [];\n\nexport function setSyncSetupCompletions(names: readonly string[]) {\n setupCompletionNames = [...new Set(names)].sort((left, right) => left.localeCompare(right));\n}\nconst SETUP_FLAG_COMPLETION = {\n value: \"--setup\",\n label: \"--setup\",\n description: \"Address a sync setup without switching\",\n} as const;\nconst SYNC_FLAG_COMPLETIONS: Record<string, readonly CommandArgumentCompletion[]> = {\n config: [SETUP_FLAG_COMPLETION],\n files: [SETUP_FLAG_COMPLETION],\n status: [SETUP_FLAG_COMPLETION],\n diff: [SETUP_FLAG_COMPLETION],\n doctor: [SETUP_FLAG_COMPLETION],\n push: [\n ...YES_FLAG_COMPLETIONS,\n { value: \"--force\", label: \"--force\", description: \"Overwrite visible remote changes\" },\n SETUP_FLAG_COMPLETION,\n ],\n pull: [\n ...YES_FLAG_COMPLETIONS,\n { value: \"--force\", label: \"--force\", description: \"Overwrite local changes\" },\n SETUP_FLAG_COMPLETION,\n ],\n sync: [\n ...YES_FLAG_COMPLETIONS,\n { value: \"--force\", label: \"--force\", description: \"Resolve conflicts by forcing action\" },\n SETUP_FLAG_COMPLETION,\n ],\n history: [SETUP_FLAG_COMPLETION],\n rollback: [...YES_FLAG_COMPLETIONS, SETUP_FLAG_COMPLETION],\n \"migrate-state\": YES_FLAG_COMPLETIONS,\n unlock: [{ value: \"--stale\", label: \"--stale\", description: \"Remove only a stale lock\" }],\n};\n\nexport function splitArgs(input: string) {\n return input.match(/(?:[^\\s\"']+|\"[^\"]*\"|'[^']*')+/g)?.map((arg) => arg.replace(/^['\"]|['\"]$/g, \"\")) ?? [];\n}\n\nexport function parseOptions(args: string[]): CommandOptions {\n const values: string[] = [];\n let yes = false;\n let force = false;\n let stale = false;\n let setup: string | undefined;\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (arg === \"--yes\" || arg === \"-y\") yes = true;\n else if (arg === \"--force\") force = true;\n else if (arg === \"--stale\") stale = true;\n else if (arg === \"--setup\") {\n const name = args[index + 1];\n if (!name || name.startsWith(\"-\")) throw new Error(\"--setup requires a sync setup name.\");\n if (setup !== undefined) throw new Error(\"--setup may be provided only once.\");\n setup = name;\n index += 1;\n } else if (arg.startsWith(\"-\")) {\n throw new Error(`Unknown sync option: ${arg}`);\n } else values.push(arg);\n }\n return {\n yes,\n force,\n stale,\n silent: false,\n reload: true,\n auto: false,\n ...(setup === undefined ? {} : { setup }),\n args: values,\n };\n}\n\nexport function validateCommandOptions(command: string, options: CommandOptions) {\n const setupAllowed = new Set([\n \"config\",\n \"files\",\n \"status\",\n \"diff\",\n \"doctor\",\n \"push\",\n \"pull\",\n \"sync\",\n \"history\",\n \"rollback\",\n ]);\n if (options.setup && !setupAllowed.has(command)) {\n throw new Error(`--setup is not supported by /sync ${command}.`);\n }\n if (options.yes && ![\"push\", \"pull\", \"sync\", \"rollback\", \"migrate-state\"].includes(command)) {\n throw new Error(`Confirmation/force options are not supported by /sync ${command}.`);\n }\n if (options.force && ![\"push\", \"pull\", \"sync\", \"rollback\"].includes(command)) {\n throw new Error(`Confirmation/force options are not supported by /sync ${command}.`);\n }\n if (options.stale && command !== \"unlock\") {\n throw new Error(`--stale is not supported by /sync ${command}.`);\n }\n const expectedValues = command === \"rollback\" || command === \"use\" ? 1 : 0;\n if (options.args.length !== expectedValues) {\n if (command === \"rollback\") throw new Error(\"Usage: /sync rollback <snapshot-id> [--yes] [--setup <name>]\");\n if (command === \"use\") throw new Error(\"Usage: /sync use <setup>\");\n throw new Error(`Unexpected argument for /sync ${command}: ${options.args.join(\" \")}`);\n }\n}\n\nexport function completeSyncArguments(argumentPrefix: string): CommandArgumentCompletion[] | null {\n const prefix = argumentPrefix.trimStart();\n if (prefix === \"\") return [...SYNC_COMMAND_COMPLETIONS];\n\n const trailingSpace = /\\s$/.test(prefix);\n const tokens = splitArgs(prefix);\n if (tokens.length === 0) return [...SYNC_COMMAND_COMPLETIONS];\n\n const [command] = tokens;\n if (tokens.length === 1 && !trailingSpace) {\n const matches = SYNC_COMMAND_COMPLETIONS.filter((item) => item.value.startsWith(command));\n return matches.length > 0 ? [...matches] : null;\n }\n\n const args = tokens.slice(1);\n if (command === \"use\") {\n if (args.length > 1 || (trailingSpace && args.length > 0)) return null;\n return completeSetupValue(prefix, trailingSpace ? \"\" : (args[0] ?? \"\"));\n }\n const setupFlagIndex = args.lastIndexOf(\"--setup\");\n if (setupFlagIndex >= 0 && setupFlagIndex === args.length - (trailingSpace ? 1 : 2)) {\n const currentSetup = trailingSpace ? \"\" : (args.at(-1) ?? \"\");\n if (!currentSetup.startsWith(\"-\")) return completeSetupValue(prefix, currentSetup);\n }\n\n const flagCompletions = SYNC_FLAG_COMPLETIONS[command];\n if (!flagCompletions) return null;\n\n const completedArgs = trailingSpace ? args : args.slice(0, -1);\n const completedValues = completedArgs.filter((arg) => !arg.startsWith(\"-\"));\n if (command === \"rollback\" ? completedValues.length > 1 : completedValues.length > 0) {\n return null;\n }\n\n const current = trailingSpace ? \"\" : (args.at(-1) ?? \"\");\n if (current && !current.startsWith(\"-\")) return null;\n\n const currentRaw = trailingSpace ? \"\" : (prefix.match(/\\S+$/)?.[0] ?? \"\");\n const completionPrefix = trailingSpace ? prefix : prefix.slice(0, prefix.length - currentRaw.length);\n const matches = flagCompletions.filter((item) => item.value.startsWith(current));\n return matches.length > 0 ? matches.map((item) => ({ ...item, value: `${completionPrefix}${item.value}` })) : null;\n}\n\nfunction completeSetupValue(prefix: string, current: string) {\n const currentRaw = current ? (prefix.match(/\\S+$/u)?.[0] ?? \"\") : \"\";\n const completionPrefix = currentRaw ? prefix.slice(0, prefix.length - currentRaw.length) : prefix;\n const matches = setupCompletionNames.filter((name) => name.startsWith(current));\n return matches.length > 0\n ? matches.map((name) => ({\n value: `${completionPrefix}${name}`,\n label: name,\n description: \"Sync setup\",\n }))\n : null;\n}\n\nexport function syncMenuOptions() {\n return SYNC_COMMANDS.map(({ name, description }) => `${name} \u2014 ${description}`);\n}\n\nexport function syncCommandFromMenuOption(option: string): SyncCommandName | undefined {\n return SYNC_COMMANDS.find(({ name, description }) => option === `${name} \u2014 ${description}`)?.name;\n}\n\nexport async function resolveSyncCommand(input: string, ctx: ExtensionCommandContext) {\n const [subcommand, ...rest] = splitArgs(input);\n if (subcommand) return { subcommand, rest };\n if (!ctx.hasUI) {\n ctx.ui.notify(usage(), \"info\");\n return undefined;\n }\n\n const selectedOption = await ctx.ui.select(\"pi-sync\", syncMenuOptions());\n const selected = selectedOption ? syncCommandFromMenuOption(selectedOption) : undefined;\n if (!selected) return undefined;\n if (selected !== \"rollback\") return { subcommand: selected, rest: [] };\n\n const target = (await ctx.ui.input(\"Rollback snapshot\", \"snapshot id\"))?.trim();\n if (!target) {\n ctx.ui.notify(\"Rollback cancelled.\", \"info\");\n return undefined;\n }\n return { subcommand: selected, rest: [target] };\n}\n\nexport function usage() {\n const commands = SYNC_COMMANDS.map(\n (command) => `${command.name}${\"usageSuffix\" in command ? command.usageSuffix : \"\"}`,\n ).join(\", \");\n return [\n \"Usage: /sync <command>\",\n `Commands: ${commands}`,\n \"Automatic sync: background startup checks only; use /sync to review and transfer. At shutdown, selected content is pushed automatically only when sessions are included. Startup checks run in TUI/RPC, not print/JSON.\",\n \"Settings: use /sync init or edit storage connections and sync setups in ~/.pi/agent/pi-sync.json (or the configured Pi agent directory). Version 1 and version 2 settings are unsupported and are never rewritten.\",\n ].join(\"\\n\");\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["matches"]
|
|
7
|
+
}
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
// @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
|
|
3
3
|
import {
|
|
4
4
|
backendIdentityCoordinates
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-2JZFHNLM.ts";
|
|
6
6
|
import {
|
|
7
7
|
stateDir
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-BVVP33U5.ts";
|
|
9
9
|
import {
|
|
10
10
|
readJsonIfExists,
|
|
11
11
|
writeJson
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-OVDTF5CH.ts";
|
|
13
13
|
|
|
14
14
|
// src/state/sync-state-store.ts
|
|
15
15
|
import { createHash } from "node:crypto";
|
|
@@ -48,4 +48,4 @@ export {
|
|
|
48
48
|
lockPath,
|
|
49
49
|
ensureStateDir
|
|
50
50
|
};
|
|
51
|
-
//# sourceMappingURL=chunk-
|
|
51
|
+
//# sourceMappingURL=chunk-YPXGU5OR.ts.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/state/sync-state-store.ts"],
|
|
4
|
+
"sourcesContent": ["import { createHash } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { backendIdentityCoordinates } from \"../backends/backend-identity.js\";\nimport { safeName } from \"../paths.js\";\nimport type { AnySyncConfig } from \"../settings/settings-types.js\";\nimport { readJsonIfExists, writeJson } from \"./json-file.js\";\nimport { stateDir } from \"./state-directory.js\";\nimport type { SyncState } from \"./state-types.js\";\n\nconst STATE_VERSION = 2;\n\n/** Bounded observation token; do not retain the full baseline in passive UI state. */\nexport function syncStateFingerprint(state: SyncState) {\n return createHash(\"sha256\").update(JSON.stringify(state)).digest(\"hex\");\n}\n\nexport async function readState(profile: string): Promise<SyncState> {\n return (\n (await readJsonIfExists<SyncState>(statePath(profile))) ?? {\n version: STATE_VERSION,\n profile,\n lastFileHashes: {},\n }\n );\n}\n\nexport async function writeState(profile: string, state: SyncState) {\n await writeJson(statePath(profile), state);\n}\n\nexport async function readStateForConfig(config: AnySyncConfig): Promise<SyncState> {\n return (\n (await readJsonIfExists<SyncState>(statePathForConfig(config))) ?? {\n version: STATE_VERSION,\n profile: config.snapshotIdentity,\n lastFileHashes: {},\n }\n );\n}\n\nexport async function writeStateForConfig(config: AnySyncConfig, state: SyncState) {\n await writeJson(statePathForConfig(config), state);\n}\n\nexport function statePathForConfig(config: AnySyncConfig) {\n const identity = backendIdentityCoordinates(config);\n const hash = createHash(\"sha256\").update(identity).digest(\"hex\").slice(0, 16);\n return path.join(stateDir(), \"setups\", `${config.backend.type}-${hash}.state.json`);\n}\n\nfunction statePath(profile: string) {\n return path.join(stateDir(), `${safeName(profile)}.state.json`);\n}\n\nexport function lockPath() {\n return path.join(stateDir(), \"lock\");\n}\n\nexport async function ensureStateDir() {\n await fs.mkdir(stateDir(), { recursive: true });\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;AAAA,SAAS,kBAAkB;AAC3B,OAAO,QAAQ;AACf,OAAO,UAAU;AAQjB,IAAM,gBAAgB;AAGf,SAAS,qBAAqB,OAAkB;AACrD,SAAO,WAAW,QAAQ,EAAE,OAAO,KAAK,UAAU,KAAK,CAAC,EAAE,OAAO,KAAK;AACxE;AAgBA,eAAsB,mBAAmB,QAA2C;AAClF,SACG,MAAM,iBAA4B,mBAAmB,MAAM,CAAC,KAAM;AAAA,IACjE,SAAS;AAAA,IACT,SAAS,OAAO;AAAA,IAChB,gBAAgB,CAAC;AAAA,EACnB;AAEJ;AAEA,eAAsB,oBAAoB,QAAuB,OAAkB;AACjF,QAAM,UAAU,mBAAmB,MAAM,GAAG,KAAK;AACnD;AAEO,SAAS,mBAAmB,QAAuB;AACxD,QAAM,WAAW,2BAA2B,MAAM;AAClD,QAAM,OAAO,WAAW,QAAQ,EAAE,OAAO,QAAQ,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAC5E,SAAO,KAAK,KAAK,SAAS,GAAG,UAAU,GAAG,OAAO,QAAQ,IAAI,IAAI,IAAI,aAAa;AACpF;AAMO,SAAS,WAAW;AACzB,SAAO,KAAK,KAAK,SAAS,GAAG,MAAM;AACrC;AAEA,eAAsB,iBAAiB;AACrC,QAAM,GAAG,MAAM,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AAChD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
// @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
|
|
3
3
|
import {
|
|
4
4
|
updateSyncSetup
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-2RZSQWBH.ts";
|
|
6
6
|
import {
|
|
7
7
|
loadConfig,
|
|
8
8
|
localConfigPath
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-4MPIH46N.ts";
|
|
10
|
+
import "./chunk-2JZFHNLM.ts";
|
|
11
|
+
import "./chunk-T2SJD3N7.ts";
|
|
12
12
|
import {
|
|
13
13
|
agentDir
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-OVDTF5CH.ts";
|
|
15
15
|
import {
|
|
16
16
|
BUILT_IN_SYNC_ROOTS,
|
|
17
17
|
isSafeCustomIncludePath,
|
|
18
18
|
normalizeSyncInclude,
|
|
19
19
|
syncIncludeSelection
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-IVXEDPAD.ts";
|
|
21
21
|
|
|
22
22
|
// src/ui/file-selection.ts
|
|
23
23
|
import fs from "node:fs/promises";
|
|
@@ -156,9 +156,7 @@ async function showDraftEditor(ctx, setupName, draft, customCandidates, signal)
|
|
|
156
156
|
if (actionSignal.aborted) return { kind: "stay" };
|
|
157
157
|
const requested = entered?.trim();
|
|
158
158
|
if (!requested) return { kind: "stay" };
|
|
159
|
-
const existing = customCandidates.find(
|
|
160
|
-
(candidate) => candidate.toLowerCase() === requested.toLowerCase()
|
|
161
|
-
);
|
|
159
|
+
const existing = customCandidates.find((candidate) => candidate.toLowerCase() === requested.toLowerCase());
|
|
162
160
|
const relativePath = existing ?? requested;
|
|
163
161
|
if (draft.custom.has(relativePath)) return { kind: "stay" };
|
|
164
162
|
try {
|
|
@@ -226,10 +224,8 @@ async function showDraftReview(ctx, original, draft, signal) {
|
|
|
226
224
|
return choice;
|
|
227
225
|
}
|
|
228
226
|
function updateDraft(draft, id, included) {
|
|
229
|
-
if (id.startsWith(BUILT_IN_PREFIX))
|
|
230
|
-
|
|
231
|
-
if (id.startsWith(CUSTOM_PREFIX))
|
|
232
|
-
return updateSet(draft.custom, id.slice(CUSTOM_PREFIX.length), included);
|
|
227
|
+
if (id.startsWith(BUILT_IN_PREFIX)) return updateSet(draft.builtIns, id.slice(BUILT_IN_PREFIX.length), included);
|
|
228
|
+
if (id.startsWith(CUSTOM_PREFIX)) return updateSet(draft.custom, id.slice(CUSTOM_PREFIX.length), included);
|
|
233
229
|
if (id === SESSIONS_ID) {
|
|
234
230
|
draft.sessions = included;
|
|
235
231
|
return;
|
|
@@ -242,18 +238,12 @@ function updateSet(set, value, included) {
|
|
|
242
238
|
}
|
|
243
239
|
function formatDraftPreview(original, draft) {
|
|
244
240
|
const lines = ["Review included-content changes", ""];
|
|
245
|
-
for (const item of /* @__PURE__ */ new Set([
|
|
246
|
-
...original.builtIns,
|
|
247
|
-
...draft.builtIns,
|
|
248
|
-
...original.custom,
|
|
249
|
-
...draft.custom
|
|
250
|
-
])) {
|
|
241
|
+
for (const item of /* @__PURE__ */ new Set([...original.builtIns, ...draft.builtIns, ...original.custom, ...draft.custom])) {
|
|
251
242
|
const before = original.builtIns.has(item) || original.custom.has(item);
|
|
252
243
|
const after = draft.builtIns.has(item) || draft.custom.has(item);
|
|
253
244
|
if (before !== after) lines.push(`${after ? "Include" : "Exclude"}: ${safeTerminalText(item)}`);
|
|
254
245
|
}
|
|
255
|
-
if (original.sessions !== draft.sessions)
|
|
256
|
-
lines.push(`${draft.sessions ? "Include" : "Exclude"}: sessions`);
|
|
246
|
+
if (original.sessions !== draft.sessions) lines.push(`${draft.sessions ? "Include" : "Exclude"}: sessions`);
|
|
257
247
|
lines.push("", "Saving does not start a network sync.");
|
|
258
248
|
return lines.join("\n");
|
|
259
249
|
}
|
|
@@ -261,10 +251,8 @@ async function listCustomCandidates(configured) {
|
|
|
261
251
|
const candidates = new Map([...configured].map((item) => [item.toLowerCase(), item]));
|
|
262
252
|
try {
|
|
263
253
|
for (const entry of await fs.readdir(agentDir(), { withFileTypes: true })) {
|
|
264
|
-
if (!entry.isFile() && !entry.isDirectory() || !isSafeCustomIncludePath(entry.name))
|
|
265
|
-
|
|
266
|
-
if (!candidates.has(entry.name.toLowerCase()))
|
|
267
|
-
candidates.set(entry.name.toLowerCase(), entry.name);
|
|
254
|
+
if (!entry.isFile() && !entry.isDirectory() || !isSafeCustomIncludePath(entry.name)) continue;
|
|
255
|
+
if (!candidates.has(entry.name.toLowerCase())) candidates.set(entry.name.toLowerCase(), entry.name);
|
|
268
256
|
}
|
|
269
257
|
} catch (error) {
|
|
270
258
|
if (error.code !== "ENOENT") throw error;
|
|
@@ -290,4 +278,4 @@ function safeTerminalText(value) {
|
|
|
290
278
|
export {
|
|
291
279
|
showFileSelection
|
|
292
280
|
};
|
|
293
|
-
//# sourceMappingURL=file-selection-
|
|
281
|
+
//# sourceMappingURL=file-selection-RAVHRYFG.ts.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/ui/file-selection.ts"],
|
|
4
|
+
"sourcesContent": ["import fs from \"node:fs/promises\";\nimport type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport { loadConfig } from \"../settings/config.js\";\nimport { localConfigPath } from \"../settings/config-file.js\";\nimport { updateSyncSetup } from \"../settings/settings-management.js\";\nimport { agentDir } from \"../snapshot/session-paths.js\";\nimport {\n BUILT_IN_SYNC_ROOTS,\n isSafeCustomIncludePath,\n normalizeSyncInclude,\n syncIncludeSelection,\n} from \"../sync/sync-policy.js\";\n\nconst BUILT_IN_PREFIX = \"builtin:\";\nconst CUSTOM_PREFIX = \"custom:\";\nconst SESSIONS_ID = \"sessions\";\nconst ADD_CUSTOM_ID = \"add-custom\";\n\ninterface SelectionDraft {\n builtIns: Set<string>;\n custom: Set<string>;\n sessions: boolean;\n}\n\nexport async function showFileSelection(ctx: ExtensionCommandContext, setupName?: string, signal?: AbortSignal) {\n const config = await loadConfig(setupName);\n if (signal?.aborted) return;\n const selection = syncIncludeSelection(config.include);\n const original: SelectionDraft = {\n builtIns: new Set(selection.builtIns),\n custom: new Set(selection.custom),\n sessions: selection.sessions,\n };\n const draft = cloneDraft(original);\n const customCandidates = await listCustomCandidates(draft.custom);\n\n if (ctx.mode !== \"tui\") {\n ctx.ui.notify(\n [\n `pi-sync included content for sync setup ${safeTerminalText(config.setupName)}:`,\n `include: ${config.include.map(safeTerminalText).join(\", \") || \"none\"}`,\n `Edit sync.include in ${safeTerminalText(localConfigPath())}.`,\n ].join(\"\\n\"),\n \"info\",\n );\n return;\n }\n\n while (!signal?.aborted) {\n await showDraftEditor(ctx, config.setupName, draft, customCandidates, signal);\n if (signal?.aborted || sameDraft(original, draft)) return;\n const choice = await showDraftReview(ctx, original, draft, signal);\n if (signal?.aborted) return;\n if (choice === \"Continue editing\") continue;\n if (choice !== \"Save changes\") {\n ctx.ui.notify(\"Included-content changes discarded.\", \"info\");\n return;\n }\n try {\n if (!original.sessions && draft.sessions) {\n const acknowledged = await ctx.ui.confirm(\n \"Include session conversations?\",\n \"Session JSONL may contain prompts, tool output, file paths, images, and secrets. Continue only with storage you trust.\",\n { signal },\n );\n if (signal?.aborted) return;\n if (!acknowledged) {\n ctx.ui.notify(\"Session inclusion was not saved.\", \"info\");\n return;\n }\n }\n const include = [\n ...BUILT_IN_SYNC_ROOTS.filter((candidate) => draft.builtIns.has(candidate)),\n ...draft.custom,\n ...(draft.sessions ? [\"sessions\"] : []),\n ];\n if (signal?.aborted) return;\n await updateSyncSetup(\n config.setupName,\n (setup) => ({\n ...setup,\n sync: { ...setup.sync, include },\n }),\n { expectedInclude: config.include, signal },\n );\n if (signal?.aborted) return;\n ctx.ui.notify(\n `Saved included content for sync setup \u201C${safeTerminalText(config.setupName)}\u201D. It applies to the next manual or automatic sync.`,\n \"info\",\n );\n } catch (error) {\n if (signal?.aborted) return;\n ctx.ui.notify(\n `Could not save pi-sync file selection: ${safeTerminalText(error instanceof Error ? error.message : String(error))}`,\n \"error\",\n );\n }\n return;\n }\n}\n\nasync function showDraftEditor(\n ctx: ExtensionCommandContext,\n setupName: string,\n draft: SelectionDraft,\n customCandidates: string[],\n signal?: AbortSignal,\n) {\n const menu = defineMenu<undefined, \"editor\", \"toggle\" | \"addCustom\", ExtensionCommandContext>({\n start: \"editor\",\n screens: {\n editor: () => ({\n kind: \"multiSelect\",\n title: `Included Content \u00B7 ${safeTerminalText(setupName)}`,\n lines: [\"Draft only \u00B7 leaving this screen opens Save, Discard, or Continue editing.\"],\n viewportSize: 12,\n items: [\n ...BUILT_IN_SYNC_ROOTS.map((relativePath) => ({\n id: `${BUILT_IN_PREFIX}${relativePath}`,\n label: relativePath,\n description: relativePath.includes(\".\")\n ? `Sync the top-level ${relativePath} file when present.`\n : `Recursively sync every safe file under ${relativePath}/.`,\n selected: draft.builtIns.has(relativePath),\n })),\n ...customCandidates.map((relativePath) => ({\n id: `${CUSTOM_PREFIX}${relativePath}`,\n label: safeTerminalText(relativePath),\n description: \"Additional safe agent-relative file or directory.\",\n selected: draft.custom.has(relativePath),\n })),\n {\n id: SESSIONS_ID,\n label: \"sessions\",\n description:\n \"Session JSONL may contain prompts, tool output, paths, images, and secrets. Sync only to storage you trust.\",\n selected: draft.sessions,\n },\n ],\n action: \"toggle\",\n actions: [\n {\n id: ADD_CUSTOM_ID,\n label: \"Add custom path\u2026\",\n description: \"Include an agent-relative file or directory even when it exists only remotely.\",\n action: \"addCustom\",\n },\n ],\n hint: \"close\",\n doneLabel: \"Review changes\",\n }),\n },\n actions: {\n toggle: async ({ itemId, selected }) => {\n updateDraft(draft, itemId, selected === true);\n return { kind: \"stay\" };\n },\n addCustom: async ({ ctx: actionCtx, signal: actionSignal }) => {\n const entered = await actionCtx.ui.input(\n \"Add included content\",\n \"Agent-relative path, for example custom.toml or snippets\",\n { signal: actionSignal },\n );\n if (actionSignal.aborted) return { kind: \"stay\" };\n const requested = entered?.trim();\n if (!requested) return { kind: \"stay\" };\n const existing = customCandidates.find((candidate) => candidate.toLowerCase() === requested.toLowerCase());\n const relativePath = existing ?? requested;\n if (draft.custom.has(relativePath)) return { kind: \"stay\" };\n try {\n if (!isSafeCustomIncludePath(relativePath)) {\n throw new Error(\"Enter a safe agent-relative file or directory path.\");\n }\n normalizeSyncInclude([\n ...draft.builtIns,\n ...draft.custom,\n ...(draft.sessions ? [\"sessions\"] : []),\n relativePath,\n ]);\n } catch (error) {\n if (actionSignal.aborted) return { kind: \"stay\" };\n actionCtx.ui.notify(\n `Could not add included content: ${safeTerminalText(error instanceof Error ? error.message : String(error))}`,\n \"error\",\n );\n return { kind: \"stay\" };\n }\n if (!existing) {\n customCandidates.push(relativePath);\n customCandidates.sort((left, right) => left.localeCompare(right));\n }\n draft.custom.add(relativePath);\n return { kind: \"stay\" };\n },\n },\n });\n await runMenu(ctx, menu, {\n getState: () => undefined,\n signal,\n isCurrent: () => !signal?.aborted,\n });\n}\n\nasync function showDraftReview(\n ctx: ExtensionCommandContext,\n original: SelectionDraft,\n draft: SelectionDraft,\n signal?: AbortSignal,\n) {\n let choice: \"Save changes\" | \"Discard changes\" | \"Continue editing\" | undefined;\n const menu = defineMenu<undefined, \"review\", \"choose\", ExtensionCommandContext>({\n start: \"review\",\n screens: {\n review: () => ({\n kind: \"actions\",\n title: \"Review included-content changes\",\n lines: formatDraftPreview(original, draft).split(\"\\n\").slice(2),\n items: [\n { id: \"save\", label: \"Save changes\", action: \"choose\" },\n { id: \"discard\", label: \"Discard changes\", action: \"choose\" },\n { id: \"continue\", label: \"Continue editing\", action: \"choose\" },\n ],\n hint: \"close\",\n }),\n },\n actions: {\n choose: async ({ itemId }) => {\n choice = itemId === \"save\" ? \"Save changes\" : itemId === \"continue\" ? \"Continue editing\" : \"Discard changes\";\n return { kind: \"close\" };\n },\n },\n });\n await runMenu(ctx, menu, {\n getState: () => undefined,\n signal,\n isCurrent: () => !signal?.aborted,\n });\n return choice;\n}\n\nfunction updateDraft(draft: SelectionDraft, id: string, included: boolean) {\n if (id.startsWith(BUILT_IN_PREFIX)) return updateSet(draft.builtIns, id.slice(BUILT_IN_PREFIX.length), included);\n if (id.startsWith(CUSTOM_PREFIX)) return updateSet(draft.custom, id.slice(CUSTOM_PREFIX.length), included);\n if (id === SESSIONS_ID) {\n draft.sessions = included;\n return;\n }\n throw new Error(`Unknown file selection: ${id}`);\n}\n\nfunction updateSet(set: Set<string>, value: string, included: boolean) {\n if (included) set.add(value);\n else set.delete(value);\n}\n\nfunction formatDraftPreview(original: SelectionDraft, draft: SelectionDraft) {\n const lines = [\"Review included-content changes\", \"\"];\n for (const item of new Set([...original.builtIns, ...draft.builtIns, ...original.custom, ...draft.custom])) {\n const before = original.builtIns.has(item) || original.custom.has(item);\n const after = draft.builtIns.has(item) || draft.custom.has(item);\n if (before !== after) lines.push(`${after ? \"Include\" : \"Exclude\"}: ${safeTerminalText(item)}`);\n }\n if (original.sessions !== draft.sessions) lines.push(`${draft.sessions ? \"Include\" : \"Exclude\"}: sessions`);\n lines.push(\"\", \"Saving does not start a network sync.\");\n return lines.join(\"\\n\");\n}\n\nasync function listCustomCandidates(configured: Set<string>) {\n const candidates = new Map([...configured].map((item) => [item.toLowerCase(), item]));\n try {\n for (const entry of await fs.readdir(agentDir(), { withFileTypes: true })) {\n if ((!entry.isFile() && !entry.isDirectory()) || !isSafeCustomIncludePath(entry.name)) continue;\n if (!candidates.has(entry.name.toLowerCase())) candidates.set(entry.name.toLowerCase(), entry.name);\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n return [...candidates.values()].sort((left, right) => left.localeCompare(right));\n}\n\nfunction cloneDraft(value: SelectionDraft): SelectionDraft {\n return {\n builtIns: new Set(value.builtIns),\n custom: new Set(value.custom),\n sessions: value.sessions,\n };\n}\n\nfunction sameDraft(left: SelectionDraft, right: SelectionDraft) {\n return (\n left.sessions === right.sessions && sameSet(left.builtIns, right.builtIns) && sameSet(left.custom, right.custom)\n );\n}\n\nfunction sameSet(left: Set<string>, right: Set<string>) {\n return left.size === right.size && [...left].every((item) => right.has(item));\n}\n\nfunction safeTerminalText(value: string) {\n // biome-ignore lint/suspicious/noControlCharactersInRegex: Escape untrusted terminal controls.\n return value.replace(/[\\u0000-\\u001f\\u007f-\\u009f]/gu, \"?\");\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|