package inboxapp import ( "context" dashboardapp "inbox/internal/app/dashboard" humantasksapp "inbox/internal/app/humantasks" lanesapp "inbox/internal/app/lanes" rolesapp "inbox/internal/app/roles" "inbox/internal/app/runtimeconfig" skillsapp "inbox/internal/app/skills" systemfsapp "inbox/internal/app/systemfs" taskexecapp "inbox/internal/app/taskexec" tasksapp "inbox/internal/app/tasks" topicsapp "inbox/internal/app/topics" "inbox/internal/app/workflowrun" workspacelifecycleapp "inbox/internal/app/workspacelifecycle" "inbox/internal/app/workspaceprovision" "inbox/internal/app/workspaceruntime" workspacesapp "inbox/internal/app/workspaces" "inbox/internal/base/timeutil" "inbox/internal/domain/lane" "inbox/internal/domain/workspace" sqlitestore "inbox/internal/store/sqlite" ) type WorkspaceProvisioner interface { Provision(ctx context.Context, req workspaceprovision.ProvisionRequest) (workspace.Workspace, workspaceruntime.Runtime, error) } type WorkspaceRuntimeManager interface { Ensure(ctx context.Context, workspaceID string) (workspace.Workspace, workspaceruntime.Runtime, error) EnsureLane(ctx context.Context, laneID string) (lane.Record, error) StopLane(ctx context.Context, laneID string) (lane.Record, error) } type Options struct { WorkspaceProvision WorkspaceProvisioner WorkspaceRuntime WorkspaceRuntimeManager } type Services struct { Roles *rolesapp.Service Skills *skillsapp.Service RuntimeConfig *runtimeconfig.Service Workspaces *workspacesapp.Service WorkspaceOps *workspacelifecycleapp.Service Topics *topicsapp.Service Lanes *lanesapp.Service Tasks *tasksapp.Service HumanTasks *humantasksapp.Service WorkflowRun *workflowrun.Service TaskExec *taskexecapp.Service Dashboard *dashboardapp.Service SystemFS *systemfsapp.Service } func BuildServices(store *sqlitestore.Store, clock timeutil.Clock, opts Options) Services { roleService := rolesapp.NewService(store, store, clock) skillService := skillsapp.NewService(store) runtimeConfigService := runtimeconfig.NewService(store, store, clock) workspacesService := workspacesapp.NewService(store) workspaceLifecycleService := workspacelifecycleapp.NewService(opts.WorkspaceProvision, opts.WorkspaceRuntime) topicsService := topicsapp.NewService(store, opts.WorkspaceRuntime, clock) lanesService := lanesapp.NewService(store, opts.WorkspaceRuntime, clock) tasksService := tasksapp.NewService(store, clock) humanTasksService := humantasksapp.NewService(store, clock) taskExecOptions := make([]taskexecapp.Option, 0, 1) if releaser, ok := any(opts.WorkspaceRuntime).(taskexecapp.LaneRuntimeReleaser); ok { taskExecOptions = append(taskExecOptions, taskexecapp.WithLaneRuntimeReleaser(releaser)) } taskExecService := taskexecapp.NewService(store, runtimeConfigService, clock, taskExecOptions...) return Services{ Roles: roleService, Skills: skillService, RuntimeConfig: runtimeConfigService, Workspaces: workspacesService, WorkspaceOps: workspaceLifecycleService, Topics: topicsService, Lanes: lanesService, Tasks: tasksService, HumanTasks: humanTasksService, WorkflowRun: workflowrun.NewService(store, runtimeConfigService, clock), TaskExec: taskExecService, Dashboard: dashboardapp.NewService(store), SystemFS: systemfsapp.NewService(), } }