@@ -373,6 +373,91 @@ async def _handle_run_action(
373373)
374374
375375
376+ async def _handle_actions_reload (
377+ params : dict | None , ws_context : context .WorkspaceContext
378+ ) -> dict :
379+ """Reload an action's handlers in all relevant extension runners.
380+
381+ Params: ``{"action_node_id": "project_path::action_name"}``
382+ Result: ``{}``
383+ """
384+ from finecode .api_server .runner import runner_client
385+
386+ params = params or {}
387+ action_node_id = params .get ("action_node_id" , "" )
388+ parts = action_node_id .split ("::" )
389+ if len (parts ) < 2 :
390+ raise ValueError (f"Invalid action_node_id: { action_node_id !r} " )
391+
392+ project_path = pathlib .Path (parts [0 ])
393+ action_name = parts [1 ]
394+
395+ runners_by_env = ws_context .ws_projects_extension_runners .get (project_path , {})
396+ for runner in runners_by_env .values ():
397+ await runner_client .reload_action (runner , action_name )
398+
399+ return {}
400+
401+
402+ async def _handle_runners_list (
403+ params : dict | None , ws_context : context .WorkspaceContext
404+ ) -> dict :
405+ """List all extension runners and their status.
406+
407+ Result: ``{"runners": [{"project_path", "env_name", "status", "readable_id"}]}``
408+ """
409+ from finecode .api_server .runner import runner_client
410+
411+ runners = []
412+ for project_path , runners_by_env in ws_context .ws_projects_extension_runners .items ():
413+ for env_name , runner in runners_by_env .items ():
414+ runners .append ({
415+ "project_path" : str (project_path ),
416+ "env_name" : env_name ,
417+ "status" : runner .status .name ,
418+ "readable_id" : runner .readable_id ,
419+ })
420+ return {"runners" : runners }
421+
422+
423+ async def _handle_runners_restart (
424+ params : dict | None , ws_context : context .WorkspaceContext
425+ ) -> dict :
426+ """Restart a specific extension runner.
427+
428+ Params: ``{"runner_working_dir": "/abs/path", "env_name": "dev_workspace", "debug": false}``
429+ Result: ``{}``
430+ """
431+ from finecode .api_server .runner import runner_manager
432+
433+ params = params or {}
434+ runner_working_dir = params .get ("runner_working_dir" )
435+ env_name = params .get ("env_name" )
436+ debug = params .get ("debug" , False )
437+
438+ if not runner_working_dir or not env_name :
439+ raise ValueError ("runner_working_dir and env_name are required" )
440+
441+ await runner_manager .restart_extension_runner (
442+ runner_working_dir_path = pathlib .Path (runner_working_dir ),
443+ env_name = env_name ,
444+ ws_context = ws_context ,
445+ debug = debug ,
446+ )
447+ return {}
448+
449+
450+ async def _handle_server_reset (
451+ params : dict | None , ws_context : context .WorkspaceContext
452+ ) -> dict :
453+ """Reset the server state.
454+
455+ Result: ``{}``
456+ """
457+ logger .info ("FineCode API: server reset requested" )
458+ return {}
459+
460+
376461# -- helpers ---------------------------------------------------------------
377462
378463def _notify_client (writer : asyncio .StreamWriter , method : str , params : dict ) -> None :
@@ -503,11 +588,12 @@ async def _handle_run_with_partial_results_task(
503588 "actions/run" : _handle_run_action ,
504589 "actions/runBatch" : _stub ("actions/runBatch" ),
505590 # (runWithPartialResults is handled specially in _handle_client)
506- "actions/reload" : _stub ( "actions/reload" ) ,
591+ "actions/reload" : _handle_actions_reload ,
507592 # runners:
508- "runners/list" : _stub ( "runners/list" ) ,
509- "runners/restart" : _stub ( "runners/restart" ) ,
593+ "runners/list" : _handle_runners_list ,
594+ "runners/restart" : _handle_runners_restart ,
510595 # server/
596+ "server/reset" : _handle_server_reset ,
511597 "server/shutdown" : _stub ("server/shutdown" ),
512598}
513599
0 commit comments