refactor(ax): add semantic workspace message handler

This commit is contained in:
Virgil 2026-03-30 22:45:15 +00:00
parent 14418b7782
commit 64427aec1b
2 changed files with 42 additions and 14 deletions

View file

@ -195,21 +195,34 @@ func (service *Service) HandleWorkspaceCommand(command WorkspaceCommand) core.Re
return core.Result{OK: true}
}
// Example: result := service.HandleIPCEvents(core.New(), map[string]any{"action": WorkspaceSwitchAction, "workspaceID": "f3f0d7"})
// HandleIPCEvents preserves the legacy map[string]any payload and still accepts WorkspaceCommand values.
func (service *Service) HandleIPCEvents(_ *core.Core, message core.Message) core.Result {
// Example: result := service.HandleWorkspaceMessage(core.New(), WorkspaceCommand{Action: WorkspaceSwitchAction, WorkspaceID: "f3f0d7"})
// Example: legacy := service.HandleWorkspaceMessage(core.New(), map[string]any{"action": WorkspaceCreateAction, "identifier": "alice", "password": "pass123"})
func (service *Service) HandleWorkspaceMessage(_ *core.Core, message core.Message) core.Result {
command, ok := workspaceCommandFromMessage(message)
if !ok {
return core.Result{OK: true}
}
return service.HandleWorkspaceCommand(command)
}
// Example: result := service.HandleIPCEvents(core.New(), WorkspaceCommand{Action: WorkspaceSwitchAction, WorkspaceID: "f3f0d7"})
func (service *Service) HandleIPCEvents(coreRuntime *core.Core, message core.Message) core.Result {
return service.HandleWorkspaceMessage(coreRuntime, message)
}
func workspaceCommandFromMessage(message core.Message) (WorkspaceCommand, bool) {
switch payload := message.(type) {
case WorkspaceCommand:
return service.HandleWorkspaceCommand(payload)
return payload, true
case map[string]any:
command := WorkspaceCommand{}
command.Action, _ = payload["action"].(string)
command.Identifier, _ = payload["identifier"].(string)
command.Password, _ = payload["password"].(string)
command.WorkspaceID, _ = payload["workspaceID"].(string)
return service.HandleWorkspaceCommand(command)
return command, true
}
return core.Result{OK: true}
return WorkspaceCommand{}, false
}
func resolveWorkspaceHomeDirectory() string {

View file

@ -93,10 +93,10 @@ func TestService_WorkspaceFileSet_TraversalBlocked_Bad(t *testing.T) {
require.Error(t, err)
}
func TestService_HandleWorkspaceCommand_Good(t *testing.T) {
func TestService_HandleWorkspaceMessage_Good(t *testing.T) {
s, _ := newTestService(t)
create := s.HandleWorkspaceCommand(WorkspaceCommand{
create := s.HandleWorkspaceMessage(core.New(), WorkspaceCommand{
Action: WorkspaceCreateAction,
Identifier: "ipc-user",
Password: "pass123",
@ -107,14 +107,14 @@ func TestService_HandleWorkspaceCommand_Good(t *testing.T) {
require.True(t, ok)
require.NotEmpty(t, workspaceID)
switchResult := s.HandleWorkspaceCommand(WorkspaceCommand{
switchResult := s.HandleWorkspaceMessage(core.New(), WorkspaceCommand{
Action: WorkspaceSwitchAction,
WorkspaceID: workspaceID,
})
assert.True(t, switchResult.OK)
assert.Equal(t, workspaceID, s.activeWorkspaceID)
legacyCreate := s.HandleIPCEvents(core.New(), map[string]any{
legacyCreate := s.HandleWorkspaceMessage(core.New(), map[string]any{
"action": WorkspaceCreateAction,
"identifier": "legacy-user",
"password": "pass123",
@ -125,26 +125,41 @@ func TestService_HandleWorkspaceCommand_Good(t *testing.T) {
require.True(t, ok)
require.NotEmpty(t, legacyWorkspaceID)
legacySwitch := s.HandleIPCEvents(core.New(), WorkspaceCommand{
legacySwitch := s.HandleWorkspaceMessage(core.New(), WorkspaceCommand{
Action: WorkspaceSwitchAction,
WorkspaceID: legacyWorkspaceID,
})
assert.True(t, legacySwitch.OK)
assert.Equal(t, legacyWorkspaceID, s.activeWorkspaceID)
rejectedLegacySwitch := s.HandleIPCEvents(core.New(), map[string]any{
rejectedLegacySwitch := s.HandleWorkspaceMessage(core.New(), map[string]any{
"action": WorkspaceSwitchAction,
"name": workspaceID,
})
assert.False(t, rejectedLegacySwitch.OK)
assert.Equal(t, legacyWorkspaceID, s.activeWorkspaceID)
failedSwitch := s.HandleIPCEvents(core.New(), map[string]any{
failedSwitch := s.HandleWorkspaceMessage(core.New(), map[string]any{
"action": WorkspaceSwitchAction,
"workspaceID": "missing",
})
assert.False(t, failedSwitch.OK)
unknown := s.HandleIPCEvents(core.New(), "noop")
unknown := s.HandleWorkspaceMessage(core.New(), "noop")
assert.True(t, unknown.OK)
}
func TestService_HandleIPCEvents_Compatibility_Good(t *testing.T) {
s, _ := newTestService(t)
result := s.HandleIPCEvents(core.New(), WorkspaceCommand{
Action: WorkspaceCreateAction,
Identifier: "compat-user",
Password: "pass123",
})
assert.True(t, result.OK)
workspaceID, ok := result.Value.(string)
require.True(t, ok)
require.NotEmpty(t, workspaceID)
}