@@ -147,6 +147,8 @@ export class DockerSocketHandler extends AgentSocketHandler {
147147 msgi18n : true ,
148148 } , callback ) ;
149149 server . sendStackList ( ) ;
150+
151+ stack . leaveCombinedTerminal ( socket ) ;
150152 } catch ( e ) {
151153 callbackError ( e , callback ) ;
152154 }
@@ -238,6 +240,68 @@ export class DockerSocketHandler extends AgentSocketHandler {
238240 }
239241 } ) ;
240242
243+ // Start a service
244+ agentSocket . on ( "startService" , async ( stackName : unknown , serviceName : unknown , callback ) => {
245+ try {
246+ checkLogin ( socket ) ;
247+
248+ if ( typeof ( stackName ) !== "string" || typeof ( serviceName ) !== "string" ) {
249+ throw new ValidationError ( "Stack name and service name must be strings" ) ;
250+ }
251+
252+ const stack = await Stack . getStack ( server , stackName ) ;
253+ await stack . startService ( socket , serviceName ) ;
254+ stack . joinCombinedTerminal ( socket ) ; // Ensure the combined terminal is joined
255+ callbackResult ( {
256+ ok : true ,
257+ msg : "Service " + serviceName + " started"
258+ } , callback ) ;
259+ server . sendStackList ( ) ;
260+ } catch ( e ) {
261+ callbackError ( e , callback ) ;
262+ }
263+ } ) ;
264+
265+ // Stop a service
266+ agentSocket . on ( "stopService" , async ( stackName : unknown , serviceName : unknown , callback ) => {
267+ try {
268+ checkLogin ( socket ) ;
269+
270+ if ( typeof ( stackName ) !== "string" || typeof ( serviceName ) !== "string" ) {
271+ throw new ValidationError ( "Stack name and service name must be strings" ) ;
272+ }
273+
274+ const stack = await Stack . getStack ( server , stackName ) ;
275+ await stack . stopService ( socket , serviceName ) ;
276+ callbackResult ( {
277+ ok : true ,
278+ msg : "Service " + serviceName + " stopped"
279+ } , callback ) ;
280+ server . sendStackList ( ) ;
281+ } catch ( e ) {
282+ callbackError ( e , callback ) ;
283+ }
284+ } ) ;
285+
286+ agentSocket . on ( "restartService" , async ( stackName : unknown , serviceName : unknown , callback ) => {
287+ try {
288+ checkLogin ( socket ) ;
289+
290+ if ( typeof stackName !== "string" || typeof serviceName !== "string" ) {
291+ throw new Error ( "Invalid stackName or serviceName" ) ;
292+ }
293+
294+ const stack = await Stack . getStack ( server , stackName , true ) ;
295+ await stack . restartService ( socket , serviceName ) ;
296+ callbackResult ( {
297+ ok : true ,
298+ msg : "Service " + serviceName + " restarted"
299+ } , callback ) ;
300+ } catch ( e ) {
301+ callbackError ( e , callback ) ;
302+ }
303+ } ) ;
304+
241305 // getExternalNetworkList
242306 agentSocket . on ( "getDockerNetworkList" , async ( callback ) => {
243307 try {
0 commit comments