From 8c2884cc6f00f0ddd49bff0488c8f0ebf40c7821 Mon Sep 17 00:00:00 2001 From: Virgil Date: Thu, 2 Apr 2026 06:14:48 +0000 Subject: [PATCH] fix(agentic): keep process actions registered Co-Authored-By: Virgil --- pkg/agentic/process_register.go | 35 +++++++++++++++++----------- pkg/agentic/process_register_test.go | 19 +++++++++++++++ 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/pkg/agentic/process_register.go b/pkg/agentic/process_register.go index c2910cf..a229c8c 100644 --- a/pkg/agentic/process_register.go +++ b/pkg/agentic/process_register.go @@ -19,21 +19,28 @@ func ProcessRegister(c *core.Core) core.Result { if c == nil { return core.Result{Value: core.E("agentic.ProcessRegister", "core is required", nil), OK: false} } - if result := c.Service("process"); result.OK { - return core.Result{OK: true} - } - factory := process.NewService(process.Options{}) - instance, err := factory(c) - if err != nil { - return core.Result{Value: core.E("agentic.ProcessRegister", "create process service", err), OK: false} - } - service, ok := instance.(*process.Service) - if !ok { - return core.Result{Value: core.E("agentic.ProcessRegister", "unexpected process service type", nil), OK: false} - } - if registerResult := c.RegisterService("process", service); !registerResult.OK { - return registerResult + var service *process.Service + if result := c.Service("process"); result.OK { + existing, ok := result.Value.(*process.Service) + if !ok || existing == nil { + return core.Result{Value: core.E("agentic.ProcessRegister", "unexpected process service type", nil), OK: false} + } + service = existing + } else { + factory := process.NewService(process.Options{}) + instance, err := factory(c) + if err != nil { + return core.Result{Value: core.E("agentic.ProcessRegister", "create process service", err), OK: false} + } + created, ok := instance.(*process.Service) + if !ok { + return core.Result{Value: core.E("agentic.ProcessRegister", "unexpected process service type", nil), OK: false} + } + service = created + if registerResult := c.RegisterService("process", service); !registerResult.OK { + return registerResult + } } handlers := &processActionHandlers{service: service} diff --git a/pkg/agentic/process_register_test.go b/pkg/agentic/process_register_test.go index 2187a3c..3c2d8fc 100644 --- a/pkg/agentic/process_register_test.go +++ b/pkg/agentic/process_register_test.go @@ -38,6 +38,25 @@ func TestProcessRegister_ProcessRegister_Ugly_DoubleRegister(t *testing.T) { assert.True(t, r2.OK, "second ProcessRegister call should not fail") } +func TestProcessRegister_ProcessRegister_Ugly_PreRegisteredService(t *testing.T) { + t.Setenv("CORE_WORKSPACE", t.TempDir()) + + c := core.New() + factory := process.NewService(process.Options{}) + instance, err := factory(c) + require.NoError(t, err) + + service, ok := instance.(*process.Service) + require.True(t, ok) + require.True(t, c.RegisterService("process", service).OK) + + result := ProcessRegister(c) + require.True(t, result.OK) + assert.True(t, c.Action("process.run").Exists(), "existing process service should still register actions") + assert.True(t, c.Action("process.start").Exists(), "existing process service should still register actions") + assert.True(t, c.Action("process.kill").Exists(), "existing process service should still register actions") +} + func TestProcessRegister_HandleRun_Good(t *testing.T) { t.Setenv("CORE_WORKSPACE", t.TempDir())