@fnndsc/brasa 0.56.1 → 0.56.3

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 (361) hide show
  1. package/dist/buildinfo.json +1 -1
  2. package/dist/builtins/berth/berth.d.ts +90 -3
  3. package/dist/builtins/berth/berth.js +129 -76
  4. package/dist/builtins/berth/berth.js.map +1 -1
  5. package/dist/builtins/berth/berthClose.d.ts +25 -6
  6. package/dist/builtins/berth/berthClose.js +8 -64
  7. package/dist/builtins/berth/berthClose.js.map +1 -1
  8. package/dist/builtins/berth/berthCube.d.ts +3 -2
  9. package/dist/builtins/berth/berthCube.js +9 -16
  10. package/dist/builtins/berth/berthCube.js.map +1 -1
  11. package/dist/builtins/berth/berthProcesses.js +33 -3
  12. package/dist/builtins/berth/berthProcesses.js.map +1 -1
  13. package/dist/builtins/debug.d.ts +24 -3
  14. package/dist/builtins/debug.js +66 -13
  15. package/dist/builtins/debug.js.map +1 -1
  16. package/dist/builtins/fs/acl.args.d.ts +5 -38
  17. package/dist/builtins/fs/acl.args.js +6 -72
  18. package/dist/builtins/fs/acl.args.js.map +1 -1
  19. package/dist/builtins/fs/acl.d.ts +100 -10
  20. package/dist/builtins/fs/acl.js +222 -68
  21. package/dist/builtins/fs/acl.js.map +1 -1
  22. package/dist/builtins/fs/cat.args.d.ts +14 -15
  23. package/dist/builtins/fs/cat.args.js +13 -40
  24. package/dist/builtins/fs/cat.args.js.map +1 -1
  25. package/dist/builtins/fs/cat.d.ts +40 -3
  26. package/dist/builtins/fs/cat.js +92 -13
  27. package/dist/builtins/fs/cat.js.map +1 -1
  28. package/dist/builtins/fs/cd.d.ts +24 -6
  29. package/dist/builtins/fs/cd.js +71 -18
  30. package/dist/builtins/fs/cd.js.map +1 -1
  31. package/dist/builtins/fs/configWrite.d.ts +24 -8
  32. package/dist/builtins/fs/configWrite.js +77 -36
  33. package/dist/builtins/fs/configWrite.js.map +1 -1
  34. package/dist/builtins/fs/cp.d.ts +39 -4
  35. package/dist/builtins/fs/cp.js +122 -56
  36. package/dist/builtins/fs/cp.js.map +1 -1
  37. package/dist/builtins/fs/download.d.ts +31 -4
  38. package/dist/builtins/fs/download.js +75 -38
  39. package/dist/builtins/fs/download.js.map +1 -1
  40. package/dist/builtins/fs/du.d.ts +59 -33
  41. package/dist/builtins/fs/du.js +111 -79
  42. package/dist/builtins/fs/du.js.map +1 -1
  43. package/dist/builtins/fs/edit.d.ts +19 -4
  44. package/dist/builtins/fs/edit.js +77 -16
  45. package/dist/builtins/fs/edit.js.map +1 -1
  46. package/dist/builtins/fs/find.d.ts +25 -0
  47. package/dist/builtins/fs/find.js +76 -5
  48. package/dist/builtins/fs/find.js.map +1 -1
  49. package/dist/builtins/fs/ls.d.ts +69 -4
  50. package/dist/builtins/fs/ls.js +84 -45
  51. package/dist/builtins/fs/ls.js.map +1 -1
  52. package/dist/builtins/fs/mkdir.d.ts +28 -18
  53. package/dist/builtins/fs/mkdir.js +95 -66
  54. package/dist/builtins/fs/mkdir.js.map +1 -1
  55. package/dist/builtins/fs/mv.d.ts +34 -4
  56. package/dist/builtins/fs/mv.js +129 -64
  57. package/dist/builtins/fs/mv.js.map +1 -1
  58. package/dist/builtins/fs/pull.args.d.ts +56 -17
  59. package/dist/builtins/fs/pull.args.js +16 -66
  60. package/dist/builtins/fs/pull.args.js.map +1 -1
  61. package/dist/builtins/fs/pull.d.ts +62 -0
  62. package/dist/builtins/fs/pull.js +123 -31
  63. package/dist/builtins/fs/pull.js.map +1 -1
  64. package/dist/builtins/fs/pwd.d.ts +19 -5
  65. package/dist/builtins/fs/pwd.js +62 -8
  66. package/dist/builtins/fs/pwd.js.map +1 -1
  67. package/dist/builtins/fs/rm.d.ts +58 -21
  68. package/dist/builtins/fs/rm.js +99 -82
  69. package/dist/builtins/fs/rm.js.map +1 -1
  70. package/dist/builtins/fs/rmdir.d.ts +29 -11
  71. package/dist/builtins/fs/rmdir.js +87 -36
  72. package/dist/builtins/fs/rmdir.js.map +1 -1
  73. package/dist/builtins/fs/touch.d.ts +44 -9
  74. package/dist/builtins/fs/touch.js +91 -27
  75. package/dist/builtins/fs/touch.js.map +1 -1
  76. package/dist/builtins/fs/tree.d.ts +36 -9
  77. package/dist/builtins/fs/tree.js +126 -36
  78. package/dist/builtins/fs/tree.js.map +1 -1
  79. package/dist/builtins/fs/upload.d.ts +22 -3
  80. package/dist/builtins/fs/upload.js +82 -14
  81. package/dist/builtins/fs/upload.js.map +1 -1
  82. package/dist/builtins/fs/xattr.args.d.ts +12 -33
  83. package/dist/builtins/fs/xattr.args.js +17 -95
  84. package/dist/builtins/fs/xattr.args.js.map +1 -1
  85. package/dist/builtins/fs/xattr.d.ts +98 -8
  86. package/dist/builtins/fs/xattr.js +163 -24
  87. package/dist/builtins/fs/xattr.js.map +1 -1
  88. package/dist/builtins/games/bytes.d.ts +201 -5
  89. package/dist/builtins/games/bytes.js +255 -54
  90. package/dist/builtins/games/bytes.js.map +1 -1
  91. package/dist/builtins/games/chimes.d.ts +180 -3
  92. package/dist/builtins/games/chimes.js +203 -26
  93. package/dist/builtins/games/chimes.js.map +1 -1
  94. package/dist/builtins/games/chrislab.d.ts +101 -3
  95. package/dist/builtins/games/chrislab.js +117 -17
  96. package/dist/builtins/games/chrislab.js.map +1 -1
  97. package/dist/builtins/games/cowsay.d.ts +93 -2
  98. package/dist/builtins/games/cowsay.js +90 -31
  99. package/dist/builtins/games/cowsay.js.map +1 -1
  100. package/dist/builtins/games/figlet.d.ts +70 -2
  101. package/dist/builtins/games/figlet.js +83 -6
  102. package/dist/builtins/games/figlet.js.map +1 -1
  103. package/dist/builtins/games/lab.d.ts +104 -5
  104. package/dist/builtins/games/lab.js +144 -6
  105. package/dist/builtins/games/lab.js.map +1 -1
  106. package/dist/builtins/games/lolcat.d.ts +61 -1
  107. package/dist/builtins/games/lolcat.js +59 -24
  108. package/dist/builtins/games/lolcat.js.map +1 -1
  109. package/dist/builtins/games/morse.d.ts +36 -1
  110. package/dist/builtins/games/morse.js +50 -2
  111. package/dist/builtins/games/morse.js.map +1 -1
  112. package/dist/builtins/games/numbers.d.ts +241 -5
  113. package/dist/builtins/games/numbers.js +298 -23
  114. package/dist/builtins/games/numbers.js.map +1 -1
  115. package/dist/builtins/games/play.d.ts +96 -6
  116. package/dist/builtins/games/play.js +137 -6
  117. package/dist/builtins/games/play.js.map +1 -1
  118. package/dist/builtins/games/qr.d.ts +40 -1
  119. package/dist/builtins/games/qr.js +51 -2
  120. package/dist/builtins/games/qr.js.map +1 -1
  121. package/dist/builtins/games/show.d.ts +131 -6
  122. package/dist/builtins/games/show.js +208 -20
  123. package/dist/builtins/games/show.js.map +1 -1
  124. package/dist/builtins/games/sky.d.ts +178 -4
  125. package/dist/builtins/games/sky.js +228 -12
  126. package/dist/builtins/games/sky.js.map +1 -1
  127. package/dist/builtins/games/text.d.ts +258 -7
  128. package/dist/builtins/games/text.js +310 -29
  129. package/dist/builtins/games/text.js.map +1 -1
  130. package/dist/builtins/games/trek.d.ts +67 -3
  131. package/dist/builtins/games/trek.js +63 -10
  132. package/dist/builtins/games/trek.js.map +1 -1
  133. package/dist/builtins/games/wtf.d.ts +58 -1
  134. package/dist/builtins/games/wtf.js +67 -6
  135. package/dist/builtins/games/wtf.js.map +1 -1
  136. package/dist/builtins/help.d.ts +41 -3
  137. package/dist/builtins/help.js +92 -796
  138. package/dist/builtins/help.js.map +1 -1
  139. package/dist/builtins/net/connect.d.ts +36 -3
  140. package/dist/builtins/net/connect.js +84 -26
  141. package/dist/builtins/net/connect.js.map +1 -1
  142. package/dist/builtins/net/cubepath.d.ts +49 -5
  143. package/dist/builtins/net/cubepath.js +69 -27
  144. package/dist/builtins/net/cubepath.js.map +1 -1
  145. package/dist/builtins/net/logout.d.ts +13 -4
  146. package/dist/builtins/net/logout.js +49 -3
  147. package/dist/builtins/net/logout.js.map +1 -1
  148. package/dist/builtins/net/netstat.d.ts +29 -4
  149. package/dist/builtins/net/netstat.js +64 -23
  150. package/dist/builtins/net/netstat.js.map +1 -1
  151. package/dist/builtins/net/pacs.d.ts +169 -15
  152. package/dist/builtins/net/pacs.js +92 -33
  153. package/dist/builtins/net/pacs.js.map +1 -1
  154. package/dist/builtins/net/query.args.d.ts +95 -0
  155. package/dist/builtins/net/query.args.js +26 -0
  156. package/dist/builtins/net/query.args.js.map +1 -0
  157. package/dist/builtins/net/query.d.ts +98 -5
  158. package/dist/builtins/net/query.js +89 -83
  159. package/dist/builtins/net/query.js.map +1 -1
  160. package/dist/builtins/net/status.d.ts +5 -3
  161. package/dist/builtins/net/status.js +5 -12
  162. package/dist/builtins/net/status.js.map +1 -1
  163. package/dist/builtins/parametersofplugin.d.ts +82 -3
  164. package/dist/builtins/parametersofplugin.js +79 -23
  165. package/dist/builtins/parametersofplugin.js.map +1 -1
  166. package/dist/builtins/proc.d.ts +210 -3
  167. package/dist/builtins/proc.js +210 -119
  168. package/dist/builtins/proc.js.map +1 -1
  169. package/dist/builtins/res/compute.d.ts +67 -3
  170. package/dist/builtins/res/compute.js +121 -35
  171. package/dist/builtins/res/compute.js.map +1 -1
  172. package/dist/builtins/res/dicom.d.ts +55 -7
  173. package/dist/builtins/res/dicom.js +86 -52
  174. package/dist/builtins/res/dicom.js.map +1 -1
  175. package/dist/builtins/res/expect.d.ts +52 -3
  176. package/dist/builtins/res/expect.js +92 -29
  177. package/dist/builtins/res/expect.js.map +1 -1
  178. package/dist/builtins/res/feed.d.ts +475 -3
  179. package/dist/builtins/res/feed.js +253 -158
  180. package/dist/builtins/res/feed.js.map +1 -1
  181. package/dist/builtins/res/files.d.ts +517 -3
  182. package/dist/builtins/res/files.js +124 -44
  183. package/dist/builtins/res/files.js.map +1 -1
  184. package/dist/builtins/res/gather.d.ts +113 -3
  185. package/dist/builtins/res/gather.js +153 -44
  186. package/dist/builtins/res/gather.js.map +1 -1
  187. package/dist/builtins/res/gather.process.d.ts +27 -19
  188. package/dist/builtins/res/gather.process.js +29 -59
  189. package/dist/builtins/res/gather.process.js.map +1 -1
  190. package/dist/builtins/res/group.d.ts +284 -3
  191. package/dist/builtins/res/group.js +147 -76
  192. package/dist/builtins/res/group.js.map +1 -1
  193. package/dist/builtins/res/image.d.ts +30 -2
  194. package/dist/builtins/res/image.js +62 -10
  195. package/dist/builtins/res/image.js.map +1 -1
  196. package/dist/builtins/res/play.d.ts +71 -9
  197. package/dist/builtins/res/play.js +124 -82
  198. package/dist/builtins/res/play.js.map +1 -1
  199. package/dist/builtins/res/plugininstance.d.ts +307 -2
  200. package/dist/builtins/res/plugininstance.js +122 -50
  201. package/dist/builtins/res/plugininstance.js.map +1 -1
  202. package/dist/builtins/res/pluginmeta.d.ts +244 -2
  203. package/dist/builtins/res/pluginmeta.js +98 -40
  204. package/dist/builtins/res/pluginmeta.js.map +1 -1
  205. package/dist/builtins/res/record.d.ts +37 -3
  206. package/dist/builtins/res/record.js +127 -57
  207. package/dist/builtins/res/record.js.map +1 -1
  208. package/dist/builtins/res/resourceList.d.ts +136 -0
  209. package/dist/builtins/res/resourceList.js +51 -0
  210. package/dist/builtins/res/resourceList.js.map +1 -0
  211. package/dist/builtins/res/tag.d.ts +244 -3
  212. package/dist/builtins/res/tag.js +97 -41
  213. package/dist/builtins/res/tag.js.map +1 -1
  214. package/dist/builtins/res/user.d.ts +122 -3
  215. package/dist/builtins/res/user.js +83 -21
  216. package/dist/builtins/res/user.js.map +1 -1
  217. package/dist/builtins/res/workflow.d.ts +244 -2
  218. package/dist/builtins/res/workflow.js +97 -40
  219. package/dist/builtins/res/workflow.js.map +1 -1
  220. package/dist/builtins/store.d.ts +85 -3
  221. package/dist/builtins/store.js +135 -68
  222. package/dist/builtins/store.js.map +1 -1
  223. package/dist/builtins/sys/apropos.d.ts +80 -5
  224. package/dist/builtins/sys/apropos.js +121 -15
  225. package/dist/builtins/sys/apropos.js.map +1 -1
  226. package/dist/builtins/sys/cal.d.ts +44 -5
  227. package/dist/builtins/sys/cal.js +57 -10
  228. package/dist/builtins/sys/cal.js.map +1 -1
  229. package/dist/builtins/sys/command.d.ts +20 -0
  230. package/dist/builtins/sys/command.js +31 -0
  231. package/dist/builtins/sys/command.js.map +1 -1
  232. package/dist/builtins/sys/context.d.ts +13 -3
  233. package/dist/builtins/sys/context.js +51 -4
  234. package/dist/builtins/sys/context.js.map +1 -1
  235. package/dist/builtins/sys/date.d.ts +56 -5
  236. package/dist/builtins/sys/date.js +63 -9
  237. package/dist/builtins/sys/date.js.map +1 -1
  238. package/dist/builtins/sys/echo.d.ts +63 -2
  239. package/dist/builtins/sys/echo.js +87 -8
  240. package/dist/builtins/sys/echo.js.map +1 -1
  241. package/dist/builtins/sys/fortune.d.ts +27 -2
  242. package/dist/builtins/sys/fortune.js +44 -2
  243. package/dist/builtins/sys/fortune.js.map +1 -1
  244. package/dist/builtins/sys/grep.d.ts +245 -11
  245. package/dist/builtins/sys/grep.js +418 -131
  246. package/dist/builtins/sys/grep.js.map +1 -1
  247. package/dist/builtins/sys/joblets.d.ts +66 -7
  248. package/dist/builtins/sys/joblets.js +101 -14
  249. package/dist/builtins/sys/joblets.js.map +1 -1
  250. package/dist/builtins/sys/motd.d.ts +37 -3
  251. package/dist/builtins/sys/motd.js +49 -8
  252. package/dist/builtins/sys/motd.js.map +1 -1
  253. package/dist/builtins/sys/notes.d.ts +75 -3
  254. package/dist/builtins/sys/notes.js +90 -29
  255. package/dist/builtins/sys/notes.js.map +1 -1
  256. package/dist/builtins/sys/physicalmode.d.ts +24 -3
  257. package/dist/builtins/sys/physicalmode.js +68 -14
  258. package/dist/builtins/sys/physicalmode.js.map +1 -1
  259. package/dist/builtins/sys/tasks.d.ts +74 -5
  260. package/dist/builtins/sys/tasks.js +102 -14
  261. package/dist/builtins/sys/tasks.js.map +1 -1
  262. package/dist/builtins/sys/textFilters.d.ts +673 -41
  263. package/dist/builtins/sys/textFilters.js +719 -264
  264. package/dist/builtins/sys/textFilters.js.map +1 -1
  265. package/dist/builtins/sys/timing.d.ts +24 -3
  266. package/dist/builtins/sys/timing.js +67 -14
  267. package/dist/builtins/sys/timing.js.map +1 -1
  268. package/dist/builtins/sys/variables.d.ts +70 -4
  269. package/dist/builtins/sys/variables.js +103 -31
  270. package/dist/builtins/sys/variables.js.map +1 -1
  271. package/dist/builtins/sys/version.d.ts +27 -2
  272. package/dist/builtins/sys/version.js +48 -3
  273. package/dist/builtins/sys/version.js.map +1 -1
  274. package/dist/builtins/sys/weather.d.ts +92 -15
  275. package/dist/builtins/sys/weather.js +71 -45
  276. package/dist/builtins/sys/weather.js.map +1 -1
  277. package/dist/builtins/sys/whoami.d.ts +38 -18
  278. package/dist/builtins/sys/whoami.js +112 -8
  279. package/dist/builtins/sys/whoami.js.map +1 -1
  280. package/dist/builtins/utils.d.ts +1 -38
  281. package/dist/builtins/utils.js +1 -87
  282. package/dist/builtins/utils.js.map +1 -1
  283. package/dist/chris/backend.js +2 -0
  284. package/dist/chris/backend.js.map +1 -1
  285. package/dist/chris/chrisCommands.js +62 -159
  286. package/dist/chris/chrisCommands.js.map +1 -1
  287. package/dist/chris/commandFallback.d.ts +12 -0
  288. package/dist/chris/commandFallback.js +47 -0
  289. package/dist/chris/commandFallback.js.map +1 -1
  290. package/dist/chris/files.js +24 -85
  291. package/dist/chris/files.js.map +1 -1
  292. package/dist/chris/filesystem.js +7 -5
  293. package/dist/chris/filesystem.js.map +1 -1
  294. package/dist/chris/help.js +0 -1082
  295. package/dist/chris/help.js.map +1 -1
  296. package/dist/chris/kinds.d.ts +30 -0
  297. package/dist/chris/kinds.js +154 -0
  298. package/dist/chris/kinds.js.map +1 -0
  299. package/dist/chris/mounts.d.ts +4 -4
  300. package/dist/chris/mounts.js +9 -16
  301. package/dist/chris/mounts.js.map +1 -1
  302. package/dist/chris/navigation.d.ts +2 -3
  303. package/dist/chris/navigation.js +6 -20
  304. package/dist/chris/navigation.js.map +1 -1
  305. package/dist/chris/pacsResources.d.ts +259 -0
  306. package/dist/chris/pacsResources.js +168 -0
  307. package/dist/chris/pacsResources.js.map +1 -0
  308. package/dist/chris/promptContext.d.ts +6 -0
  309. package/dist/chris/promptContext.js +3 -1
  310. package/dist/chris/promptContext.js.map +1 -1
  311. package/dist/core/argumentKinds.d.ts +107 -0
  312. package/dist/core/argumentKinds.js +223 -0
  313. package/dist/core/argumentKinds.js.map +1 -0
  314. package/dist/core/backend.d.ts +4 -1
  315. package/dist/core/backend.js.map +1 -1
  316. package/dist/core/commandDeclaration.d.ts +453 -0
  317. package/dist/core/commandDeclaration.js +52 -0
  318. package/dist/core/commandDeclaration.js.map +1 -0
  319. package/dist/core/commandParse.d.ts +64 -0
  320. package/dist/core/commandParse.js +468 -0
  321. package/dist/core/commandParse.js.map +1 -0
  322. package/dist/core/commandRegistry.d.ts +37 -0
  323. package/dist/core/commandRegistry.js +100 -3
  324. package/dist/core/commandRegistry.js.map +1 -1
  325. package/dist/core/commandSchema.d.ts +32 -0
  326. package/dist/core/commandSchema.js +117 -0
  327. package/dist/core/commandSchema.js.map +1 -0
  328. package/dist/core/commandUsage.d.ts +62 -0
  329. package/dist/core/commandUsage.js +247 -0
  330. package/dist/core/commandUsage.js.map +1 -0
  331. package/dist/core/coreCommands.js +66 -214
  332. package/dist/core/coreCommands.js.map +1 -1
  333. package/dist/core/dispatch.js +15 -8
  334. package/dist/core/dispatch.js.map +1 -1
  335. package/dist/core/paths.d.ts +51 -0
  336. package/dist/core/paths.js +86 -2
  337. package/dist/core/paths.js.map +1 -1
  338. package/dist/core/preprocess.d.ts +10 -9
  339. package/dist/core/preprocess.js +10 -20
  340. package/dist/core/preprocess.js.map +1 -1
  341. package/dist/core/warmupFailures.d.ts +34 -2
  342. package/dist/core/warmupFailures.js +43 -2
  343. package/dist/core/warmupFailures.js.map +1 -1
  344. package/dist/lib/completer/cfsPaths.d.ts +14 -0
  345. package/dist/lib/completer/cfsPaths.js +91 -0
  346. package/dist/lib/completer/cfsPaths.js.map +1 -0
  347. package/dist/lib/completer/declared.d.ts +15 -0
  348. package/dist/lib/completer/declared.js +189 -0
  349. package/dist/lib/completer/declared.js.map +1 -0
  350. package/dist/lib/completer/index.js +33 -79
  351. package/dist/lib/completer/index.js.map +1 -1
  352. package/dist/lib/parser.d.ts +5 -8
  353. package/dist/lib/parser.js +2 -11
  354. package/dist/lib/parser.js.map +1 -1
  355. package/dist/lib/vfs/vfs.d.ts +2 -1
  356. package/dist/lib/vfs/vfs.js +9 -6
  357. package/dist/lib/vfs/vfs.js.map +1 -1
  358. package/dist/lib/wildcard.js +2 -3
  359. package/dist/lib/wildcard.js.map +1 -1
  360. package/dist/notes.json +1 -1
  361. package/package.json +6 -5
@@ -6,47 +6,98 @@
6
6
  * argus desktops, prompt choices — as files under `~/.config/...` on CFS.
7
7
  * Surfaces hold no upload credentials of their own, so the write travels
8
8
  * the session: content arrives base64-encoded, lands in a host temp file,
9
- * and rides the same upload path the edit-in-place flow already uses.
9
+ * and rides the same upload path the edit-in-place flow already uses. The
10
+ * document is written where the store keeps its path (`storePath_resolve`).
11
+ *
12
+ * Declared in one record (`configCommand`): one subcommand, `write`, with a
13
+ * CFS path and the content as a word.
14
+ *
15
+ * Key components:
16
+ * - configCommand: the declaration.
17
+ * - builtin_config: the declaration run over words already split.
18
+ *
19
+ * Typical usage:
20
+ * ```ts
21
+ * await builtin_config(['write', '~/.config/argus/desktops/quad.desk', 'dmlldyBmaWxlcwo=']);
22
+ * ```
23
+ *
24
+ * Dependencies: salsa's upload and chili's replace-in-place; the session's
25
+ * listing cache.
10
26
  *
11
27
  * @module
12
28
  */
13
29
  import { writeFileSync, unlinkSync, existsSync } from 'fs';
14
30
  import { tmpdir } from 'os';
15
- import { join } from 'path';
31
+ import { join, posix } from 'path';
16
32
  import chalk from 'chalk';
17
33
  import { files_uploadPath } from '@fnndsc/salsa';
18
34
  import { file_replaceContent } from '@fnndsc/chili/commands/fs/edit.js';
19
- import { path_resolve } from '../utils.js';
35
+ import { path_resolve, storePath_resolve } from '../utils.js';
36
+ import { command_declare } from '../../core/commandDeclaration.js';
37
+ import { declaredCommand_run } from '../../core/commandParse.js';
38
+ import { listingCache_get } from '../../core/filesystem.js';
20
39
  import { envelope_error, envelope_ok } from '@fnndsc/menu';
21
40
  import { exitCode_set } from '../../core/handlerRun.js';
22
41
  /** A config document is a note, not a dataset. */
23
42
  const CONFIG_WRITE_LIMIT = 256 * 1024;
43
+ /** What a `config` line may hold: `write`, a CFS path, and the document as base64. */
44
+ const CONFIG_GRAMMAR = {
45
+ subcommands: {
46
+ write: {
47
+ summary: 'Write a configuration document',
48
+ operands: [
49
+ { name: 'path', kind: 'cfsPath', summary: 'Where the document goes in ChRIS' },
50
+ { name: 'content', kind: 'word', summary: 'The document, base64-encoded' },
51
+ ],
52
+ },
53
+ },
54
+ };
55
+ /**
56
+ * `config write <path> <content>`: the declaration.
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * commands_register({ declarations: [configCommand] }, 'backend');
61
+ * ```
62
+ */
63
+ export const configCommand = command_declare({
64
+ name: 'config',
65
+ grammar: CONFIG_GRAMMAR,
66
+ help: {
67
+ summary: "Write a small configuration document into the user's CUBE home",
68
+ description: 'Write a small configuration document into the user\'s CUBE home (the durable layer: argus desktops, surface preferences). Reads travel the ordinary cat. Documents are notes, not datasets: 256KB limit.',
69
+ category: 'Files',
70
+ examples: [
71
+ 'config write ~/.config/argus/desktops/quad.desk dmlldyBmaWxlcwo= # a saved argus desktop',
72
+ 'cat ~/.config/argus/desktops/quad.desk # reading one back',
73
+ ],
74
+ },
75
+ handler: async (args) => configWrite_run(args),
76
+ });
77
+ /**
78
+ * `config` over words already split: the declaration's parse and handler.
79
+ *
80
+ * @param args - The words after `config`.
81
+ * @returns The subcommand's envelope, or the refusal of a bad line.
82
+ */
83
+ export async function builtin_config(args) {
84
+ return declaredCommand_run(configCommand, args);
85
+ }
24
86
  /**
25
- * Handles `config write <path> <base64>`.
87
+ * Runs `config write <path> <base64>`.
26
88
  *
27
- * @param args - Full command args (`config`, `write`, path, base64).
89
+ * @param args - The line, parsed.
28
90
  * @returns An envelope reporting the written path.
29
91
  */
30
- export async function configWrite_handle(args) {
31
- const rawPath = args[2];
32
- const encoded = args[3];
33
- if (rawPath === undefined || encoded === undefined) {
34
- exitCode_set(1);
35
- return envelope_error('', undefined, 'usage: config write <cfs-path> <base64-content>\n');
36
- }
37
- let content;
38
- try {
39
- content = Buffer.from(encoded, 'base64');
40
- }
41
- catch {
42
- exitCode_set(1);
43
- return envelope_error('', undefined, 'config write: the content is not valid base64.\n');
44
- }
92
+ async function configWrite_run(args) {
93
+ const rawPath = args.operands.path;
94
+ const content = Buffer.from(args.operands.content, 'base64');
45
95
  if (content.length > CONFIG_WRITE_LIMIT) {
46
96
  exitCode_set(1);
47
97
  return envelope_error('', undefined, 'config write: a config document is a note, not a dataset (256KB limit).\n');
48
98
  }
49
- const remotePath = rawPath.startsWith('/') ? rawPath : await path_resolve(rawPath);
99
+ const shown = await path_resolve(rawPath);
100
+ const remotePath = await storePath_resolve(rawPath);
50
101
  const tmpPath = join(tmpdir(), `chell-config-${Date.now()}.tmp`);
51
102
  try {
52
103
  writeFileSync(tmpPath, content);
@@ -59,26 +110,16 @@ export async function configWrite_handle(args) {
59
110
  }
60
111
  if (!uploaded) {
61
112
  exitCode_set(1);
62
- return envelope_error('', undefined, `config write: upload to ${remotePath} failed.\n`);
113
+ return envelope_error('', undefined, `config write: upload to ${shown} failed.\n`);
63
114
  }
64
- return envelope_ok(`${chalk.green('[+]')} wrote ${remotePath} (${content.length} bytes)\n`);
115
+ // The folder's listing is stale by both its names.
116
+ listingCache_get().cache_invalidate?.(posix.dirname(remotePath));
117
+ listingCache_get().cache_invalidate?.(posix.dirname(shown));
118
+ return envelope_ok(`${chalk.green('[+]')} wrote ${shown} (${content.length} bytes)\n`);
65
119
  }
66
120
  finally {
67
121
  if (existsSync(tmpPath))
68
122
  unlinkSync(tmpPath);
69
123
  }
70
124
  }
71
- /**
72
- * Routes the `config` command family. `write` is its only member today;
73
- * reads travel the ordinary `cat`.
74
- *
75
- * @param args - Full command args.
76
- * @returns The subcommand's envelope.
77
- */
78
- export async function builtin_config(args) {
79
- if (args[1] === 'write')
80
- return configWrite_handle(args);
81
- exitCode_set(1);
82
- return envelope_error('', undefined, 'usage: config write <cfs-path> <base64-content>\n');
83
- }
84
125
  //# sourceMappingURL=configWrite.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"configWrite.js","sourceRoot":"","sources":["../../../src/builtins/fs/configWrite.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"configWrite.js","sourceRoot":"","sources":["../../../src/builtins/fs/configWrite.ts"],"names":[],"mappings":"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"}
@@ -12,12 +12,47 @@ export interface CpModelData {
12
12
  failed: number;
13
13
  }
14
14
  /**
15
- * Copies a file or directory.
16
- * Supports multiple sources when destination is a directory.
15
+ * `cp [-rt] [--target-directory <dir>] <paths…>`: the declaration.
17
16
  *
18
- * @param args - [flags, src1, src2, ..., dest]
17
+ * @example
18
+ * ```ts
19
+ * commands_register({ declarations: [cpCommand] });
20
+ * ```
21
+ */
22
+ export declare const cpCommand: import("../../core/commandDeclaration.js").CommandDeclaration<{
23
+ readonly operands: readonly [{
24
+ readonly name: "paths";
25
+ readonly kind: "cfsPath";
26
+ readonly repeat: true;
27
+ readonly glob: true;
28
+ readonly summary: "The sources, then the destination; a lone source asks where it goes";
29
+ }];
30
+ readonly options: {
31
+ readonly recursive: {
32
+ readonly short: "r";
33
+ readonly long: "recursive";
34
+ readonly summary: "Recursive copy (for directories)";
35
+ };
36
+ readonly askTarget: {
37
+ readonly short: "t";
38
+ readonly summary: "Every operand is a source; asks for the target directory, and the answer must be one";
39
+ };
40
+ readonly targetDirectory: {
41
+ readonly long: "target-directory";
42
+ readonly summary: "Every operand is a source; copy into this directory";
43
+ readonly value: {
44
+ readonly name: "dir";
45
+ readonly kind: "cfsPath";
46
+ };
47
+ };
48
+ };
49
+ }>;
50
+ /**
51
+ * `cp` over words already split: the declaration's parse and handler.
52
+ *
53
+ * @param args - The words after `cp`.
19
54
  * @returns An envelope whose rendered text reports progress and results and
20
- * whose model carries per-source outcomes.
55
+ * whose model carries per-source outcomes, or the refusal of a bad line.
21
56
  */
22
57
  export declare function builtin_cp(args: string[]): Promise<CommandEnvelope>;
23
58
  /** Typed invocation options for cp. */
@@ -1,59 +1,77 @@
1
1
  /**
2
- * @file Builtin cp command.
3
- * Copies files or directories, reported as a command envelope.
2
+ * @file `cp`: copies files and folders within ChRIS's filesystem (CFS),
3
+ * reported as a command envelope.
4
+ *
5
+ * Declared in one record (`cpCommand`): the sources, then the destination,
6
+ * each a path that may be a wildcard; a lone source, or `-t`, asks where.
7
+ * Each path is acted on where the store keeps it (`storePath_resolve`): a
8
+ * source through a link is what the link points at, and a destination
9
+ * through a link lands in the link's target. What cp says names the paths
10
+ * as the session resolves them.
11
+ *
12
+ * Key components:
13
+ * - cpCommand: the declaration.
14
+ * - builtin_cp: the declaration run over words already split.
15
+ * - cp_run: the typed core behind both, and the typed API.
16
+ *
17
+ * Typical usage:
18
+ * ```ts
19
+ * await builtin_cp(['-r', 'data', 'backup/']);
20
+ * await cp_run({ sources: ['a.txt'], dest: 'b.txt' });
21
+ * ```
22
+ *
23
+ * Dependencies: the session's filesystem and listing cache, and the
24
+ * destination question.
25
+ *
26
+ * @module
4
27
  */
5
28
  import chalk from 'chalk';
6
29
  import path from 'path';
7
- import { commandArgs_process, optionsUnknown_refusal, path_resolve } from '../utils.js';
30
+ import { path_resolve, storePath_resolve } from '../utils.js';
31
+ import { command_declare } from '../../core/commandDeclaration.js';
32
+ import { declaredCommand_run } from '../../core/commandParse.js';
8
33
  import { listingCache_get, vfsDispatcher_get } from '../../core/filesystem.js';
9
34
  import { destination_ask, destination_missing, operands_fix } from './destination.js';
10
35
  import { cp_render, vfsRefusal_text } from '@fnndsc/fond';
11
36
  import { pathEntry_find, entry_isFolder } from './entries.js';
12
37
  import { envelope_ok, envelope_error } from '@fnndsc/menu';
13
38
  import { exitCode_set } from '../../core/handlerRun.js';
39
+ /** What a `cp` line may hold. */
40
+ const CP_GRAMMAR = {
41
+ operands: [
42
+ { name: 'paths', kind: 'cfsPath', repeat: true, glob: true, summary: 'The sources, then the destination; a lone source asks where it goes' },
43
+ ],
44
+ options: {
45
+ recursive: { short: 'r', long: 'recursive', summary: 'Recursive copy (for directories)' },
46
+ askTarget: { short: 't', summary: 'Every operand is a source; asks for the target directory, and the answer must be one' },
47
+ targetDirectory: { long: 'target-directory', summary: 'Every operand is a source; copy into this directory', value: { name: 'dir', kind: 'cfsPath' } },
48
+ },
49
+ };
14
50
  /**
15
- * Copies a file or directory.
16
- * Supports multiple sources when destination is a directory.
51
+ * Runs a parsed `cp` line: into a target directory given or asked for, to a
52
+ * destination asked for a lone source, or to the last operand.
17
53
  *
18
- * @param args - [flags, src1, src2, ..., dest]
19
- * @returns An envelope whose rendered text reports progress and results and
20
- * whose model carries per-source outcomes.
54
+ * @param args - The typed line.
55
+ * @returns The copy's envelope, or the refusal of an abandoned question.
21
56
  */
22
- export async function builtin_cp(args) {
23
- const parsed = commandArgs_process(args, { booleanLongOptions: ['recursive'] });
24
- const refusal = optionsUnknown_refusal('cp', parsed, ['t', 'r', 'recursive']);
25
- if (refusal !== null)
26
- return envelope_error('', undefined, `${chalk.red(refusal)}\n`);
27
- const pathArgs = parsed._;
28
- // `-t <dir>` names the TARGET DIRECTORY, so every operand is a source —
29
- // the shell's own answer to "several things, one destination". Given no
30
- // value it is a question (an-absent-value-is-a-question), and the answer
31
- // wants a directory: `cp a b` without it means rename a ONTO b, which
32
- // is the right reading of that line and the wrong thing for a set.
33
- const target = parsed.t;
34
- if (target !== undefined && pathArgs.length > 0) {
35
- if (typeof target === 'string' && target !== '') {
36
- return cp_run({ sources: pathArgs, dest: target });
37
- }
38
- // The sources are fixed before the question: other commands run while it is open.
39
- const sources = await operands_fix(pathArgs);
40
- const chosen = await destination_ask({
41
- verb: 'cp', commit: 'COPY HERE', sources, wantsDirectory: true,
42
- });
43
- if (chosen === '') {
44
- exitCode_set(1);
45
- return envelope_error('', undefined, `${chalk.red(destination_missing('cp'))}\n`);
46
- }
47
- return cp_run({ sources, dest: chosen });
48
- }
49
- const recursive = !!parsed['r'] || !!parsed['recursive'];
50
- // One operand names what to copy and not where: a question, not a usage
51
- // error. See `destination_ask`.
52
- if (pathArgs.length === 1) {
57
+ async function cp_handle(args) {
58
+ const paths = args.operands.paths;
59
+ const recursive = args.options.recursive;
60
+ // `--target-directory <dir>` names the TARGET DIRECTORY, so every operand
61
+ // is a source: the shell's own answer to "several things, one destination".
62
+ const target = args.options.targetDirectory;
63
+ if (target !== undefined)
64
+ return cp_run({ sources: paths, dest: target, recursive });
65
+ // `-t` alone is that line with the directory not said: a question
66
+ // (an-absent-value-is-a-question), and the answer wants a directory:
67
+ // `cp a b` without it means copy a ONTO b, the right reading of that line
68
+ // and the wrong thing for a set. One operand names what to copy and not
69
+ // where: a question too, not a usage error. See `destination_ask`.
70
+ if (args.options.askTarget || paths.length === 1) {
53
71
  // The sources are fixed before the question: other commands run while it is open.
54
- const sources = await operands_fix(pathArgs);
72
+ const sources = await operands_fix(paths);
55
73
  const chosen = await destination_ask({
56
- verb: 'cp', commit: 'COPY HERE', sources,
74
+ verb: 'cp', commit: 'COPY HERE', sources, ...(args.options.askTarget ? { wantsDirectory: true } : {}),
57
75
  });
58
76
  if (chosen === '') {
59
77
  exitCode_set(1);
@@ -61,12 +79,61 @@ export async function builtin_cp(args) {
61
79
  }
62
80
  return cp_run({ sources, dest: chosen, recursive });
63
81
  }
64
- // Last arg is destination, all others are sources
65
- return cp_run({
66
- sources: pathArgs.slice(0, -1),
67
- dest: pathArgs.length > 0 ? pathArgs[pathArgs.length - 1] : '',
68
- recursive,
69
- });
82
+ // The last operand is the destination, all others are sources.
83
+ return cp_run({ sources: paths.slice(0, -1), dest: paths[paths.length - 1] ?? '', recursive });
84
+ }
85
+ /**
86
+ * `cp [-rt] [--target-directory <dir>] <paths…>`: the declaration.
87
+ *
88
+ * @example
89
+ * ```ts
90
+ * commands_register({ declarations: [cpCommand] });
91
+ * ```
92
+ */
93
+ export const cpCommand = command_declare({
94
+ name: 'cp',
95
+ grammar: CP_GRAMMAR,
96
+ help: {
97
+ summary: 'Copy files or directories (supports wildcards and multiple sources)',
98
+ description: "Copies files or folders within ChRIS's filesystem: the last operand is the destination, and several sources want a folder there. Given only a source, the destination is asked for. A path through a link is the link's target: a copy into a linked folder lands in the folder it points at. PACS sources: a /net/pacs/queries/... source names query results, not stored files, and cp materializes the series: if its DICOMs are not yet in CUBE it fires a PACS retrieve and waits for them to land (the same engine as pull), then copies the landed files to the destination. A series already fully in CUBE is copied without a retrieve.",
99
+ category: 'Files',
100
+ posix: { group: 'Files', differs: 'copies within CFS; -r for folders' },
101
+ examples: [
102
+ 'cp file.txt copy.txt # Copy single file',
103
+ 'cp -r dir1/ dir2/ # Copy directory recursively',
104
+ 'cp file1 file2 file3 dest/ # Copy multiple files',
105
+ 'cp uploads/*.txt backup/ # Copy with wildcard',
106
+ 'cp --target-directory backup/ a b # Copy several into one folder',
107
+ 'cp -t a.txt b.txt # Ask which folder they go to',
108
+ 'cp "file with spaces.txt" dest/ # Use quotes for spaces',
109
+ 'cp -r /net/pacs/queries/AccessionNumber:123_qid:7/Study_1.2.3_Head/Series_1.2.3.4_AX_T2 results/',
110
+ ' # Retrieve-if-needed, then copy the series',
111
+ ],
112
+ },
113
+ handler: cp_handle,
114
+ });
115
+ /**
116
+ * `cp` over words already split: the declaration's parse and handler.
117
+ *
118
+ * @param args - The words after `cp`.
119
+ * @returns An envelope whose rendered text reports progress and results and
120
+ * whose model carries per-source outcomes, or the refusal of a bad line.
121
+ */
122
+ export async function builtin_cp(args) {
123
+ return declaredCommand_run(cpCommand, args);
124
+ }
125
+ /**
126
+ * Forgets the cached listings a write to a destination changes: beneath it
127
+ * (a recursive copy replaces them) and of its parent, by each name it has.
128
+ *
129
+ * @param listCache - The session's listing cache.
130
+ * @param names - The destination as the session names it and as the store keeps it.
131
+ */
132
+ function destination_invalidate(listCache, names) {
133
+ for (const name of new Set(names)) {
134
+ listCache.cache_invalidateTree?.(name);
135
+ listCache.cache_invalidate?.(path.posix.dirname(name));
136
+ }
70
137
  }
71
138
  /**
72
139
  * Copies files or directories: the shared typed core behind the parsed
@@ -84,6 +151,8 @@ export async function cp_run(options) {
84
151
  }
85
152
  const recursive = options.recursive ?? false;
86
153
  const destPath = await path_resolve(dest);
154
+ // Written where the store keeps it: into a linked folder lands in the link's target.
155
+ const destStore = await storePath_resolve(destPath);
87
156
  const listCache = listingCache_get();
88
157
  let successCount = 0;
89
158
  let failCount = 0;
@@ -102,10 +171,11 @@ export async function cp_run(options) {
102
171
  }
103
172
  // Into a folder the destination names, the copy keeps its name.
104
173
  const dispatcher = vfsDispatcher_get();
105
- const finalDest = entry_isFolder(await pathEntry_find(dispatcher, destPath)) && !dispatcher.path_isVirtual(destPath)
106
- ? path.posix.join(destPath, path.posix.basename(srcPath))
107
- : destPath;
108
- const copied = await dispatcher.cp(srcPath, finalDest, { recursive });
174
+ const finalDest = entry_isFolder(await pathEntry_find(dispatcher, destStore)) && !dispatcher.path_isVirtual(destStore)
175
+ ? path.posix.join(destStore, path.posix.basename(srcPath))
176
+ : destStore;
177
+ // Copied from where the store keeps it (a /proc data path, a link); named as it was asked.
178
+ const copied = await dispatcher.cp(await storePath_resolve(srcPath), finalDest, { recursive });
109
179
  const success = copied.ok;
110
180
  if (sources.length === 1) {
111
181
  rendered += `${cp_render(srcPath, destPath, success)}\n`;
@@ -131,11 +201,7 @@ export async function cp_run(options) {
131
201
  failCount++;
132
202
  }
133
203
  }
134
- // Invalidate the destination subtree (a recursive copy replaces whatever
135
- // listings were cached beneath it) and its parent.
136
- listCache.cache_invalidateTree?.(destPath);
137
- const destParent = path.posix.dirname(destPath);
138
- listCache.cache_invalidate?.(destParent);
204
+ destination_invalidate(listCache, [destPath, destStore]);
139
205
  // Summary for multiple files
140
206
  if (sources.length > 1) {
141
207
  if (failCount === 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"cp.js","sourceRoot":"","sources":["../../../src/builtins/fs/cp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cp.js","sourceRoot":"","sources":["../../../src/builtins/fs/cp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,eAAe,EAA8C,MAAM,kCAAkC,CAAC;AAC/G,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE/E,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,EAAE,SAAS,EAAE,eAAe,EAAuC,MAAM,cAAc,CAAC;AAC/F,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAmB,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAgBxD,iCAAiC;AACjC,MAAM,UAAU,GAAG;IACjB,QAAQ,EAAE;QACR,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,qEAAqE,EAAE;KAC7I;IACD,OAAO,EAAE;QACP,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,kCAAkC,EAAE;QACzF,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,sFAAsF,EAAE;QAC1H,eAAe,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,qDAAqD,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;KACvJ;CACgC,CAAC;AAEpC;;;;;;GAMG;AACH,KAAK,UAAU,SAAS,CAAC,IAAyC;IAChE,MAAM,KAAK,GAAa,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC5C,MAAM,SAAS,GAAY,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IAClD,0EAA0E;IAC1E,4EAA4E;IAC5E,MAAM,MAAM,GAAuB,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;IAChE,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACrF,kEAAkE;IAClE,qEAAqE;IACrE,0EAA0E;IAC1E,wEAAwE;IACxE,mEAAmE;IACnE,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,kFAAkF;QAClF,MAAM,OAAO,GAAa,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,MAAM,GAAW,MAAM,eAAe,CAAC;YAC3C,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtG,CAAC,CAAC;QACH,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;YAClB,YAAY,CAAC,CAAC,CAAC,CAAC;YAChB,OAAO,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QACpF,CAAC;QACD,OAAO,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,+DAA+D;IAC/D,OAAO,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;AACjG,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,eAAe,CAAC;IACvC,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE;QACJ,OAAO,EAAE,qEAAqE;QAC9E,WAAW,EAAE,knBAAknB;QAC/nB,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,mCAAmC,EAAE;QACvE,QAAQ,EAAE;YACR,sDAAsD;YACtD,gEAAgE;YAChE,yDAAyD;YACzD,wDAAwD;YACxD,kEAAkE;YAClE,iEAAiE;YACjE,2DAA2D;YAC3D,kGAAkG;YAClG,8EAA8E;SAC/E;KACF;IACD,OAAO,EAAE,SAAS;CACnB,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAc;IAC7C,OAAO,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC9C,CAAC;AAYD;;;;;;GAMG;AACH,SAAS,sBAAsB,CAAC,SAAuB,EAAE,KAAwB;IAC/E,KAAK,MAAM,IAAI,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,SAAS,CAAC,oBAAoB,EAAE,CAAC,IAAI,CAAC,CAAC;QACvC,SAAS,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAkB;IAC7C,MAAM,OAAO,GAAa,OAAO,CAAC,OAAO,CAAC;IAC1C,MAAM,IAAI,GAAW,OAAO,CAAC,IAAI,CAAC;IAElC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QACxC,OAAO,cAAc,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,IAAI,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,SAAS,GAAY,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAEtD,MAAM,QAAQ,GAAW,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IAClD,qFAAqF;IACrF,MAAM,SAAS,GAAW,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAiB,gBAAgB,EAAE,CAAC;IACnD,IAAI,YAAY,GAAW,CAAC,CAAC;IAC7B,IAAI,SAAS,GAAW,CAAC,CAAC;IAC1B,IAAI,QAAQ,GAAW,EAAE,CAAC;IAC1B,IAAI,WAAW,GAAW,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAgB,EAAE,CAAC;IAEjC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,OAAO,GAAW,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;YAEhD,sDAAsD;YACtD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,QAAQ,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,KAAK,CAAC,IAAI,CAAC;YACzD,CAAC;iBAAM,CAAC;gBACN,QAAQ,IAAI,WAAW,OAAO,OAAO,QAAQ,OAAO,CAAC;YACvD,CAAC;YAED,gEAAgE;YAChE,MAAM,UAAU,GAAkB,iBAAiB,EAAE,CAAC;YACtD,MAAM,SAAS,GAAW,cAAc,CAAC,MAAM,cAAc,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC;gBAC5H,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC1D,CAAC,CAAC,SAAS,CAAC;YACd,2FAA2F;YAC3F,MAAM,MAAM,GAAe,MAAM,UAAU,CAAC,EAAE,CAAC,MAAM,iBAAiB,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;YAC3G,MAAM,OAAO,GAAY,MAAM,CAAC,EAAE,CAAC;YAEnC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,QAAQ,IAAI,GAAG,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC;YAC3D,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,gEAAgE;gBAChE,2EAA2E;gBAC3E,MAAM,IAAI,GAAW,MAAM,CAAC,MAAM,IAAI,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;gBACvF,WAAW,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,IAAI,CAAC;YACjF,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YACpD,IAAI,OAAO,EAAE,CAAC;gBACZ,YAAY,EAAE,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,SAAS,EAAE,CAAC;YACd,CAAC;QACH,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,GAAG,GAAW,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC/D,WAAW,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC;YACtD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9C,SAAS,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED,sBAAsB,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IAEzD,6BAA6B;IAC7B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACpB,QAAQ,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,YAAY,eAAe,QAAQ,EAAE,CAAC,IAAI,CAAC;QACpF,CAAC;aAAM,CAAC;YACN,QAAQ,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,YAAY,aAAa,SAAS,SAAS,CAAC,IAAI,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACrG,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAoB,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,IAAI,SAAS,CAAC,CAAC;QAChG,QAAQ,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACpD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,WAAW,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;AACnE,CAAC"}
@@ -1,9 +1,36 @@
1
1
  import { type CommandEnvelope } from '@fnndsc/menu';
2
2
  /**
3
- * Downloads a remote ChRIS file or directory to the local filesystem, or hands
4
- * it to the surface when the engine's disk is not the operator's.
3
+ * `download [-f] <source…> <destination>`: the declaration.
5
4
  *
6
- * @param args - [remotePathOrGlob, localPath] plus optional -f/--force to overwrite.
7
- * @returns An envelope carrying the download summary.
5
+ * @example
6
+ * ```ts
7
+ * commands_register({ declarations: [downloadCommand] }, 'backend');
8
+ * ```
9
+ */
10
+ export declare const downloadCommand: import("../../core/commandDeclaration.js").CommandDeclaration<{
11
+ readonly operands: readonly [{
12
+ readonly name: "source";
13
+ readonly kind: "cfsPath";
14
+ readonly repeat: true;
15
+ readonly glob: true;
16
+ readonly summary: "What to download: a ChRIS file or folder; a wildcard matches paths";
17
+ }, {
18
+ readonly name: "destination";
19
+ readonly kind: "hostPath";
20
+ readonly summary: "Where it goes on this machine's disk; several sources go into one folder";
21
+ }];
22
+ readonly options: {
23
+ readonly force: {
24
+ readonly short: "f";
25
+ readonly long: "force";
26
+ readonly summary: "Overwrite local paths that exist";
27
+ };
28
+ };
29
+ }>;
30
+ /**
31
+ * `download` over words already split: the declaration's parse and handler.
32
+ *
33
+ * @param args - The words after `download`.
34
+ * @returns The download summary, or the refusal of a bad line.
8
35
  */
9
36
  export declare function builtin_download(args: string[]): Promise<CommandEnvelope>;