@tinyrack/dotweave 0.39.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/bin/index.js +5 -0
  2. package/dist/application.d.ts +5 -0
  3. package/dist/application.d.ts.map +1 -0
  4. package/dist/application.js +86 -0
  5. package/dist/application.js.map +1 -0
  6. package/dist/cli/autocomplete.d.ts +7 -0
  7. package/dist/cli/autocomplete.d.ts.map +1 -0
  8. package/dist/cli/autocomplete.js +62 -0
  9. package/dist/cli/autocomplete.js.map +1 -0
  10. package/dist/cli/cd.d.ts +4 -0
  11. package/dist/cli/cd.d.ts.map +1 -0
  12. package/dist/cli/cd.js +23 -0
  13. package/dist/cli/cd.js.map +1 -0
  14. package/dist/cli/doctor.d.ts +4 -0
  15. package/dist/cli/doctor.d.ts.map +1 -0
  16. package/dist/cli/doctor.js +92 -0
  17. package/dist/cli/doctor.js.map +1 -0
  18. package/dist/cli/index.d.ts +4 -0
  19. package/dist/cli/index.d.ts.map +1 -0
  20. package/dist/cli/index.js +22 -0
  21. package/dist/cli/index.js.map +1 -0
  22. package/dist/cli/init.d.ts +4 -0
  23. package/dist/cli/init.d.ts.map +1 -0
  24. package/dist/cli/init.js +110 -0
  25. package/dist/cli/init.js.map +1 -0
  26. package/dist/cli/profile/index.d.ts +3 -0
  27. package/dist/cli/profile/index.d.ts.map +1 -0
  28. package/dist/cli/profile/index.js +15 -0
  29. package/dist/cli/profile/index.js.map +1 -0
  30. package/dist/cli/profile/list.d.ts +4 -0
  31. package/dist/cli/profile/list.d.ts.map +1 -0
  32. package/dist/cli/profile/list.js +42 -0
  33. package/dist/cli/profile/list.js.map +1 -0
  34. package/dist/cli/profile/use.d.ts +4 -0
  35. package/dist/cli/profile/use.d.ts.map +1 -0
  36. package/dist/cli/profile/use.js +49 -0
  37. package/dist/cli/profile/use.js.map +1 -0
  38. package/dist/cli/pull.d.ts +4 -0
  39. package/dist/cli/pull.d.ts.map +1 -0
  40. package/dist/cli/pull.js +107 -0
  41. package/dist/cli/pull.js.map +1 -0
  42. package/dist/cli/push.d.ts +4 -0
  43. package/dist/cli/push.d.ts.map +1 -0
  44. package/dist/cli/push.js +49 -0
  45. package/dist/cli/push.js.map +1 -0
  46. package/dist/cli/root-commands.d.ts +13 -0
  47. package/dist/cli/root-commands.d.ts.map +1 -0
  48. package/dist/cli/root-commands.js +25 -0
  49. package/dist/cli/root-commands.js.map +1 -0
  50. package/dist/cli/status.d.ts +4 -0
  51. package/dist/cli/status.d.ts.map +1 -0
  52. package/dist/cli/status.js +132 -0
  53. package/dist/cli/status.js.map +1 -0
  54. package/dist/cli/track.d.ts +4 -0
  55. package/dist/cli/track.d.ts.map +1 -0
  56. package/dist/cli/track.js +133 -0
  57. package/dist/cli/track.js.map +1 -0
  58. package/dist/cli/untrack.d.ts +4 -0
  59. package/dist/cli/untrack.d.ts.map +1 -0
  60. package/dist/cli/untrack.js +40 -0
  61. package/dist/cli/untrack.js.map +1 -0
  62. package/dist/config/constants.d.ts +31 -0
  63. package/dist/config/constants.d.ts.map +1 -0
  64. package/dist/config/constants.js +33 -0
  65. package/dist/config/constants.js.map +1 -0
  66. package/dist/config/global-config.d.ts +21 -0
  67. package/dist/config/global-config.d.ts.map +1 -0
  68. package/dist/config/global-config.js +89 -0
  69. package/dist/config/global-config.js.map +1 -0
  70. package/dist/config/identity-file.d.ts +9 -0
  71. package/dist/config/identity-file.d.ts.map +1 -0
  72. package/dist/config/identity-file.js +48 -0
  73. package/dist/config/identity-file.js.map +1 -0
  74. package/dist/config/migration.d.ts +9 -0
  75. package/dist/config/migration.d.ts.map +1 -0
  76. package/dist/config/migration.js +61 -0
  77. package/dist/config/migration.js.map +1 -0
  78. package/dist/config/platform.d.ts +12 -0
  79. package/dist/config/platform.d.ts.map +1 -0
  80. package/dist/config/platform.js +25 -0
  81. package/dist/config/platform.js.map +1 -0
  82. package/dist/config/runtime-env.d.ts +7 -0
  83. package/dist/config/runtime-env.d.ts.map +1 -0
  84. package/dist/config/runtime-env.js +31 -0
  85. package/dist/config/runtime-env.js.map +1 -0
  86. package/dist/config/sync-entry.d.ts +14 -0
  87. package/dist/config/sync-entry.d.ts.map +1 -0
  88. package/dist/config/sync-entry.js +99 -0
  89. package/dist/config/sync-entry.js.map +1 -0
  90. package/dist/config/sync-schema.d.ts +146 -0
  91. package/dist/config/sync-schema.d.ts.map +1 -0
  92. package/dist/config/sync-schema.js +392 -0
  93. package/dist/config/sync-schema.js.map +1 -0
  94. package/dist/config/sync.d.ts +8 -0
  95. package/dist/config/sync.d.ts.map +1 -0
  96. package/dist/config/sync.js +53 -0
  97. package/dist/config/sync.js.map +1 -0
  98. package/dist/config/xdg.d.ts +10 -0
  99. package/dist/config/xdg.d.ts.map +1 -0
  100. package/dist/config/xdg.js +90 -0
  101. package/dist/config/xdg.js.map +1 -0
  102. package/dist/index.d.ts +3 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +4 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/lib/content.d.ts +5 -0
  107. package/dist/lib/content.d.ts.map +1 -0
  108. package/dist/lib/content.js +29 -0
  109. package/dist/lib/content.js.map +1 -0
  110. package/dist/lib/crypto.d.ts +45 -0
  111. package/dist/lib/crypto.d.ts.map +1 -0
  112. package/dist/lib/crypto.js +130 -0
  113. package/dist/lib/crypto.js.map +1 -0
  114. package/dist/lib/env.d.ts +13 -0
  115. package/dist/lib/env.d.ts.map +1 -0
  116. package/dist/lib/env.js +50 -0
  117. package/dist/lib/env.js.map +1 -0
  118. package/dist/lib/error.d.ts +22 -0
  119. package/dist/lib/error.d.ts.map +1 -0
  120. package/dist/lib/error.js +50 -0
  121. package/dist/lib/error.js.map +1 -0
  122. package/dist/lib/file-mode.d.ts +36 -0
  123. package/dist/lib/file-mode.d.ts.map +1 -0
  124. package/dist/lib/file-mode.js +55 -0
  125. package/dist/lib/file-mode.js.map +1 -0
  126. package/dist/lib/filesystem.d.ts +60 -0
  127. package/dist/lib/filesystem.d.ts.map +1 -0
  128. package/dist/lib/filesystem.js +190 -0
  129. package/dist/lib/filesystem.js.map +1 -0
  130. package/dist/lib/git.d.ts +23 -0
  131. package/dist/lib/git.d.ts.map +1 -0
  132. package/dist/lib/git.js +162 -0
  133. package/dist/lib/git.js.map +1 -0
  134. package/dist/lib/jsonc.d.ts +8 -0
  135. package/dist/lib/jsonc.d.ts.map +1 -0
  136. package/dist/lib/jsonc.js +78 -0
  137. package/dist/lib/jsonc.js.map +1 -0
  138. package/dist/lib/path.d.ts +21 -0
  139. package/dist/lib/path.d.ts.map +1 -0
  140. package/dist/lib/path.js +44 -0
  141. package/dist/lib/path.js.map +1 -0
  142. package/dist/lib/promise.d.ts +10 -0
  143. package/dist/lib/promise.d.ts.map +1 -0
  144. package/dist/lib/promise.js +25 -0
  145. package/dist/lib/promise.js.map +1 -0
  146. package/dist/lib/string.d.ts +6 -0
  147. package/dist/lib/string.d.ts.map +1 -0
  148. package/dist/lib/string.js +8 -0
  149. package/dist/lib/string.js.map +1 -0
  150. package/dist/lib/validation.d.ts +7 -0
  151. package/dist/lib/validation.d.ts.map +1 -0
  152. package/dist/lib/validation.js +13 -0
  153. package/dist/lib/validation.js.map +1 -0
  154. package/dist/lib/version.d.ts +2 -0
  155. package/dist/lib/version.d.ts.map +1 -0
  156. package/dist/lib/version.js +4 -0
  157. package/dist/lib/version.js.map +1 -0
  158. package/dist/migrations/global-v3.d.ts +3 -0
  159. package/dist/migrations/global-v3.d.ts.map +1 -0
  160. package/dist/migrations/global-v3.js +5 -0
  161. package/dist/migrations/global-v3.js.map +1 -0
  162. package/dist/services/autocomplete.d.ts +5 -0
  163. package/dist/services/autocomplete.d.ts.map +1 -0
  164. package/dist/services/autocomplete.js +185 -0
  165. package/dist/services/autocomplete.js.map +1 -0
  166. package/dist/services/config-file.d.ts +73 -0
  167. package/dist/services/config-file.d.ts.map +1 -0
  168. package/dist/services/config-file.js +40 -0
  169. package/dist/services/config-file.js.map +1 -0
  170. package/dist/services/doctor.d.ts +16 -0
  171. package/dist/services/doctor.d.ts.map +1 -0
  172. package/dist/services/doctor.js +126 -0
  173. package/dist/services/doctor.js.map +1 -0
  174. package/dist/services/init.d.ts +24 -0
  175. package/dist/services/init.d.ts.map +1 -0
  176. package/dist/services/init.js +265 -0
  177. package/dist/services/init.js.map +1 -0
  178. package/dist/services/local-materialization.d.ts +30 -0
  179. package/dist/services/local-materialization.d.ts.map +1 -0
  180. package/dist/services/local-materialization.js +451 -0
  181. package/dist/services/local-materialization.js.map +1 -0
  182. package/dist/services/local-snapshot.d.ts +26 -0
  183. package/dist/services/local-snapshot.d.ts.map +1 -0
  184. package/dist/services/local-snapshot.js +119 -0
  185. package/dist/services/local-snapshot.js.map +1 -0
  186. package/dist/services/paths.d.ts +8 -0
  187. package/dist/services/paths.d.ts.map +1 -0
  188. package/dist/services/paths.js +71 -0
  189. package/dist/services/paths.js.map +1 -0
  190. package/dist/services/profile.d.ts +39 -0
  191. package/dist/services/profile.d.ts.map +1 -0
  192. package/dist/services/profile.js +124 -0
  193. package/dist/services/profile.js.map +1 -0
  194. package/dist/services/pull.d.ts +38 -0
  195. package/dist/services/pull.d.ts.map +1 -0
  196. package/dist/services/pull.js +148 -0
  197. package/dist/services/pull.js.map +1 -0
  198. package/dist/services/push.d.ts +38 -0
  199. package/dist/services/push.d.ts.map +1 -0
  200. package/dist/services/push.js +120 -0
  201. package/dist/services/push.js.map +1 -0
  202. package/dist/services/repo-artifacts.d.ts +52 -0
  203. package/dist/services/repo-artifacts.d.ts.map +1 -0
  204. package/dist/services/repo-artifacts.js +325 -0
  205. package/dist/services/repo-artifacts.js.map +1 -0
  206. package/dist/services/repo-snapshot.d.ts +7 -0
  207. package/dist/services/repo-snapshot.d.ts.map +1 -0
  208. package/dist/services/repo-snapshot.js +181 -0
  209. package/dist/services/repo-snapshot.js.map +1 -0
  210. package/dist/services/runtime.d.ts +30 -0
  211. package/dist/services/runtime.d.ts.map +1 -0
  212. package/dist/services/runtime.js +71 -0
  213. package/dist/services/runtime.js.map +1 -0
  214. package/dist/services/set.d.ts +41 -0
  215. package/dist/services/set.d.ts.map +1 -0
  216. package/dist/services/set.js +288 -0
  217. package/dist/services/set.js.map +1 -0
  218. package/dist/services/status.d.ts +41 -0
  219. package/dist/services/status.d.ts.map +1 -0
  220. package/dist/services/status.js +87 -0
  221. package/dist/services/status.js.map +1 -0
  222. package/dist/services/terminal/cli-runtime.d.ts +18 -0
  223. package/dist/services/terminal/cli-runtime.d.ts.map +1 -0
  224. package/dist/services/terminal/cli-runtime.js +19 -0
  225. package/dist/services/terminal/cli-runtime.js.map +1 -0
  226. package/dist/services/terminal/logger.d.ts +9 -0
  227. package/dist/services/terminal/logger.d.ts.map +1 -0
  228. package/dist/services/terminal/logger.js +15 -0
  229. package/dist/services/terminal/logger.js.map +1 -0
  230. package/dist/services/terminal/path-completion.d.ts +3 -0
  231. package/dist/services/terminal/path-completion.d.ts.map +1 -0
  232. package/dist/services/terminal/path-completion.js +108 -0
  233. package/dist/services/terminal/path-completion.js.map +1 -0
  234. package/dist/services/terminal/shell.d.ts +24 -0
  235. package/dist/services/terminal/shell.d.ts.map +1 -0
  236. package/dist/services/terminal/shell.js +227 -0
  237. package/dist/services/terminal/shell.js.map +1 -0
  238. package/dist/services/track.d.ts +20 -0
  239. package/dist/services/track.d.ts.map +1 -0
  240. package/dist/services/track.js +224 -0
  241. package/dist/services/track.js.map +1 -0
  242. package/dist/services/untrack.d.ts +13 -0
  243. package/dist/services/untrack.d.ts.map +1 -0
  244. package/dist/services/untrack.js +133 -0
  245. package/dist/services/untrack.js.map +1 -0
  246. package/package.json +84 -0
@@ -0,0 +1,40 @@
1
+ import { buildCommand } from "@stricli/core";
2
+ import pc from "picocolors";
3
+ import { verboseFlag, } from "#app/services/terminal/cli-runtime.ts";
4
+ import { createCliLogger } from "#app/services/terminal/logger.ts";
5
+ import { untrackTarget } from "#app/services/untrack.ts";
6
+ const untrackCommand = buildCommand({
7
+ docs: {
8
+ brief: "Stop tracking a synced path",
9
+ fullDescription: "Remove a tracked root entry or a nested override from dotweave configuration. This only updates the sync config; actual file changes happen on the next push or pull. Use a local path to remove the main tracked target, or use a repository-relative child path inside a tracked directory to remove only that override.",
10
+ },
11
+ async func(flags, target) {
12
+ const verbose = flags.verbose ?? false;
13
+ const logger = createCliLogger({ verbose });
14
+ const result = await untrackTarget({ target }, process.cwd());
15
+ logger.success(`Stopped tracking ${result.repoPath}`);
16
+ logger.log(` ${result.plainArtifactCount} plain · ${result.secretArtifactCount} secret artifacts`);
17
+ if (verbose) {
18
+ logger.log(pc.dim(` local ${result.localPath}`));
19
+ logger.log(pc.dim(` sync dir ${result.syncDirectory}`));
20
+ logger.log(pc.dim(` config ${result.configPath}`));
21
+ }
22
+ },
23
+ parameters: {
24
+ flags: {
25
+ verbose: verboseFlag,
26
+ },
27
+ positional: {
28
+ kind: "tuple",
29
+ parameters: [
30
+ {
31
+ brief: "Tracked local path (including cwd-relative) or repository path to stop tracking",
32
+ parse: String,
33
+ placeholder: "target",
34
+ },
35
+ ],
36
+ },
37
+ },
38
+ });
39
+ export default untrackCommand;
40
+ //# sourceMappingURL=untrack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"untrack.js","sourceRoot":"","sources":["../../src/cli/untrack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAEL,WAAW,GACZ,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAMzD,MAAM,cAAc,GAAG,YAAY,CACjC;IACE,IAAI,EAAE;QACJ,KAAK,EAAE,6BAA6B;QACpC,eAAe,EACb,4TAA4T;KAC/T;IACD,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM;QACtB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC;QACvC,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAE5C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAE9D,MAAM,CAAC,OAAO,CAAC,oBAAoB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,CACR,KAAK,MAAM,CAAC,kBAAkB,YAAY,MAAM,CAAC,mBAAmB,mBAAmB,CACxF,CAAC;QAEF,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YACtD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IACD,UAAU,EAAE;QACV,KAAK,EAAE;YACL,OAAO,EAAE,WAAW;SACrB;QACD,UAAU,EAAE;YACV,IAAI,EAAE,OAAO;YACb,UAAU,EAAE;gBACV;oBACE,KAAK,EACH,iFAAiF;oBACnF,KAAK,EAAE,MAAM;oBACb,WAAW,EAAE,QAAQ;iBACtB;aACF;SACF;KACF;CACF,CACF,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -0,0 +1,31 @@
1
+ export declare const CONSTANTS: {
2
+ readonly APP: {
3
+ readonly NAME: "dotweave";
4
+ };
5
+ readonly AUTOCOMPLETE: {
6
+ readonly CLI_COMMAND_NAME: "dotweave";
7
+ readonly COMMAND: "dotweave __complete";
8
+ readonly COMPLETE_SUBCOMMAND: "__complete";
9
+ };
10
+ readonly GLOBAL_CONFIG: {
11
+ readonly CURRENT_VERSION: 3;
12
+ readonly FILE_NAME: "settings.jsonc";
13
+ };
14
+ readonly INIT: {
15
+ readonly DEFAULT_IDENTITY_FILE: "~/.config/dotweave/keys.txt";
16
+ readonly LEGACY_IDENTITY_FILE: "~/.config/dotweave/age/keys.txt";
17
+ };
18
+ readonly SYNC: {
19
+ readonly CONFIG_FILE_NAME: "manifest.jsonc";
20
+ readonly CONFIG_VERSION: 7;
21
+ readonly DEFAULT_CONCURRENCY: 20;
22
+ readonly DEFAULT_PROFILE: "default";
23
+ readonly MODES: readonly ["normal", "secret", "ignore"];
24
+ readonly SECRET_ARTIFACT_SUFFIX: ".dotweave.secret";
25
+ };
26
+ readonly XDG: {
27
+ readonly APP_DIRECTORY_NAME: "dotweave";
28
+ readonly SYNC_DIRECTORY_NAME: "repository";
29
+ };
30
+ };
31
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BZ,CAAC"}
@@ -0,0 +1,33 @@
1
+ const APP_NAME = "dotweave";
2
+ const AUTOCOMPLETE_COMPLETE_SUBCOMMAND = "__complete";
3
+ export const CONSTANTS = {
4
+ APP: {
5
+ NAME: APP_NAME,
6
+ },
7
+ AUTOCOMPLETE: {
8
+ CLI_COMMAND_NAME: APP_NAME,
9
+ COMMAND: `${APP_NAME} ${AUTOCOMPLETE_COMPLETE_SUBCOMMAND}`,
10
+ COMPLETE_SUBCOMMAND: AUTOCOMPLETE_COMPLETE_SUBCOMMAND,
11
+ },
12
+ GLOBAL_CONFIG: {
13
+ CURRENT_VERSION: 3,
14
+ FILE_NAME: "settings.jsonc",
15
+ },
16
+ INIT: {
17
+ DEFAULT_IDENTITY_FILE: `~/.config/${APP_NAME}/keys.txt`,
18
+ LEGACY_IDENTITY_FILE: `~/.config/${APP_NAME}/age/keys.txt`,
19
+ },
20
+ SYNC: {
21
+ CONFIG_FILE_NAME: "manifest.jsonc",
22
+ CONFIG_VERSION: 7,
23
+ DEFAULT_CONCURRENCY: 20,
24
+ DEFAULT_PROFILE: "default",
25
+ MODES: ["normal", "secret", "ignore"],
26
+ SECRET_ARTIFACT_SUFFIX: ".dotweave.secret",
27
+ },
28
+ XDG: {
29
+ APP_DIRECTORY_NAME: APP_NAME,
30
+ SYNC_DIRECTORY_NAME: "repository",
31
+ },
32
+ };
33
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,UAAU,CAAC;AAC5B,MAAM,gCAAgC,GAAG,YAAY,CAAC;AAEtD,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,GAAG,EAAE;QACH,IAAI,EAAE,QAAQ;KACf;IACD,YAAY,EAAE;QACZ,gBAAgB,EAAE,QAAQ;QAC1B,OAAO,EAAE,GAAG,QAAQ,IAAI,gCAAgC,EAAE;QAC1D,mBAAmB,EAAE,gCAAgC;KACtD;IACD,aAAa,EAAE;QACb,eAAe,EAAE,CAAC;QAClB,SAAS,EAAE,gBAAgB;KAC5B;IACD,IAAI,EAAE;QACJ,qBAAqB,EAAE,aAAa,QAAQ,WAAW;QACvD,oBAAoB,EAAE,aAAa,QAAQ,eAAe;KAC3D;IACD,IAAI,EAAE;QACJ,gBAAgB,EAAE,gBAAgB;QAClC,cAAc,EAAE,CAAC;QACjB,mBAAmB,EAAE,EAAE;QACvB,eAAe,EAAE,SAAS;QAC1B,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;QACrC,sBAAsB,EAAE,kBAAkB;KAC3C;IACD,GAAG,EAAE;QACH,kBAAkB,EAAE,QAAQ;QAC5B,mBAAmB,EAAE,YAAY;KAClC;CACO,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { CONSTANTS } from "#app/config/constants.ts";
2
+ export type GlobalDotweaveConfig = Readonly<{
3
+ activeProfile?: string;
4
+ version: typeof CONSTANTS.GLOBAL_CONFIG.CURRENT_VERSION;
5
+ }>;
6
+ export type ActiveProfileSelection = Readonly<{
7
+ profile?: undefined;
8
+ mode: "none";
9
+ } | {
10
+ profile: string;
11
+ mode: "single";
12
+ }>;
13
+ export declare const parseGlobalDotweaveConfig: (input: unknown) => GlobalDotweaveConfig;
14
+ export declare const formatGlobalDotweaveConfig: (config: GlobalDotweaveConfig) => string;
15
+ export declare const readGlobalDotweaveConfig: (filePath: string) => Promise<Readonly<{
16
+ activeProfile?: string;
17
+ version: typeof CONSTANTS.GLOBAL_CONFIG.CURRENT_VERSION;
18
+ }> | undefined>;
19
+ export declare const resolveActiveProfileSelection: (config: GlobalDotweaveConfig | undefined) => ActiveProfileSelection;
20
+ export declare const isProfileActive: (selection: ActiveProfileSelection, profile: string | undefined) => boolean;
21
+ //# sourceMappingURL=global-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-config.d.ts","sourceRoot":"","sources":["../../src/config/global-config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAkBrD,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC1C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,SAAS,CAAC,aAAa,CAAC,eAAe,CAAC;CACzD,CAAC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CACzC;IACE,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,QAAQ,CAAC;CAChB,CACJ,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACpC,OAAO,OAAO,KACb,oBAmBF,CAAC;AAEF,eAAO,MAAM,0BAA0B,GAAI,QAAQ,oBAAoB,WAEtE,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,UAAU,MAAM;oBA1C7C,MAAM;aACb,OAAO,SAAS,CAAC,aAAa,CAAC,eAAe;eAkFxD,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,QAAQ,oBAAoB,GAAG,SAAS,KACvC,sBAWF,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,WAAW,sBAAsB,EACjC,SAAS,MAAM,GAAG,SAAS,YAW5B,CAAC"}
@@ -0,0 +1,89 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { z } from "zod";
3
+ import { CONSTANTS } from "#app/config/constants.ts";
4
+ import { runConfigMigrations } from "#app/config/migration.ts";
5
+ import { DotweaveError } from "#app/lib/error.ts";
6
+ import { parseJsonc, resolveJsoncConfigPath } from "#app/lib/jsonc.ts";
7
+ import { ensureTrailingNewline } from "#app/lib/string.ts";
8
+ import { formatInputIssues } from "#app/lib/validation.ts";
9
+ import { migrateGlobalConfigV2ToV3 } from "#app/migrations/global-v3.ts";
10
+ import { normalizeSyncProfileName } from "./sync.js";
11
+ const globalConfigMigrationRegistry = new Map([[2, migrateGlobalConfigV2ToV3]]);
12
+ const optionalTrimmedStringSchema = z.string().trim().min(1).optional();
13
+ const globalConfigSchema = z.object({
14
+ activeProfile: optionalTrimmedStringSchema,
15
+ version: z.literal(CONSTANTS.GLOBAL_CONFIG.CURRENT_VERSION),
16
+ });
17
+ export const parseGlobalDotweaveConfig = (input) => {
18
+ const result = globalConfigSchema.safeParse(input);
19
+ if (!result.success) {
20
+ throw new DotweaveError("Global dotweave configuration is invalid.", {
21
+ code: "GLOBAL_CONFIG_VALIDATION_FAILED",
22
+ details: formatInputIssues(result.error.issues).split("\n"),
23
+ hint: "Fix ~/.config/dotweave/settings.jsonc, then run the command again.",
24
+ });
25
+ }
26
+ return {
27
+ ...(result.data.activeProfile === undefined
28
+ ? {}
29
+ : {
30
+ activeProfile: normalizeSyncProfileName(result.data.activeProfile),
31
+ }),
32
+ version: result.data.version,
33
+ };
34
+ };
35
+ export const formatGlobalDotweaveConfig = (config) => {
36
+ return ensureTrailingNewline(JSON.stringify(config, null, 2));
37
+ };
38
+ export const readGlobalDotweaveConfig = async (filePath) => {
39
+ const resolvedPath = await resolveJsoncConfigPath(filePath);
40
+ try {
41
+ const contents = await readFile(resolvedPath, "utf8");
42
+ const parsed = parseJsonc(contents);
43
+ const migrated = await runConfigMigrations(parsed, globalConfigMigrationRegistry, CONSTANTS.GLOBAL_CONFIG.CURRENT_VERSION, resolvedPath);
44
+ return parseGlobalDotweaveConfig(migrated);
45
+ }
46
+ catch (error) {
47
+ if (error instanceof DotweaveError) {
48
+ throw error;
49
+ }
50
+ if (error instanceof SyntaxError) {
51
+ throw new DotweaveError("Global dotweave configuration is not valid JSON.", {
52
+ code: "GLOBAL_CONFIG_INVALID_JSON",
53
+ details: [`Config file: ${resolvedPath}`, error.message],
54
+ hint: "Fix the JSON syntax in ~/.config/dotweave/settings.jsonc, then run the command again.",
55
+ });
56
+ }
57
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") {
58
+ return undefined;
59
+ }
60
+ throw new DotweaveError("Failed to read global dotweave configuration.", {
61
+ code: "GLOBAL_CONFIG_READ_FAILED",
62
+ details: [
63
+ `Config file: ${resolvedPath}`,
64
+ ...(error instanceof Error ? [error.message] : []),
65
+ ],
66
+ });
67
+ }
68
+ };
69
+ export const resolveActiveProfileSelection = (config) => {
70
+ if (config?.activeProfile === undefined) {
71
+ return {
72
+ mode: "none",
73
+ };
74
+ }
75
+ return {
76
+ profile: config.activeProfile,
77
+ mode: "single",
78
+ };
79
+ };
80
+ export const isProfileActive = (selection, profile) => {
81
+ if (profile === undefined) {
82
+ return true;
83
+ }
84
+ if (selection.mode === "none") {
85
+ return false;
86
+ }
87
+ return selection.profile === profile;
88
+ };
89
+ //# sourceMappingURL=global-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-config.js","sourceRoot":"","sources":["../../src/config/global-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type ResolveConfiguredIdentityFileOptions = Readonly<{
2
+ configPath?: string;
3
+ hint?: string;
4
+ source?: string;
5
+ }>;
6
+ export declare const resolveDefaultIdentityFile: (home: string | undefined, xdgConfigHome: string | undefined) => string;
7
+ export declare const resolveLegacyIdentityFile: (home: string | undefined, xdgConfigHome: string | undefined) => string;
8
+ export declare const resolveConfiguredIdentityFile: (value: string, home: string | undefined, xdgConfigHome: string | undefined, options?: ResolveConfiguredIdentityFileOptions) => string;
9
+ //# sourceMappingURL=identity-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-file.d.ts","sourceRoot":"","sources":["../../src/config/identity-file.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,oCAAoC,GAAG,QAAQ,CAAC;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC,CAAC;AAIH,eAAO,MAAM,0BAA0B,GACrC,MAAM,MAAM,GAAG,SAAS,EACxB,eAAe,MAAM,GAAG,SAAS,WAOlC,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACpC,MAAM,MAAM,GAAG,SAAS,EACxB,eAAe,MAAM,GAAG,SAAS,WAOlC,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,OAAO,MAAM,EACb,MAAM,MAAM,GAAG,SAAS,EACxB,eAAe,MAAM,GAAG,SAAS,EACjC,UAAS,oCAAyC,WAmDnD,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { CONSTANTS } from "#app/config/constants.ts";
2
+ import { resolveConfiguredAbsolutePath } from "#app/config/xdg.ts";
3
+ import { DotweaveError } from "#app/lib/error.ts";
4
+ const defaultIdentityFileSource = "Configured identity file";
5
+ export const resolveDefaultIdentityFile = (home, xdgConfigHome) => {
6
+ return resolveConfiguredAbsolutePath(CONSTANTS.INIT.DEFAULT_IDENTITY_FILE, home, xdgConfigHome);
7
+ };
8
+ export const resolveLegacyIdentityFile = (home, xdgConfigHome) => {
9
+ return resolveConfiguredAbsolutePath(CONSTANTS.INIT.LEGACY_IDENTITY_FILE, home, xdgConfigHome);
10
+ };
11
+ export const resolveConfiguredIdentityFile = (value, home, xdgConfigHome, options = {}) => {
12
+ const configuredIdentityFile = value.trim();
13
+ const source = options.source ?? defaultIdentityFileSource;
14
+ let resolvedIdentityFile;
15
+ try {
16
+ resolvedIdentityFile = resolveConfiguredAbsolutePath(configuredIdentityFile, home, xdgConfigHome);
17
+ }
18
+ catch (error) {
19
+ throw new DotweaveError(error instanceof Error
20
+ ? error.message
21
+ : `Invalid age identity file path: ${value}`, {
22
+ code: "AGE_IDENTITY_PATH_INVALID",
23
+ details: [
24
+ `${source}: ${configuredIdentityFile}`,
25
+ ...(options.configPath === undefined
26
+ ? []
27
+ : [`Config file: ${options.configPath}`]),
28
+ ],
29
+ });
30
+ }
31
+ if (resolvedIdentityFile === resolveLegacyIdentityFile(home, xdgConfigHome)) {
32
+ throw new DotweaveError("Configured age identity file uses the removed legacy path.", {
33
+ code: "AGE_IDENTITY_LEGACY_PATH",
34
+ details: [
35
+ `${source}: ${configuredIdentityFile}`,
36
+ ...(options.configPath === undefined
37
+ ? []
38
+ : [`Config file: ${options.configPath}`]),
39
+ `Resolved identity file: ${resolvedIdentityFile}`,
40
+ `Supported identity file: ${resolveDefaultIdentityFile(home, xdgConfigHome)}`,
41
+ ],
42
+ hint: options.hint ??
43
+ `Update the identity file path to ${CONSTANTS.INIT.DEFAULT_IDENTITY_FILE}.`,
44
+ });
45
+ }
46
+ return resolvedIdentityFile;
47
+ };
48
+ //# sourceMappingURL=identity-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-file.js","sourceRoot":"","sources":["../../src/config/identity-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAQlD,MAAM,yBAAyB,GAAG,0BAA0B,CAAC;AAE7D,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,IAAwB,EACxB,aAAiC,EACjC,EAAE;IACF,OAAO,6BAA6B,CAClC,SAAS,CAAC,IAAI,CAAC,qBAAqB,EACpC,IAAI,EACJ,aAAa,CACd,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,IAAwB,EACxB,aAAiC,EACjC,EAAE;IACF,OAAO,6BAA6B,CAClC,SAAS,CAAC,IAAI,CAAC,oBAAoB,EACnC,IAAI,EACJ,aAAa,CACd,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAC3C,KAAa,EACb,IAAwB,EACxB,aAAiC,EACjC,UAAgD,EAAE,EAClD,EAAE;IACF,MAAM,sBAAsB,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,yBAAyB,CAAC;IAE3D,IAAI,oBAA4B,CAAC;IAEjC,IAAI,CAAC;QACH,oBAAoB,GAAG,6BAA6B,CAClD,sBAAsB,EACtB,IAAI,EACJ,aAAa,CACd,CAAC;IACJ,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,IAAI,aAAa,CACrB,KAAK,YAAY,KAAK;YACpB,CAAC,CAAC,KAAK,CAAC,OAAO;YACf,CAAC,CAAC,mCAAmC,KAAK,EAAE,EAC9C;YACE,IAAI,EAAE,2BAA2B;YACjC,OAAO,EAAE;gBACP,GAAG,MAAM,KAAK,sBAAsB,EAAE;gBACtC,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS;oBAClC,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,CAAC,gBAAgB,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;aAC5C;SACF,CACF,CAAC;IACJ,CAAC;IAED,IAAI,oBAAoB,KAAK,yBAAyB,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,aAAa,CACrB,4DAA4D,EAC5D;YACE,IAAI,EAAE,0BAA0B;YAChC,OAAO,EAAE;gBACP,GAAG,MAAM,KAAK,sBAAsB,EAAE;gBACtC,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS;oBAClC,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,CAAC,gBAAgB,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;gBAC3C,2BAA2B,oBAAoB,EAAE;gBACjD,4BAA4B,0BAA0B,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE;aAC9E;YACD,IAAI,EACF,OAAO,CAAC,IAAI;gBACZ,oCAAoC,SAAS,CAAC,IAAI,CAAC,qBAAqB,GAAG;SAC9E,CACF,CAAC;IACJ,CAAC;IAED,OAAO,oBAAoB,CAAC;AAC9B,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type ConfigMigrationFn = (config: Record<string, unknown>) => Record<string, unknown>;
2
+ export type ConfigMigrationRegistry = ReadonlyMap<number, ConfigMigrationFn>;
3
+ /**
4
+ * Applies sequential config migrations from the detected version up to targetVersion.
5
+ * Creates a backup file before the first migration step, then saves the result.
6
+ * Returns the migrated config (or the original if no migration was needed).
7
+ */
8
+ export declare const runConfigMigrations: (rawConfig: unknown, registry: ConfigMigrationRegistry, targetVersion: number, filePath: string) => Promise<unknown>;
9
+ //# sourceMappingURL=migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../src/config/migration.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,iBAAiB,GAAG,CAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE7B,MAAM,MAAM,uBAAuB,GAAG,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AAE7E;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAC9B,WAAW,OAAO,EAClB,UAAU,uBAAuB,EACjC,eAAe,MAAM,EACrB,UAAU,MAAM,KACf,OAAO,CAAC,OAAO,CAgFjB,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { writeFile } from "node:fs/promises";
2
+ import { basename, dirname, join } from "node:path";
3
+ import { DotweaveError } from "#app/lib/error.ts";
4
+ import { writeTextFileAtomically } from "#app/lib/filesystem.ts";
5
+ import { ensureTrailingNewline } from "#app/lib/string.ts";
6
+ /**
7
+ * Applies sequential config migrations from the detected version up to targetVersion.
8
+ * Creates a backup file before the first migration step, then saves the result.
9
+ * Returns the migrated config (or the original if no migration was needed).
10
+ */
11
+ export const runConfigMigrations = async (rawConfig, registry, targetVersion, filePath) => {
12
+ if (typeof rawConfig !== "object" ||
13
+ rawConfig === null ||
14
+ Array.isArray(rawConfig)) {
15
+ return rawConfig;
16
+ }
17
+ const configObject = rawConfig;
18
+ // biome-ignore lint/complexity/useLiteralKeys: noPropertyAccessFromIndexSignature requires bracket notation
19
+ const version = configObject["version"];
20
+ if (typeof version !== "number") {
21
+ return rawConfig;
22
+ }
23
+ if (version === targetVersion) {
24
+ return rawConfig;
25
+ }
26
+ if (version > targetVersion) {
27
+ throw new DotweaveError(`Config file version ${version} is newer than this CLI supports (max: ${targetVersion}).`, {
28
+ code: "CONFIG_NEWER_VERSION",
29
+ details: [`Config file: ${filePath}`],
30
+ hint: "Upgrade dotweave to the latest version.",
31
+ });
32
+ }
33
+ const backupPath = join(dirname(filePath), `${basename(filePath)}.v${version}.bak`);
34
+ await writeFile(backupPath, ensureTrailingNewline(JSON.stringify(configObject, null, 2)), "utf8");
35
+ let current = configObject;
36
+ for (let v = version; v < targetVersion; v++) {
37
+ const migrateFn = registry.get(v);
38
+ if (migrateFn === undefined) {
39
+ throw new DotweaveError(`No migration path found for config version ${v} → ${v + 1}.`, {
40
+ code: "CONFIG_MIGRATION_NOT_FOUND",
41
+ details: [`Config file: ${filePath}`],
42
+ hint: "Upgrade dotweave to the latest version.",
43
+ });
44
+ }
45
+ try {
46
+ current = migrateFn(current);
47
+ }
48
+ catch (error) {
49
+ throw new DotweaveError(`Failed to migrate config from version ${v} to ${v + 1}.`, {
50
+ code: "CONFIG_MIGRATION_FAILED",
51
+ details: [
52
+ `Config file: ${filePath}`,
53
+ ...(error instanceof Error ? [error.message] : []),
54
+ ],
55
+ });
56
+ }
57
+ }
58
+ await writeTextFileAtomically(filePath, ensureTrailingNewline(JSON.stringify(current, null, 2)));
59
+ return current;
60
+ };
61
+ //# sourceMappingURL=migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/config/migration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export type PlatformKey = "win" | "mac" | "linux" | "wsl";
2
+ export type PlatformStringValue = Readonly<{
3
+ default: string;
4
+ win?: string;
5
+ mac?: string;
6
+ linux?: string;
7
+ wsl?: string;
8
+ }>;
9
+ export declare const isWslEnvironment: (osRelease: string, wslDistroName: string | undefined, wslInterop: string | undefined) => boolean;
10
+ export declare const detectCurrentPlatformKey: (platformName: NodeJS.Platform, osRelease: string, wslDistroName: string | undefined, wslInterop: string | undefined) => PlatformKey;
11
+ export declare const resolvePlatformValue: (value: PlatformStringValue, platformKey: PlatformKey) => string;
12
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/config/platform.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,CAAC;AAE1D,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC,CAAC;AAEH,eAAO,MAAM,gBAAgB,GAC3B,WAAW,MAAM,EACjB,eAAe,MAAM,GAAG,SAAS,EACjC,YAAY,MAAM,GAAG,SAAS,KAC7B,OAKF,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,cAAc,MAAM,CAAC,QAAQ,EAC7B,WAAW,MAAM,EACjB,eAAe,MAAM,GAAG,SAAS,EACjC,YAAY,MAAM,GAAG,SAAS,KAC7B,WAaF,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,OAAO,mBAAmB,EAC1B,aAAa,WAAW,KACvB,MAMF,CAAC"}
@@ -0,0 +1,25 @@
1
+ export const isWslEnvironment = (osRelease, wslDistroName, wslInterop) => {
2
+ return (Boolean(wslDistroName?.trim() || wslInterop?.trim()) ||
3
+ osRelease.toLowerCase().includes("microsoft"));
4
+ };
5
+ export const detectCurrentPlatformKey = (platformName, osRelease, wslDistroName, wslInterop) => {
6
+ switch (platformName) {
7
+ case "win32":
8
+ return "win";
9
+ case "darwin":
10
+ return "mac";
11
+ case "linux":
12
+ return isWslEnvironment(osRelease, wslDistroName, wslInterop)
13
+ ? "wsl"
14
+ : "linux";
15
+ default:
16
+ return "linux";
17
+ }
18
+ };
19
+ export const resolvePlatformValue = (value, platformKey) => {
20
+ if (platformKey === "wsl") {
21
+ return value.wsl ?? value.linux ?? value.default;
22
+ }
23
+ return value[platformKey] ?? value.default;
24
+ };
25
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/config/platform.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,SAAiB,EACjB,aAAiC,EACjC,UAA8B,EACrB,EAAE;IACX,OAAO,CACL,OAAO,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,UAAU,EAAE,IAAI,EAAE,CAAC;QACpD,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC9C,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,YAA6B,EAC7B,SAAiB,EACjB,aAAiC,EACjC,UAA8B,EACjB,EAAE;IACf,QAAQ,YAAY,EAAE,CAAC;QACrB,KAAK,OAAO;YACV,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC;QACf,KAAK,OAAO;YACV,OAAO,gBAAgB,CAAC,SAAS,EAAE,aAAa,EAAE,UAAU,CAAC;gBAC3D,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,OAAO,CAAC;QACd;YACE,OAAO,OAAO,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,KAA0B,EAC1B,WAAwB,EAChB,EAAE;IACV,IAAI,WAAW,KAAK,KAAK,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC;IACnD,CAAC;IAED,OAAO,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC;AAC7C,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const readEnvValue: (name: string) => string | undefined;
2
+ export declare const resolveHomeDirectoryFromEnv: () => string;
3
+ export declare const resolveXdgConfigHomeFromEnv: () => string;
4
+ export declare const resolveDotweaveGlobalConfigFilePathFromEnv: () => string;
5
+ export declare const resolveDotweaveSyncDirectoryFromEnv: () => string;
6
+ export declare const resolveCurrentPlatformKey: () => import("#app/config/platform.ts").PlatformKey;
7
+ //# sourceMappingURL=runtime-env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-env.d.ts","sourceRoot":"","sources":["../../src/config/runtime-env.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,uBAExC,CAAC;AAEF,eAAO,MAAM,2BAA2B,cAEvC,CAAC;AAEF,eAAO,MAAM,2BAA2B,cAKvC,CAAC;AAEF,eAAO,MAAM,0CAA0C,cAKtD,CAAC;AAEF,eAAO,MAAM,mCAAmC,cAK/C,CAAC;AAEF,eAAO,MAAM,yBAAyB,qDAOrC,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { platform, release } from "node:os";
2
+ import { detectCurrentPlatformKey } from "#app/config/platform.ts";
3
+ import { resolveDotweaveConfigDirectory, resolveDotweaveGlobalConfigFilePath, resolveDotweaveSyncDirectory, resolveHomeDirectory, resolveXdgConfigHome, } from "#app/config/xdg.ts";
4
+ import { ENV } from "#app/lib/env.ts";
5
+ const trimConfiguredValue = (value) => {
6
+ const trimmedValue = value?.trim();
7
+ return trimmedValue === undefined || trimmedValue === ""
8
+ ? undefined
9
+ : trimmedValue;
10
+ };
11
+ export const readEnvValue = (name) => {
12
+ return trimConfiguredValue(ENV[name]);
13
+ };
14
+ export const resolveHomeDirectoryFromEnv = () => {
15
+ return resolveHomeDirectory(readEnvValue("HOME"));
16
+ };
17
+ export const resolveXdgConfigHomeFromEnv = () => {
18
+ return resolveXdgConfigHome(readEnvValue("HOME"), readEnvValue("XDG_CONFIG_HOME"));
19
+ };
20
+ export const resolveDotweaveGlobalConfigFilePathFromEnv = () => {
21
+ const configDirectory = resolveDotweaveConfigDirectory(resolveXdgConfigHomeFromEnv());
22
+ return resolveDotweaveGlobalConfigFilePath(configDirectory);
23
+ };
24
+ export const resolveDotweaveSyncDirectoryFromEnv = () => {
25
+ const configDirectory = resolveDotweaveConfigDirectory(resolveXdgConfigHomeFromEnv());
26
+ return resolveDotweaveSyncDirectory(configDirectory);
27
+ };
28
+ export const resolveCurrentPlatformKey = () => {
29
+ return detectCurrentPlatformKey(platform(), release(), readEnvValue("WSL_DISTRO_NAME"), readEnvValue("WSL_INTEROP"));
30
+ };
31
+ //# sourceMappingURL=runtime-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-env.js","sourceRoot":"","sources":["../../src/config/runtime-env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EACL,8BAA8B,EAC9B,mCAAmC,EACnC,4BAA4B,EAC5B,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC,MAAM,mBAAmB,GAAG,CAAC,KAAyB,EAAE,EAAE;IACxD,MAAM,YAAY,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAEnC,OAAO,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,EAAE;QACtD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,YAAY,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,EAAE;IAC3C,OAAO,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AACxC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,EAAE;IAC9C,OAAO,oBAAoB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,EAAE;IAC9C,OAAO,oBAAoB,CACzB,YAAY,CAAC,MAAM,CAAC,EACpB,YAAY,CAAC,iBAAiB,CAAC,CAChC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0CAA0C,GAAG,GAAG,EAAE;IAC7D,MAAM,eAAe,GAAG,8BAA8B,CACpD,2BAA2B,EAAE,CAC9B,CAAC;IACF,OAAO,mCAAmC,CAAC,eAAe,CAAC,CAAC;AAC9D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mCAAmC,GAAG,GAAG,EAAE;IACtD,MAAM,eAAe,GAAG,8BAA8B,CACpD,2BAA2B,EAAE,CAC9B,CAAC;IACF,OAAO,4BAA4B,CAAC,eAAe,CAAC,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,EAAE;IAC5C,OAAO,wBAAwB,CAC7B,QAAQ,EAAE,EACV,OAAO,EAAE,EACT,YAAY,CAAC,iBAAiB,CAAC,EAC/B,YAAY,CAAC,aAAa,CAAC,CAC5B,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { ResolvedSyncConfig, ResolvedSyncConfigEntry, SyncMode } from "#app/config/sync-schema.ts";
2
+ export declare const findOwningSyncEntry: (config: Pick<ResolvedSyncConfig, "entries">, repoPath: string) => ResolvedSyncConfigEntry | undefined;
3
+ export declare const collectChildEntryPaths: (config: Pick<ResolvedSyncConfig, "entries">, repoPath: string) => ReadonlySet<string>;
4
+ export declare const resolveEntryRelativeRepoPath: (entry: Pick<ResolvedSyncConfigEntry, "kind" | "repoPath">, repoPath: string) => string | undefined;
5
+ export declare const resolveSyncRule: (config: ResolvedSyncConfig, repoPath: string, activeProfile?: string) => {
6
+ mode: SyncMode;
7
+ profile: string;
8
+ } | undefined;
9
+ export declare const resolveSyncMode: (config: ResolvedSyncConfig, repoPath: string, activeProfile?: string) => SyncMode | undefined;
10
+ export declare const isIgnoredSyncPath: (config: ResolvedSyncConfig, repoPath: string) => boolean;
11
+ export declare const isSecretSyncPath: (config: ResolvedSyncConfig, repoPath: string) => boolean;
12
+ export declare const resolveManagedSyncMode: (config: ResolvedSyncConfig, repoPath: string, activeProfile?: string, context?: string) => "normal" | "secret" | "ignore";
13
+ export declare const collectAllProfileNames: (entries: readonly ResolvedSyncConfigEntry[]) => string[];
14
+ //# sourceMappingURL=sync-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-entry.d.ts","sourceRoot":"","sources":["../../src/config/sync-entry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,uBAAuB,EACvB,QAAQ,EACT,MAAM,4BAA4B,CAAC;AAiBpC,eAAO,MAAM,mBAAmB,GAC9B,QAAQ,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,EAC3C,UAAU,MAAM,KACf,uBAAuB,GAAG,SAa5B,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,QAAQ,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,EAC3C,UAAU,MAAM,KACf,WAAW,CAAC,MAAM,CASpB,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,OAAO,IAAI,CAAC,uBAAuB,EAAE,MAAM,GAAG,UAAU,CAAC,EACzD,UAAU,MAAM,uBAejB,CAAC;AAuBF,eAAO,MAAM,eAAe,GAC1B,QAAQ,kBAAkB,EAC1B,UAAU,MAAM,EAChB,gBAAgB,MAAM,KACrB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,SAcxC,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,QAAQ,kBAAkB,EAC1B,UAAU,MAAM,EAChB,gBAAgB,MAAM,KACrB,QAAQ,GAAG,SAEb,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,kBAAkB,EAC1B,UAAU,MAAM,YAGjB,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,kBAAkB,EAC1B,UAAU,MAAM,YAGjB,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,QAAQ,kBAAkB,EAC1B,UAAU,MAAM,EAChB,gBAAgB,MAAM,EACtB,UAAU,MAAM,mCAmBjB,CAAC;AAMF,eAAO,MAAM,sBAAsB,GACjC,SAAS,SAAS,uBAAuB,EAAE,KAC1C,MAAM,EAUR,CAAC"}
@@ -0,0 +1,99 @@
1
+ import { CONSTANTS } from "#app/config/constants.ts";
2
+ import { DotweaveError } from "#app/lib/error.ts";
3
+ // ---------------------------------------------------------------------------
4
+ // Entry lookup
5
+ // ---------------------------------------------------------------------------
6
+ const matchesEntryPath = (entry, repoPath) => {
7
+ return (entry.repoPath === repoPath ||
8
+ (entry.kind === "directory" && repoPath.startsWith(`${entry.repoPath}/`)));
9
+ };
10
+ export const findOwningSyncEntry = (config, repoPath) => {
11
+ let best;
12
+ for (const entry of config.entries) {
13
+ if (matchesEntryPath(entry, repoPath) &&
14
+ (best === undefined || entry.repoPath.length > best.repoPath.length)) {
15
+ best = entry;
16
+ }
17
+ }
18
+ return best;
19
+ };
20
+ export const collectChildEntryPaths = (config, repoPath) => {
21
+ return new Set(config.entries.flatMap((entry) => {
22
+ return entry.repoPath !== repoPath &&
23
+ entry.repoPath.startsWith(`${repoPath}/`)
24
+ ? [entry.repoPath]
25
+ : [];
26
+ }));
27
+ };
28
+ export const resolveEntryRelativeRepoPath = (entry, repoPath) => {
29
+ if (entry.kind === "file") {
30
+ return repoPath === entry.repoPath ? "" : undefined;
31
+ }
32
+ if (repoPath === entry.repoPath) {
33
+ return "";
34
+ }
35
+ if (!repoPath.startsWith(`${entry.repoPath}/`)) {
36
+ return undefined;
37
+ }
38
+ return repoPath.slice(entry.repoPath.length + 1);
39
+ };
40
+ // ---------------------------------------------------------------------------
41
+ // Mode / rule resolution
42
+ // ---------------------------------------------------------------------------
43
+ const resolveProfileForEntry = (entry, activeProfile) => {
44
+ if (entry.profiles.length === 0) {
45
+ return CONSTANTS.SYNC.DEFAULT_PROFILE;
46
+ }
47
+ const effective = activeProfile !== undefined &&
48
+ activeProfile !== CONSTANTS.SYNC.DEFAULT_PROFILE
49
+ ? activeProfile
50
+ : CONSTANTS.SYNC.DEFAULT_PROFILE;
51
+ return entry.profiles.includes(effective) ? effective : undefined;
52
+ };
53
+ export const resolveSyncRule = (config, repoPath, activeProfile) => {
54
+ const entry = findOwningSyncEntry(config, repoPath);
55
+ if (entry === undefined) {
56
+ return undefined;
57
+ }
58
+ const profile = resolveProfileForEntry(entry, activeProfile);
59
+ if (profile === undefined) {
60
+ return undefined;
61
+ }
62
+ return { mode: entry.mode, profile };
63
+ };
64
+ export const resolveSyncMode = (config, repoPath, activeProfile) => {
65
+ return resolveSyncRule(config, repoPath, activeProfile)?.mode;
66
+ };
67
+ export const isIgnoredSyncPath = (config, repoPath) => {
68
+ return resolveSyncMode(config, repoPath) === "ignore";
69
+ };
70
+ export const isSecretSyncPath = (config, repoPath) => {
71
+ return resolveSyncMode(config, repoPath) === "secret";
72
+ };
73
+ export const resolveManagedSyncMode = (config, repoPath, activeProfile, context) => {
74
+ const mode = resolveSyncMode(config, repoPath, activeProfile);
75
+ if (mode === undefined) {
76
+ throw new DotweaveError("Repository path is not managed by the current sync configuration.", {
77
+ code: "UNMANAGED_SYNC_PATH",
78
+ details: [
79
+ `Repository path: ${repoPath}`,
80
+ ...(context === undefined ? [] : [`Context: ${context}`]),
81
+ ],
82
+ hint: "Add the parent path to dotweave, or remove stray artifacts from the sync directory.",
83
+ });
84
+ }
85
+ return mode;
86
+ };
87
+ // ---------------------------------------------------------------------------
88
+ // Profile collection
89
+ // ---------------------------------------------------------------------------
90
+ export const collectAllProfileNames = (entries) => {
91
+ const profiles = new Set();
92
+ for (const entry of entries) {
93
+ for (const profile of entry.profiles) {
94
+ profiles.add(profile);
95
+ }
96
+ }
97
+ return [...profiles].sort((left, right) => left.localeCompare(right));
98
+ };
99
+ //# sourceMappingURL=sync-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-entry.js","sourceRoot":"","sources":["../../src/config/sync-entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAMrD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,MAAM,gBAAgB,GAAG,CACvB,KAAyD,EACzD,QAAgB,EAChB,EAAE;IACF,OAAO,CACL,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAC3B,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAC1E,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,MAA2C,EAC3C,QAAgB,EACqB,EAAE;IACvC,IAAI,IAAyC,CAAC;IAE9C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnC,IACE,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC;YACjC,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EACpE,CAAC;YACD,IAAI,GAAG,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,MAA2C,EAC3C,QAAgB,EACK,EAAE;IACvB,OAAO,IAAI,GAAG,CACZ,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC/B,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;YAChC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC;YACzC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;YAClB,CAAC,CAAC,EAAE,CAAC;IACT,CAAC,CAAC,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,KAAyD,EACzD,QAAgB,EAChB,EAAE;IACF,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACtD,CAAC;IAED,IAAI,QAAQ,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,MAAM,sBAAsB,GAAG,CAC7B,KAAgD,EAChD,aAAiC,EACb,EAAE;IACtB,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC;IACxC,CAAC;IAED,MAAM,SAAS,GACb,aAAa,KAAK,SAAS;QAC3B,aAAa,KAAK,SAAS,CAAC,IAAI,CAAC,eAAe;QAC9C,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC;IAErC,OAAO,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACpE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,MAA0B,EAC1B,QAAgB,EAChB,aAAsB,EAC2B,EAAE;IACnD,MAAM,KAAK,GAAG,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEpD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,sBAAsB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAE7D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,MAA0B,EAC1B,QAAgB,EAChB,aAAsB,EACA,EAAE;IACxB,OAAO,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC;AAChE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,MAA0B,EAC1B,QAAgB,EAChB,EAAE;IACF,OAAO,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,QAAQ,CAAC;AACxD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,MAA0B,EAC1B,QAAgB,EAChB,EAAE;IACF,OAAO,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,QAAQ,CAAC;AACxD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,MAA0B,EAC1B,QAAgB,EAChB,aAAsB,EACtB,OAAgB,EAChB,EAAE;IACF,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAE9D,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,aAAa,CACrB,mEAAmE,EACnE;YACE,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE;gBACP,oBAAoB,QAAQ,EAAE;gBAC9B,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;aAC1D;YACD,IAAI,EAAE,qFAAqF;SAC5F,CACF,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,OAA2C,EACjC,EAAE;IACZ,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACxE,CAAC,CAAC"}