pushwork 2.0.0-a.sub.0 → 2.0.0-preview

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 (251) hide show
  1. package/dist/branches.d.ts +19 -0
  2. package/dist/branches.d.ts.map +1 -0
  3. package/dist/branches.js +111 -0
  4. package/dist/branches.js.map +1 -0
  5. package/dist/cli.d.ts +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +238 -272
  8. package/dist/cli.js.map +1 -1
  9. package/dist/config.d.ts +17 -0
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/config.js +84 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/fs-tree.d.ts +6 -0
  14. package/dist/fs-tree.d.ts.map +1 -0
  15. package/dist/fs-tree.js +99 -0
  16. package/dist/fs-tree.js.map +1 -0
  17. package/dist/ignore.d.ts +6 -0
  18. package/dist/ignore.d.ts.map +1 -0
  19. package/dist/ignore.js +74 -0
  20. package/dist/ignore.js.map +1 -0
  21. package/dist/index.d.ts +8 -4
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +34 -4
  24. package/dist/index.js.map +1 -1
  25. package/dist/log.d.ts +3 -0
  26. package/dist/log.d.ts.map +1 -0
  27. package/dist/log.js +14 -0
  28. package/dist/log.js.map +1 -0
  29. package/dist/pushwork.d.ts +115 -0
  30. package/dist/pushwork.d.ts.map +1 -0
  31. package/dist/pushwork.js +918 -0
  32. package/dist/pushwork.js.map +1 -0
  33. package/dist/repo.d.ts +14 -0
  34. package/dist/repo.d.ts.map +1 -0
  35. package/dist/repo.js +60 -0
  36. package/dist/repo.js.map +1 -0
  37. package/dist/shapes/custom.d.ts +3 -0
  38. package/dist/shapes/custom.d.ts.map +1 -0
  39. package/dist/shapes/custom.js +57 -0
  40. package/dist/shapes/custom.js.map +1 -0
  41. package/dist/shapes/file.d.ts +20 -0
  42. package/dist/shapes/file.d.ts.map +1 -0
  43. package/dist/shapes/file.js +140 -0
  44. package/dist/shapes/file.js.map +1 -0
  45. package/dist/shapes/index.d.ts +10 -0
  46. package/dist/shapes/index.d.ts.map +1 -0
  47. package/dist/shapes/index.js +35 -0
  48. package/dist/shapes/index.js.map +1 -0
  49. package/dist/shapes/patchwork-folder.d.ts +3 -0
  50. package/dist/shapes/patchwork-folder.d.ts.map +1 -0
  51. package/dist/shapes/patchwork-folder.js +160 -0
  52. package/dist/shapes/patchwork-folder.js.map +1 -0
  53. package/dist/shapes/types.d.ts +37 -0
  54. package/dist/shapes/types.d.ts.map +1 -0
  55. package/dist/shapes/types.js +52 -0
  56. package/dist/shapes/types.js.map +1 -0
  57. package/dist/shapes/vfs.d.ts +3 -0
  58. package/dist/shapes/vfs.d.ts.map +1 -0
  59. package/dist/shapes/vfs.js +88 -0
  60. package/dist/shapes/vfs.js.map +1 -0
  61. package/dist/stash.d.ts +23 -0
  62. package/dist/stash.d.ts.map +1 -0
  63. package/dist/stash.js +118 -0
  64. package/dist/stash.js.map +1 -0
  65. package/flake.lock +128 -0
  66. package/flake.nix +66 -0
  67. package/package.json +15 -48
  68. package/patches/@automerge__automerge-repo@2.6.0-subduction.15.patch +26 -0
  69. package/pnpm-workspace.yaml +5 -0
  70. package/src/branches.ts +93 -0
  71. package/src/cli.ts +258 -408
  72. package/src/config.ts +64 -0
  73. package/src/fs-tree.ts +70 -0
  74. package/src/ignore.ts +33 -0
  75. package/src/index.ts +38 -4
  76. package/src/log.ts +8 -0
  77. package/src/pushwork.ts +1055 -0
  78. package/src/repo.ts +76 -0
  79. package/src/shapes/custom.ts +29 -0
  80. package/src/shapes/file.ts +115 -0
  81. package/src/shapes/index.ts +19 -0
  82. package/src/shapes/patchwork-folder.ts +156 -0
  83. package/src/shapes/types.ts +79 -0
  84. package/src/shapes/vfs.ts +93 -0
  85. package/src/stash.ts +106 -0
  86. package/test/integration/branches.test.ts +389 -0
  87. package/test/integration/pushwork.test.ts +547 -0
  88. package/test/setup.ts +29 -0
  89. package/test/unit/doc-shape.test.ts +612 -0
  90. package/tsconfig.json +2 -3
  91. package/vitest.config.ts +14 -0
  92. package/ARCHITECTURE-ACCORDING-TO-CLAUDE.md +0 -248
  93. package/CLAUDE.md +0 -141
  94. package/README.md +0 -221
  95. package/babel.config.js +0 -5
  96. package/dist/cli/commands.d.ts +0 -71
  97. package/dist/cli/commands.d.ts.map +0 -1
  98. package/dist/cli/commands.js +0 -794
  99. package/dist/cli/commands.js.map +0 -1
  100. package/dist/cli/index.d.ts +0 -2
  101. package/dist/cli/index.d.ts.map +0 -1
  102. package/dist/cli/index.js +0 -19
  103. package/dist/cli/index.js.map +0 -1
  104. package/dist/commands.d.ts +0 -61
  105. package/dist/commands.d.ts.map +0 -1
  106. package/dist/commands.js +0 -861
  107. package/dist/commands.js.map +0 -1
  108. package/dist/config/index.d.ts +0 -71
  109. package/dist/config/index.d.ts.map +0 -1
  110. package/dist/config/index.js +0 -314
  111. package/dist/config/index.js.map +0 -1
  112. package/dist/core/change-detection.d.ts +0 -80
  113. package/dist/core/change-detection.d.ts.map +0 -1
  114. package/dist/core/change-detection.js +0 -523
  115. package/dist/core/change-detection.js.map +0 -1
  116. package/dist/core/config.d.ts +0 -81
  117. package/dist/core/config.d.ts.map +0 -1
  118. package/dist/core/config.js +0 -258
  119. package/dist/core/config.js.map +0 -1
  120. package/dist/core/index.d.ts +0 -6
  121. package/dist/core/index.d.ts.map +0 -1
  122. package/dist/core/index.js +0 -6
  123. package/dist/core/index.js.map +0 -1
  124. package/dist/core/move-detection.d.ts +0 -34
  125. package/dist/core/move-detection.d.ts.map +0 -1
  126. package/dist/core/move-detection.js +0 -121
  127. package/dist/core/move-detection.js.map +0 -1
  128. package/dist/core/snapshot.d.ts +0 -105
  129. package/dist/core/snapshot.d.ts.map +0 -1
  130. package/dist/core/snapshot.js +0 -217
  131. package/dist/core/snapshot.js.map +0 -1
  132. package/dist/core/sync-engine.d.ts +0 -151
  133. package/dist/core/sync-engine.d.ts.map +0 -1
  134. package/dist/core/sync-engine.js +0 -1346
  135. package/dist/core/sync-engine.js.map +0 -1
  136. package/dist/types/config.d.ts +0 -99
  137. package/dist/types/config.d.ts.map +0 -1
  138. package/dist/types/config.js +0 -5
  139. package/dist/types/config.js.map +0 -1
  140. package/dist/types/documents.d.ts +0 -88
  141. package/dist/types/documents.d.ts.map +0 -1
  142. package/dist/types/documents.js +0 -20
  143. package/dist/types/documents.js.map +0 -1
  144. package/dist/types/index.d.ts +0 -4
  145. package/dist/types/index.d.ts.map +0 -1
  146. package/dist/types/index.js +0 -4
  147. package/dist/types/index.js.map +0 -1
  148. package/dist/types/snapshot.d.ts +0 -64
  149. package/dist/types/snapshot.d.ts.map +0 -1
  150. package/dist/types/snapshot.js +0 -2
  151. package/dist/types/snapshot.js.map +0 -1
  152. package/dist/utils/content-similarity.d.ts +0 -53
  153. package/dist/utils/content-similarity.d.ts.map +0 -1
  154. package/dist/utils/content-similarity.js +0 -155
  155. package/dist/utils/content-similarity.js.map +0 -1
  156. package/dist/utils/content.d.ts +0 -10
  157. package/dist/utils/content.d.ts.map +0 -1
  158. package/dist/utils/content.js +0 -31
  159. package/dist/utils/content.js.map +0 -1
  160. package/dist/utils/directory.d.ts +0 -24
  161. package/dist/utils/directory.d.ts.map +0 -1
  162. package/dist/utils/directory.js +0 -52
  163. package/dist/utils/directory.js.map +0 -1
  164. package/dist/utils/fs.d.ts +0 -74
  165. package/dist/utils/fs.d.ts.map +0 -1
  166. package/dist/utils/fs.js +0 -248
  167. package/dist/utils/fs.js.map +0 -1
  168. package/dist/utils/index.d.ts +0 -5
  169. package/dist/utils/index.d.ts.map +0 -1
  170. package/dist/utils/index.js +0 -5
  171. package/dist/utils/index.js.map +0 -1
  172. package/dist/utils/mime-types.d.ts +0 -13
  173. package/dist/utils/mime-types.d.ts.map +0 -1
  174. package/dist/utils/mime-types.js +0 -209
  175. package/dist/utils/mime-types.js.map +0 -1
  176. package/dist/utils/network-sync.d.ts +0 -36
  177. package/dist/utils/network-sync.d.ts.map +0 -1
  178. package/dist/utils/network-sync.js +0 -250
  179. package/dist/utils/network-sync.js.map +0 -1
  180. package/dist/utils/node-polyfills.d.ts +0 -9
  181. package/dist/utils/node-polyfills.d.ts.map +0 -1
  182. package/dist/utils/node-polyfills.js +0 -9
  183. package/dist/utils/node-polyfills.js.map +0 -1
  184. package/dist/utils/output.d.ts +0 -129
  185. package/dist/utils/output.d.ts.map +0 -1
  186. package/dist/utils/output.js +0 -368
  187. package/dist/utils/output.js.map +0 -1
  188. package/dist/utils/repo-factory.d.ts +0 -13
  189. package/dist/utils/repo-factory.d.ts.map +0 -1
  190. package/dist/utils/repo-factory.js +0 -46
  191. package/dist/utils/repo-factory.js.map +0 -1
  192. package/dist/utils/string-similarity.d.ts +0 -14
  193. package/dist/utils/string-similarity.d.ts.map +0 -1
  194. package/dist/utils/string-similarity.js +0 -39
  195. package/dist/utils/string-similarity.js.map +0 -1
  196. package/dist/utils/text-diff.d.ts +0 -37
  197. package/dist/utils/text-diff.d.ts.map +0 -1
  198. package/dist/utils/text-diff.js +0 -93
  199. package/dist/utils/text-diff.js.map +0 -1
  200. package/dist/utils/trace.d.ts +0 -19
  201. package/dist/utils/trace.d.ts.map +0 -1
  202. package/dist/utils/trace.js +0 -63
  203. package/dist/utils/trace.js.map +0 -1
  204. package/src/commands.ts +0 -1134
  205. package/src/core/change-detection.ts +0 -712
  206. package/src/core/config.ts +0 -313
  207. package/src/core/index.ts +0 -5
  208. package/src/core/move-detection.ts +0 -169
  209. package/src/core/snapshot.ts +0 -275
  210. package/src/core/sync-engine.ts +0 -1758
  211. package/src/types/config.ts +0 -111
  212. package/src/types/documents.ts +0 -91
  213. package/src/types/index.ts +0 -3
  214. package/src/types/snapshot.ts +0 -67
  215. package/src/utils/content.ts +0 -34
  216. package/src/utils/directory.ts +0 -73
  217. package/src/utils/fs.ts +0 -297
  218. package/src/utils/index.ts +0 -4
  219. package/src/utils/mime-types.ts +0 -244
  220. package/src/utils/network-sync.ts +0 -319
  221. package/src/utils/node-polyfills.ts +0 -8
  222. package/src/utils/output.ts +0 -450
  223. package/src/utils/repo-factory.ts +0 -73
  224. package/src/utils/string-similarity.ts +0 -54
  225. package/src/utils/text-diff.ts +0 -101
  226. package/src/utils/trace.ts +0 -70
  227. package/test/integration/README.md +0 -328
  228. package/test/integration/clone-test.sh +0 -310
  229. package/test/integration/conflict-resolution-test.sh +0 -309
  230. package/test/integration/debug-both-nested.sh +0 -74
  231. package/test/integration/debug-concurrent-nested.sh +0 -87
  232. package/test/integration/debug-nested.sh +0 -73
  233. package/test/integration/deletion-behavior-test.sh +0 -487
  234. package/test/integration/deletion-sync-test-simple.sh +0 -193
  235. package/test/integration/deletion-sync-test.sh +0 -297
  236. package/test/integration/exclude-patterns.test.ts +0 -144
  237. package/test/integration/full-integration-test.sh +0 -363
  238. package/test/integration/fuzzer.test.ts +0 -818
  239. package/test/integration/in-memory-sync.test.ts +0 -830
  240. package/test/integration/init-sync.test.ts +0 -89
  241. package/test/integration/manual-sync-test.sh +0 -84
  242. package/test/integration/sync-deletion.test.ts +0 -280
  243. package/test/integration/sync-flow.test.ts +0 -291
  244. package/test/jest.setup.ts +0 -34
  245. package/test/run-tests.sh +0 -225
  246. package/test/unit/deletion-behavior.test.ts +0 -249
  247. package/test/unit/enhanced-mime-detection.test.ts +0 -244
  248. package/test/unit/snapshot.test.ts +0 -404
  249. package/test/unit/sync-convergence.test.ts +0 -298
  250. package/test/unit/sync-timing.test.ts +0 -134
  251. package/test/unit/utils.test.ts +0 -366
@@ -1,129 +0,0 @@
1
- /**
2
- * Clean terminal output manager (Singleton)
3
- * - Progress stays on one line (spinner updates in place)
4
- * - No emojis
5
- * - Background colors for section headers
6
- * - Minimal output
7
- * - Supports scrolling task lines (max-lines)
8
- */
9
- export declare class Output {
10
- #private;
11
- private static instance;
12
- private spinner;
13
- private taskStartTime;
14
- private taskOriginalMessage;
15
- private taskCurrentMessage;
16
- private taskLines;
17
- private taskMaxLines;
18
- private constructor();
19
- /**
20
- * Get the singleton instance
21
- */
22
- static getInstance(): Output;
23
- /**
24
- * Reset the singleton (useful for testing)
25
- */
26
- static reset(): void;
27
- /**
28
- * Start a task with spinner - updates in place
29
- * Completes any previous task before starting the new one
30
- * @param message - The task message
31
- * @param maxLines - Maximum number of task lines to show (0 = unlimited, lines scroll)
32
- */
33
- task(message: string, maxLines?: number): void;
34
- /**
35
- * Update spinner text (stays on same line)
36
- */
37
- update(message: string): void;
38
- /**
39
- * Add a line to the active task (appears below spinner, scrolls if max-lines set)
40
- * Lines are dimmed and temporary - they disappear when task completes unless kept
41
- * If no task is active, displays as a regular log message
42
- */
43
- taskLine(message: string, keepOnComplete?: boolean): void;
44
- /**
45
- * Clear all task lines (useful when you want to reset the scrolling window)
46
- */
47
- clearTaskLines(): void;
48
- /**
49
- * Complete task with optional duration display
50
- * Defaults to showing the original task message with duration
51
- * Task lines marked with keepOnComplete will be preserved, others are cleared
52
- */
53
- done(message?: string, showTime?: boolean): void;
54
- /**
55
- * Show an object as a table of key-value pairs
56
- * Filters out undefined values and applies optional transforms
57
- * Automatically calculates key padding from max key length
58
- */
59
- obj(obj: Record<string, any>, keyTransform?: (key: string) => string, valueTransform?: (value: any, key: string) => string): void;
60
- /**
61
- * Display array as bulleted list
62
- * Each item shown with dim bullet and white text
63
- */
64
- arr(items: any[]): void;
65
- /**
66
- * Show plain message with optional color
67
- */
68
- log(message: string, color?: "red" | "green" | "yellow" | "blue" | "cyan" | "magenta" | "gray" | "dim"): void;
69
- /**
70
- * Show success message (green text)
71
- */
72
- success(message: string): void;
73
- /**
74
- * Show success block (green background label + optional message)
75
- */
76
- successBlock(label: string, message?: string): void;
77
- /**
78
- * Show success message (green text)
79
- */
80
- spicy(message: string): void;
81
- /**
82
- * Show success block (green background label + optional message)
83
- */
84
- spicyBlock(label: string, message?: string): void;
85
- /**
86
- * Show message with rainbow gradient
87
- */
88
- rainbow(message: string): void;
89
- /**
90
- * Show info message (dim text)
91
- */
92
- info(message: string): void;
93
- /**
94
- * Show info block (grey background label + optional message)
95
- */
96
- infoBlock(label: string, message?: string): void;
97
- /**
98
- * Show error message (red text) - fails spinner if running
99
- */
100
- error(message: string | Error | unknown): void;
101
- /**
102
- * Show error block (red background label + optional message) - fails spinner if running
103
- */
104
- errorBlock(label: string, message?: string): void;
105
- /**
106
- * Show warning message (yellow text)
107
- */
108
- warn(message: string): void;
109
- /**
110
- * Show warning block (yellow background label + optional message)
111
- */
112
- warnBlock(label: string, message?: string): void;
113
- /**
114
- * Show detailed error information and exit the program
115
- * Use this when an unexpected/unrecoverable error occurs
116
- * Shows error message and stack trace, then exits
117
- */
118
- crash(error: unknown, exitCode?: number): never;
119
- /**
120
- * Exit with code
121
- */
122
- exit(code?: number): never;
123
- }
124
- /**
125
- * Global singleton output instance
126
- * Import and use this anywhere in your code
127
- */
128
- export declare const out: Output;
129
- //# sourceMappingURL=output.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,qBAAa,MAAM;;IACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAuB;IAC9C,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,YAAY,CAAa;IAEjC,OAAO;IAEP;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,MAAM;IAO5B;;OAEG;IACH,MAAM,CAAC,KAAK,IAAI,IAAI;IAQpB;;;;;OAKG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,IAAI;IAcjD;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAO7B;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,GAAE,OAAe,GAAG,IAAI;IAkBhE;;OAEG;IACH,cAAc,IAAI,IAAI;IAiCtB;;;;OAIG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAE,OAAc,GAAG,IAAI;IAuCtD;;;;OAIG;IACH,GAAG,CACD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACxB,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EACtC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,GACnD,IAAI;IA0BP;;;OAGG;IACH,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI;IASvB;;OAEG;IACH,GAAG,CACD,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EACF,KAAK,GACL,OAAO,GACP,QAAQ,GACR,MAAM,GACN,MAAM,GACN,SAAS,GACT,MAAM,GACN,KAAK,GACR,IAAI;IAWP;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK9B;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,MAAW,GAAG,IAAI;IAOvD;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK5B;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,MAAW,GAAG,IAAI;IAOrD;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IA8B9B;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK3B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,MAAW,GAAG,IAAI;IAOpD;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,IAAI;IAmB9C;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,MAAW,GAAG,IAAI;IAarD;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK3B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,MAAW,GAAG,IAAI;IAOpD;;;;OAIG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,GAAE,MAAU,GAAG,KAAK;IAuBlD;;OAEG;IACH,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK;CAoB3B;AAED;;;GAGG;AACH,eAAO,MAAM,GAAG,QAAuB,CAAC"}
@@ -1,368 +0,0 @@
1
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
- };
6
- var _Output_instances, _Output_updateTaskDisplay, _Output_stopTask;
7
- import chalk from "chalk";
8
- import ora from "ora";
9
- /**
10
- * Clean terminal output manager (Singleton)
11
- * - Progress stays on one line (spinner updates in place)
12
- * - No emojis
13
- * - Background colors for section headers
14
- * - Minimal output
15
- * - Supports scrolling task lines (max-lines)
16
- */
17
- export class Output {
18
- constructor() {
19
- _Output_instances.add(this);
20
- this.spinner = null;
21
- this.taskStartTime = null;
22
- this.taskOriginalMessage = null; // Original task message for done()
23
- this.taskCurrentMessage = null; // Current display message (can be updated)
24
- this.taskLines = []; // Lines written during active task
25
- this.taskMaxLines = 0; // 0 = unlimited
26
- }
27
- /**
28
- * Get the singleton instance
29
- */
30
- static getInstance() {
31
- if (!Output.instance) {
32
- Output.instance = new Output();
33
- }
34
- return Output.instance;
35
- }
36
- /**
37
- * Reset the singleton (useful for testing)
38
- */
39
- static reset() {
40
- if (Output.instance?.spinner) {
41
- Output.instance.spinner.stop();
42
- Output.instance.spinner.clear();
43
- }
44
- Output.instance = null;
45
- }
46
- /**
47
- * Start a task with spinner - updates in place
48
- * Completes any previous task before starting the new one
49
- * @param message - The task message
50
- * @param maxLines - Maximum number of task lines to show (0 = unlimited, lines scroll)
51
- */
52
- task(message, maxLines = 0) {
53
- // Complete any existing task first
54
- if (this.spinner) {
55
- this.done();
56
- }
57
- this.taskStartTime = Date.now();
58
- this.taskOriginalMessage = message;
59
- this.taskCurrentMessage = message;
60
- this.taskMaxLines = maxLines;
61
- this.taskLines = [];
62
- this.spinner = ora(message).start();
63
- }
64
- /**
65
- * Update spinner text (stays on same line)
66
- */
67
- update(message) {
68
- if (this.spinner) {
69
- this.taskCurrentMessage = message;
70
- __classPrivateFieldGet(this, _Output_instances, "m", _Output_updateTaskDisplay).call(this);
71
- }
72
- }
73
- /**
74
- * Add a line to the active task (appears below spinner, scrolls if max-lines set)
75
- * Lines are dimmed and temporary - they disappear when task completes unless kept
76
- * If no task is active, displays as a regular log message
77
- */
78
- taskLine(message, keepOnComplete = false) {
79
- if (!this.spinner) {
80
- // No active task, just log normally as regular output
81
- this.info(message);
82
- return;
83
- }
84
- // Add to task lines buffer with keep flag
85
- this.taskLines.push(keepOnComplete ? `[keep]${message}` : message);
86
- // If max lines set, trim from the start (scroll)
87
- if (this.taskMaxLines > 0 && this.taskLines.length > this.taskMaxLines) {
88
- this.taskLines = this.taskLines.slice(-this.taskMaxLines);
89
- }
90
- __classPrivateFieldGet(this, _Output_instances, "m", _Output_updateTaskDisplay).call(this);
91
- }
92
- /**
93
- * Clear all task lines (useful when you want to reset the scrolling window)
94
- */
95
- clearTaskLines() {
96
- this.taskLines = [];
97
- __classPrivateFieldGet(this, _Output_instances, "m", _Output_updateTaskDisplay).call(this);
98
- }
99
- /**
100
- * Complete task with optional duration display
101
- * Defaults to showing the original task message with duration
102
- * Task lines marked with keepOnComplete will be preserved, others are cleared
103
- */
104
- done(message, showTime = true) {
105
- if (!this.spinner)
106
- return;
107
- let text = message || this.taskOriginalMessage || "done";
108
- if (showTime && this.taskStartTime) {
109
- const durationMs = Date.now() - this.taskStartTime;
110
- const durationText = (() => {
111
- switch (true) {
112
- case durationMs < 1000:
113
- return `${durationMs}ms`;
114
- case durationMs < 2000:
115
- return `${(durationMs / 1000).toFixed(2)}s`;
116
- default:
117
- return `${(durationMs / 1000).toFixed(1)}s`;
118
- }
119
- })();
120
- text += chalk.dim(` (${durationText})`);
121
- }
122
- // Clear multiline text and set to just completion message
123
- this.spinner.text = text;
124
- this.spinner.succeed();
125
- this.spinner = null;
126
- // Print kept task lines after completion
127
- const keptLines = this.taskLines.filter((line) => line.startsWith("[keep]"));
128
- for (const line of keptLines) {
129
- console.log(chalk.dim(` ${line.slice(6)}`));
130
- }
131
- this.taskStartTime = null;
132
- this.taskOriginalMessage = null;
133
- this.taskCurrentMessage = null;
134
- this.taskLines = [];
135
- this.taskMaxLines = 0;
136
- }
137
- /**
138
- * Show an object as a table of key-value pairs
139
- * Filters out undefined values and applies optional transforms
140
- * Automatically calculates key padding from max key length
141
- */
142
- obj(obj, keyTransform, valueTransform) {
143
- __classPrivateFieldGet(this, _Output_instances, "m", _Output_stopTask).call(this);
144
- // Filter out undefined values and apply key transform
145
- const entries = [];
146
- for (const [key, value] of Object.entries(obj)) {
147
- if (value === undefined)
148
- continue;
149
- const displayKey = keyTransform ? keyTransform(key) : key;
150
- entries.push([key, displayKey, value]);
151
- }
152
- // Calculate max key length for padding
153
- const maxKeyLength = Math.max(...entries.map(([, displayKey]) => displayKey.length));
154
- // Print each entry
155
- for (const [key, displayKey, value] of entries) {
156
- const displayValue = valueTransform
157
- ? valueTransform(value, key)
158
- : String(value);
159
- const keyFormatted = chalk.dim(displayKey.padEnd(maxKeyLength + 2));
160
- console.log(`${keyFormatted}${displayValue}`);
161
- }
162
- }
163
- /**
164
- * Display array as bulleted list
165
- * Each item shown with dim bullet and white text
166
- */
167
- arr(items) {
168
- __classPrivateFieldGet(this, _Output_instances, "m", _Output_stopTask).call(this);
169
- for (const item of items) {
170
- const bullet = chalk.dim("• ");
171
- console.log(`${bullet}${String(item)}`);
172
- }
173
- }
174
- /**
175
- * Show plain message with optional color
176
- */
177
- log(message, color) {
178
- __classPrivateFieldGet(this, _Output_instances, "m", _Output_stopTask).call(this);
179
- if (color) {
180
- const colorFn = color === "dim" ? chalk.dim : chalk[color];
181
- console.log(colorFn(message));
182
- }
183
- else {
184
- console.log(message);
185
- }
186
- }
187
- /**
188
- * Show success message (green text)
189
- */
190
- success(message) {
191
- __classPrivateFieldGet(this, _Output_instances, "m", _Output_stopTask).call(this);
192
- console.log(chalk.green(message));
193
- }
194
- /**
195
- * Show success block (green background label + optional message)
196
- */
197
- successBlock(label, message = "") {
198
- __classPrivateFieldGet(this, _Output_instances, "m", _Output_stopTask).call(this);
199
- console.log(`\n${chalk.bgGreen.black(` ${label} `)}${message && ` ${message}`}`);
200
- }
201
- /**
202
- * Show success message (green text)
203
- */
204
- spicy(message) {
205
- __classPrivateFieldGet(this, _Output_instances, "m", _Output_stopTask).call(this);
206
- console.log(chalk.cyan(message));
207
- }
208
- /**
209
- * Show success block (green background label + optional message)
210
- */
211
- spicyBlock(label, message = "") {
212
- __classPrivateFieldGet(this, _Output_instances, "m", _Output_stopTask).call(this);
213
- console.log(`\n${chalk.bgCyan.black(` ${label} `)}${message && ` ${message}`}`);
214
- }
215
- /**
216
- * Show message with rainbow gradient
217
- */
218
- rainbow(message) {
219
- __classPrivateFieldGet(this, _Output_instances, "m", _Output_stopTask).call(this);
220
- // Rainbow colors in order
221
- const colors = [
222
- chalk.red,
223
- chalk.rgb(255, 165, 0), // orange
224
- chalk.yellow,
225
- chalk.green,
226
- chalk.cyan,
227
- chalk.blue,
228
- chalk.magenta,
229
- ];
230
- const chars = message.split("");
231
- const colorCount = colors.length;
232
- // Spread colors across the string
233
- const rainbow = chars
234
- .map((char, i) => {
235
- // Calculate which color to use based on position
236
- const colorIndex = Math.floor((i / chars.length) * colorCount);
237
- const color = colors[Math.min(colorIndex, colorCount - 1)];
238
- return color(char);
239
- })
240
- .join("");
241
- console.log(rainbow);
242
- }
243
- /**
244
- * Show info message (dim text)
245
- */
246
- info(message) {
247
- __classPrivateFieldGet(this, _Output_instances, "m", _Output_stopTask).call(this);
248
- console.log(chalk.dim(message));
249
- }
250
- /**
251
- * Show info block (grey background label + optional message)
252
- */
253
- infoBlock(label, message = "") {
254
- __classPrivateFieldGet(this, _Output_instances, "m", _Output_stopTask).call(this);
255
- console.log(`\n${chalk.bgGrey.white(` ${label} `)}${message && ` ${message}`}`);
256
- }
257
- /**
258
- * Show error message (red text) - fails spinner if running
259
- */
260
- error(message) {
261
- if (this.spinner) {
262
- this.spinner.fail("failed");
263
- this.spinner = null;
264
- this.taskStartTime = null;
265
- this.taskOriginalMessage = null;
266
- this.taskCurrentMessage = null;
267
- }
268
- console.log(chalk.red(message instanceof Error
269
- ? message.message
270
- : message instanceof Object
271
- ? JSON.stringify(message)
272
- : String(message)));
273
- }
274
- /**
275
- * Show error block (red background label + optional message) - fails spinner if running
276
- */
277
- errorBlock(label, message = "") {
278
- if (this.spinner) {
279
- this.spinner.fail("failed");
280
- this.spinner = null;
281
- this.taskStartTime = null;
282
- this.taskOriginalMessage = null;
283
- this.taskCurrentMessage = null;
284
- }
285
- console.log(`\n${chalk.bgRed.white(` ${label} `)}${message && ` ${message}`}`);
286
- }
287
- /**
288
- * Show warning message (yellow text)
289
- */
290
- warn(message) {
291
- __classPrivateFieldGet(this, _Output_instances, "m", _Output_stopTask).call(this);
292
- console.log(chalk.yellow(message));
293
- }
294
- /**
295
- * Show warning block (yellow background label + optional message)
296
- */
297
- warnBlock(label, message = "") {
298
- __classPrivateFieldGet(this, _Output_instances, "m", _Output_stopTask).call(this);
299
- console.log(`\n${chalk.bgYellow.black(` ${label} `)}${message && ` ${message}`}`);
300
- }
301
- /**
302
- * Show detailed error information and exit the program
303
- * Use this when an unexpected/unrecoverable error occurs
304
- * Shows error message and stack trace, then exits
305
- */
306
- crash(error, exitCode = 1) {
307
- __classPrivateFieldGet(this, _Output_instances, "m", _Output_stopTask).call(this);
308
- if (error instanceof Error) {
309
- // Error type and message
310
- console.log(chalk.red(`${error.name}: ${error.message}`));
311
- // Stack trace
312
- if (error.stack) {
313
- console.log("");
314
- console.log(chalk.dim("Stack trace:"));
315
- const stackLines = error.stack.split("\n").slice(1); // Skip first line (error message)
316
- stackLines.forEach((line) => console.log(chalk.dim(` ${line.trim()}`)));
317
- }
318
- }
319
- else {
320
- console.log(chalk.red(String(error)));
321
- }
322
- process.exit(exitCode);
323
- }
324
- /**
325
- * Exit with code
326
- */
327
- exit(code) {
328
- __classPrivateFieldGet(this, _Output_instances, "m", _Output_stopTask).call(this);
329
- process.exit(code || 0);
330
- }
331
- }
332
- _Output_instances = new WeakSet(), _Output_updateTaskDisplay = function _Output_updateTaskDisplay() {
333
- if (!this.spinner)
334
- return;
335
- const currentText = this.taskCurrentMessage || this.spinner.text.split("\n")[0] || "";
336
- // If no task lines, show just the spinner message
337
- if (this.taskLines.length === 0) {
338
- this.spinner.text = currentText;
339
- return;
340
- }
341
- // Build multiline text: spinner message + task lines below
342
- const taskLinesText = this.taskLines
343
- .map((line) => {
344
- const cleanLine = line.startsWith("[keep]") ? line.slice(6) : line;
345
- return chalk.dim(` ${cleanLine}`);
346
- })
347
- .join("\n");
348
- // Set spinner text to include task lines (ora handles multiline rendering)
349
- this.spinner.text = `${currentText}\n${taskLinesText}`;
350
- }, _Output_stopTask = function _Output_stopTask() {
351
- if (this.spinner) {
352
- this.spinner.stop();
353
- this.spinner.clear();
354
- this.spinner = null;
355
- }
356
- this.taskStartTime = null;
357
- this.taskOriginalMessage = null;
358
- this.taskCurrentMessage = null;
359
- this.taskLines = [];
360
- this.taskMaxLines = 0;
361
- };
362
- Output.instance = null;
363
- /**
364
- * Global singleton output instance
365
- * Import and use this anywhere in your code
366
- */
367
- export const out = Output.getInstance();
368
- //# sourceMappingURL=output.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAY,MAAM,KAAK,CAAC;AAE/B;;;;;;;GAOG;AACH,MAAM,OAAO,MAAM;IASjB;;QAPQ,YAAO,GAAe,IAAI,CAAC;QAC3B,kBAAa,GAAkB,IAAI,CAAC;QACpC,wBAAmB,GAAkB,IAAI,CAAC,CAAC,mCAAmC;QAC9E,uBAAkB,GAAkB,IAAI,CAAC,CAAC,2CAA2C;QACrF,cAAS,GAAa,EAAE,CAAC,CAAC,mCAAmC;QAC7D,iBAAY,GAAW,CAAC,CAAC,CAAC,gBAAgB;IAE3B,CAAC;IAExB;;OAEG;IACH,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,CAAC,QAAQ,GAAG,IAAI,MAAM,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK;QACV,IAAI,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;YAC7B,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAC/B,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClC,CAAC;QACD,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;IACzB,CAAC;IAED;;;;;OAKG;IACH,IAAI,CAAC,OAAe,EAAE,WAAmB,CAAC;QACxC,mCAAmC;QACnC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC;QACnC,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC;QAClC,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAAe;QACpB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC;YAClC,uBAAA,IAAI,oDAAmB,MAAvB,IAAI,CAAqB,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,OAAe,EAAE,iBAA0B,KAAK;QACvD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,sDAAsD;YACtD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QAED,0CAA0C;QAC1C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAEnE,iDAAiD;QACjD,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACvE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5D,CAAC;QAED,uBAAA,IAAI,oDAAmB,MAAvB,IAAI,CAAqB,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,uBAAA,IAAI,oDAAmB,MAAvB,IAAI,CAAqB,CAAC;IAC5B,CAAC;IA8BD;;;;OAIG;IACH,IAAI,CAAC,OAAgB,EAAE,WAAoB,IAAI;QAC7C,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAE1B,IAAI,IAAI,GAAG,OAAO,IAAI,IAAI,CAAC,mBAAmB,IAAI,MAAM,CAAC;QACzD,IAAI,QAAQ,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACnC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;YACnD,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE;gBACzB,QAAQ,IAAI,EAAE,CAAC;oBACb,KAAK,UAAU,GAAG,IAAI;wBACpB,OAAO,GAAG,UAAU,IAAI,CAAC;oBAC3B,KAAK,UAAU,GAAG,IAAI;wBACpB,OAAO,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;oBAC9C;wBACE,OAAO,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;gBAChD,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YACL,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,YAAY,GAAG,CAAC,CAAC;QAC1C,CAAC;QAED,0DAA0D;QAC1D,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,yCAAyC;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAC/C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAC1B,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACH,GAAG,CACD,GAAwB,EACxB,YAAsC,EACtC,cAAoD;QAEpD,uBAAA,IAAI,2CAAU,MAAd,IAAI,CAAY,CAAC;QAEjB,sDAAsD;QACtD,MAAM,OAAO,GAAiC,EAAE,CAAC;QACjD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,IAAI,KAAK,KAAK,SAAS;gBAAE,SAAS;YAClC,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;QACzC,CAAC;QAED,uCAAuC;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAC3B,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CACtD,CAAC;QAEF,mBAAmB;QACnB,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;YAC/C,MAAM,YAAY,GAAG,cAAc;gBACjC,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC;gBAC5B,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAClB,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,GAAG,YAAY,GAAG,YAAY,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,GAAG,CAAC,KAAY;QACd,uBAAA,IAAI,2CAAU,MAAd,IAAI,CAAY,CAAC;QAEjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,GAAG,CACD,OAAe,EACf,KAQS;QAET,uBAAA,IAAI,2CAAU,MAAd,IAAI,CAAY,CAAC;QAEjB,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,OAAe;QACrB,uBAAA,IAAI,2CAAU,MAAd,IAAI,CAAY,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,KAAa,EAAE,UAAkB,EAAE;QAC9C,uBAAA,IAAI,2CAAU,MAAd,IAAI,CAAY,CAAC;QACjB,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,OAAO,IAAI,IAAI,OAAO,EAAE,EAAE,CACpE,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAe;QACnB,uBAAA,IAAI,2CAAU,MAAd,IAAI,CAAY,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,KAAa,EAAE,UAAkB,EAAE;QAC5C,uBAAA,IAAI,2CAAU,MAAd,IAAI,CAAY,CAAC;QACjB,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,OAAO,IAAI,IAAI,OAAO,EAAE,EAAE,CACnE,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,OAAe;QACrB,uBAAA,IAAI,2CAAU,MAAd,IAAI,CAAY,CAAC;QAEjB,0BAA0B;QAC1B,MAAM,MAAM,GAAG;YACb,KAAK,CAAC,GAAG;YACT,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,SAAS;YACjC,KAAK,CAAC,MAAM;YACZ,KAAK,CAAC,KAAK;YACX,KAAK,CAAC,IAAI;YACV,KAAK,CAAC,IAAI;YACV,KAAK,CAAC,OAAO;SACd,CAAC;QAEF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;QAEjC,kCAAkC;QAClC,MAAM,OAAO,GAAG,KAAK;aAClB,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACf,iDAAiD;YACjD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC;YAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC;YAC3D,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC,CAAC;aACD,IAAI,CAAC,EAAE,CAAC,CAAC;QAEZ,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAe;QAClB,uBAAA,IAAI,2CAAU,MAAd,IAAI,CAAY,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,KAAa,EAAE,UAAkB,EAAE;QAC3C,uBAAA,IAAI,2CAAU,MAAd,IAAI,CAAY,CAAC;QACjB,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,OAAO,IAAI,IAAI,OAAO,EAAE,EAAE,CACnE,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAiC;QACrC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAChC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC;QACD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,OAAO,YAAY,KAAK;YACtB,CAAC,CAAC,OAAO,CAAC,OAAO;YACjB,CAAC,CAAC,OAAO,YAAY,MAAM;gBAC3B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBACzB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CACpB,CACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,KAAa,EAAE,UAAkB,EAAE;QAC5C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAChC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC;QACD,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,OAAO,IAAI,IAAI,OAAO,EAAE,EAAE,CAClE,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAe;QAClB,uBAAA,IAAI,2CAAU,MAAd,IAAI,CAAY,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,KAAa,EAAE,UAAkB,EAAE;QAC3C,uBAAA,IAAI,2CAAU,MAAd,IAAI,CAAY,CAAC;QACjB,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,OAAO,IAAI,IAAI,OAAO,EAAE,EAAE,CACrE,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAc,EAAE,WAAmB,CAAC;QACxC,uBAAA,IAAI,2CAAU,MAAd,IAAI,CAAY,CAAC;QAEjB,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,yBAAyB;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAE1D,cAAc;YACd,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;gBACvC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,kCAAkC;gBACvF,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAC3C,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,IAAa;QAChB,uBAAA,IAAI,2CAAU,MAAd,IAAI,CAAY,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IAC1B,CAAC;;;IA7TC,IAAI,CAAC,IAAI,CAAC,OAAO;QAAE,OAAO;IAE1B,MAAM,WAAW,GACf,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEpE,kDAAkD;IAClD,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,WAAW,CAAC;QAChC,OAAO;IACT,CAAC;IAED,2DAA2D;IAC3D,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS;SACjC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnE,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,2EAA2E;IAC3E,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,WAAW,KAAK,aAAa,EAAE,CAAC;AACzD,CAAC;IA8SC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACpB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;AACxB,CAAC;AA9ac,eAAQ,GAAkB,IAAI,AAAtB,CAAuB;AAibhD;;;GAGG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC"}
@@ -1,13 +0,0 @@
1
- import "./node-polyfills.js";
2
- import { Repo } from "@automerge/automerge-repo";
3
- import { DirectoryConfig } from "../types/index.js";
4
- /**
5
- * Create an Automerge repository with Subduction-based setup
6
- */
7
- export declare function createRepo(workingDir: string, config: DirectoryConfig): Promise<Repo>;
8
- /**
9
- * Create an ephemeral Automerge repository for remote reads.
10
- * Uses a temporary directory for storage.
11
- */
12
- export declare function createEphemeralRepo(syncServer: string): Promise<Repo>;
13
- //# sourceMappingURL=repo-factory.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"repo-factory.d.ts","sourceRoot":"","sources":["../../src/utils/repo-factory.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AASjD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAapD;;GAEG;AACH,wBAAsB,UAAU,CAC9B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAgBf"}
@@ -1,46 +0,0 @@
1
- import "./node-polyfills.js";
2
- import { Repo } from "@automerge/automerge-repo";
3
- import { NodeFSStorageAdapter } from "@automerge/automerge-repo-storage-nodefs";
4
- import * as subductionModule from "@automerge/automerge-subduction";
5
- import { initSubductionModule, SubductionStorageBridge, } from "@automerge/automerge-repo-subduction-bridge";
6
- import * as path from "path";
7
- import * as os from "os";
8
- const { WebCryptoSigner, Subduction } = subductionModule;
9
- let subductionModuleInitialized = false;
10
- function ensureSubductionModuleInit() {
11
- if (!subductionModuleInitialized) {
12
- initSubductionModule(subductionModule);
13
- subductionModuleInitialized = true;
14
- }
15
- }
16
- /**
17
- * Create an Automerge repository with Subduction-based setup
18
- */
19
- export async function createRepo(workingDir, config) {
20
- ensureSubductionModuleInit();
21
- const syncToolDir = path.join(workingDir, ".pushwork");
22
- const nodeStorage = new NodeFSStorageAdapter(path.join(syncToolDir, "automerge"));
23
- const signer = await WebCryptoSigner.setup();
24
- const storageBridge = new SubductionStorageBridge(nodeStorage);
25
- const subduction = await Subduction.hydrate(signer, storageBridge);
26
- // Connect to sync server if sync is enabled
27
- if (config.sync_enabled && config.sync_server) {
28
- await subduction.connectDiscover(new URL(config.sync_server), signer);
29
- }
30
- return new Repo({ subduction });
31
- }
32
- /**
33
- * Create an ephemeral Automerge repository for remote reads.
34
- * Uses a temporary directory for storage.
35
- */
36
- export async function createEphemeralRepo(syncServer) {
37
- ensureSubductionModuleInit();
38
- const tmpDir = path.join(os.tmpdir(), `pushwork-ephemeral-${Date.now()}`);
39
- const nodeStorage = new NodeFSStorageAdapter(tmpDir);
40
- const signer = await WebCryptoSigner.setup();
41
- const storageBridge = new SubductionStorageBridge(nodeStorage);
42
- const subduction = await Subduction.hydrate(signer, storageBridge);
43
- await subduction.connectDiscover(new URL(syncServer), signer);
44
- return new Repo({ subduction });
45
- }
46
- //# sourceMappingURL=repo-factory.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"repo-factory.js","sourceRoot":"","sources":["../../src/utils/repo-factory.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AAChF,OAAO,KAAK,gBAAgB,MAAM,iCAAiC,CAAC;AACpE,OAAO,EACL,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,6CAA6C,CAAC;AACrD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAGzB,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,gBAAgB,CAAC;AAEzD,IAAI,2BAA2B,GAAG,KAAK,CAAC;AAExC,SAAS,0BAA0B;IACjC,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACjC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;QACvC,2BAA2B,GAAG,IAAI,CAAC;IACrC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,UAAkB,EAClB,MAAuB;IAEvB,0BAA0B,EAAE,CAAC;IAE7B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;IAElF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC;IAC7C,MAAM,aAAa,GAAG,IAAI,uBAAuB,CAAC,WAAW,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAEnE,4CAA4C;IAC5C,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,UAAU,CAAC,eAAe,CAC9B,IAAI,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,EAC3B,MAAM,CACP,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,IAAI,CAAC,EAAE,UAAU,EAAS,CAAC,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,UAAkB;IAElB,0BAA0B,EAAE,CAAC;IAE7B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,sBAAsB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC1E,MAAM,WAAW,GAAG,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC;IAC7C,MAAM,aAAa,GAAG,IAAI,uBAAuB,CAAC,WAAW,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAEnE,MAAM,UAAU,CAAC,eAAe,CAC9B,IAAI,GAAG,CAAC,UAAU,CAAC,EACnB,MAAM,CACP,CAAC;IAEF,OAAO,IAAI,IAAI,CAAC,EAAE,UAAU,EAAS,CAAC,CAAC;AACzC,CAAC"}
@@ -1,14 +0,0 @@
1
- /**
2
-
3
- * Calculate similarity between two strings
4
-
5
- * @param {string} str1 First string to match
6
- * @param {string} str2 Second string to match
7
- * @param {number} [substringLength=2] Optional. Length of substring to be used in calculating similarity. Default 2.
8
- * @param {boolean} [caseSensitive=false] Optional. Whether you want to consider case in string matching. Default false;
9
-
10
- * @returns Number between 0 and 1, with 0 being a low match score.
11
-
12
- */
13
- export declare const stringSimilarity: (str1: string, str2: string, substringLength?: number, caseSensitive?: boolean) => number;
14
- //# sourceMappingURL=string-similarity.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"string-similarity.d.ts","sourceRoot":"","sources":["../../src/utils/string-similarity.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,gBAAgB,GAC3B,MAAM,MAAM,EACZ,MAAM,MAAM,EACZ,kBAAiB,MAAU,EAC3B,gBAAe,OAAe,WAkC/B,CAAC"}
@@ -1,39 +0,0 @@
1
- /* Based on the Sørensen–Dice coefficient, code from https://github.com/stephenjjbrown/string-similarity-js */
2
- /**
3
-
4
- * Calculate similarity between two strings
5
-
6
- * @param {string} str1 First string to match
7
- * @param {string} str2 Second string to match
8
- * @param {number} [substringLength=2] Optional. Length of substring to be used in calculating similarity. Default 2.
9
- * @param {boolean} [caseSensitive=false] Optional. Whether you want to consider case in string matching. Default false;
10
-
11
- * @returns Number between 0 and 1, with 0 being a low match score.
12
-
13
- */
14
- export const stringSimilarity = (str1, str2, substringLength = 2, caseSensitive = false) => {
15
- if (str1 === str2)
16
- return 1;
17
- if (!caseSensitive) {
18
- str1 = str1.toLowerCase();
19
- str2 = str2.toLowerCase();
20
- }
21
- if (str1.length < substringLength || str2.length < substringLength)
22
- return 0;
23
- const map = new Map();
24
- for (let i = 0; i < str1.length - (substringLength - 1); i++) {
25
- const substr1 = str1.substring(i, i + substringLength);
26
- map.set(substr1, map.has(substr1) ? map.get(substr1) + 1 : 1);
27
- }
28
- let match = 0;
29
- for (let j = 0; j < str2.length - (substringLength - 1); j++) {
30
- const substr2 = str2.substring(j, j + substringLength);
31
- const count = map.has(substr2) ? map.get(substr2) : 0;
32
- if (count > 0) {
33
- map.set(substr2, count - 1);
34
- match++;
35
- }
36
- }
37
- return (match * 2) / (str1.length + str2.length - (substringLength - 1) * 2);
38
- };
39
- //# sourceMappingURL=string-similarity.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"string-similarity.js","sourceRoot":"","sources":["../../src/utils/string-similarity.ts"],"names":[],"mappings":"AAAA,8GAA8G;AAE9G;;;;;;;;;;;GAWG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,IAAY,EACZ,IAAY,EACZ,kBAA0B,CAAC,EAC3B,gBAAyB,KAAK,EAC9B,EAAE;IACF,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC;IAC5B,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAE1B,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe;QAAE,OAAO,CAAC,CAAC;IAE7E,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;IAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,eAAe,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC;QAEvD,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,eAAe,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC;QAEvD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAE5B,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IAED,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,eAAe,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/E,CAAC,CAAC"}