Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
graph mutation service implementation
  • Loading branch information
jtydhr88 committed Sep 18, 2025
commit b58fe1184c4d0aadb92883773f8fd876d6b7642d
532 changes: 532 additions & 0 deletions src/core/graph/operations/GRAPH_MUTATION_SERVICE_DESIGN.md
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we want to keep this markdown doc?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we can remove it from source, and move it to notion, but it is easy to update here, lets keep it in source for now, I will remove it until we merge

Large diffs are not rendered by default.

14 changes: 14 additions & 0 deletions src/core/graph/operations/GraphMutationError.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
export class GraphMutationError extends Error {
public readonly code: string
public readonly context: Record<string, any>

constructor(
message: string,
context: Record<string, any>,
code = 'GRAPH_MUTATION_ERROR'
) {
super(message)
this.code = code
this.context = context
}
}
148 changes: 148 additions & 0 deletions src/core/graph/operations/IGraphMutationService.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
import type { GraphMutationError } from '@/core/graph/operations/GraphMutationError'
import type {
AddNodeInputParams,
AddNodeOutputParams,
AddNodesToGroupParams,
AddRerouteParams,
ChangeNodeModeParams,
ConnectParams,
CreateGroupParams,
CreateNodeParams,
CreateSubgraphParams,
DisconnectParams,
GraphMutationOperation,
NodeInputSlotParams,
Result,
SubgraphIndexParams,
SubgraphNameTypeParams,
UpdateGroupTitleParams,
UpdateNodePropertyParams,
UpdateNodeTitleParams
} from '@/core/graph/operations/types'
import type { GroupId } from '@/lib/litegraph/src/LGraphGroup'
import type { LGraphNode } from '@/lib/litegraph/src/LGraphNode'
import type { LinkId } from '@/lib/litegraph/src/LLink'
import type { RerouteId } from '@/lib/litegraph/src/Reroute'
import type { NodeId } from '@/platform/workflow/validation/schemas/workflowSchema'

export interface IGraphMutationService {
applyOperation(
operation: GraphMutationOperation
): Promise<Result<any, GraphMutationError>>

createNode(
params: CreateNodeParams
): Promise<Result<NodeId, GraphMutationError>>

getNodeById(nodeId: NodeId): LGraphNode

removeNode(nodeId: NodeId): Promise<Result<void, GraphMutationError>>

updateNodeProperty(
params: UpdateNodePropertyParams
): Promise<Result<void, GraphMutationError>>

updateNodeTitle(
params: UpdateNodeTitleParams
): Promise<Result<void, GraphMutationError>>

changeNodeMode(
params: ChangeNodeModeParams
): Promise<Result<void, GraphMutationError>>

cloneNode(nodeId: NodeId): Promise<Result<NodeId, GraphMutationError>>

connect(params: ConnectParams): Promise<Result<LinkId, GraphMutationError>>

disconnect(
params: DisconnectParams
): Promise<Result<boolean, GraphMutationError>>

disconnectLink(linkId: LinkId): Promise<Result<void, GraphMutationError>>

createGroup(
params: CreateGroupParams
): Promise<Result<GroupId, GraphMutationError>>

removeGroup(groupId: GroupId): Promise<Result<void, GraphMutationError>>

updateGroupTitle(
params: UpdateGroupTitleParams
): Promise<Result<void, GraphMutationError>>

addNodesToGroup(
params: AddNodesToGroupParams
): Promise<Result<void, GraphMutationError>>

recomputeGroupNodes(
groupId: GroupId
): Promise<Result<void, GraphMutationError>>

addReroute(
params: AddRerouteParams
): Promise<Result<RerouteId, GraphMutationError>>

removeReroute(rerouteId: RerouteId): Promise<Result<void, GraphMutationError>>

copyNodes(nodeIds: NodeId[]): Promise<Result<void, GraphMutationError>>

cutNodes(nodeIds: NodeId[]): Promise<Result<void, GraphMutationError>>

pasteNodes(): Promise<Result<NodeId[], GraphMutationError>>

addSubgraphNodeInput(
params: AddNodeInputParams
): Promise<Result<number, GraphMutationError>>

addSubgraphNodeOutput(
params: AddNodeOutputParams
): Promise<Result<number, GraphMutationError>>

removeSubgraphNodeInput(
params: NodeInputSlotParams
): Promise<Result<void, GraphMutationError>>

removeSubgraphNodeOutput(
params: NodeInputSlotParams
): Promise<Result<void, GraphMutationError>>

createSubgraph(params: CreateSubgraphParams): Promise<
Result<
{
subgraph: any
node: any
},
GraphMutationError
>
>

unpackSubgraph(
subgraphNodeId: NodeId
): Promise<Result<void, GraphMutationError>>

addSubgraphInput(
params: SubgraphNameTypeParams
): Promise<Result<void, GraphMutationError>>

addSubgraphOutput(
params: SubgraphNameTypeParams
): Promise<Result<void, GraphMutationError>>

removeSubgraphInput(
params: SubgraphIndexParams
): Promise<Result<void, GraphMutationError>>

removeSubgraphOutput(
params: SubgraphIndexParams
): Promise<Result<void, GraphMutationError>>

clearGraph(): Promise<Result<void, GraphMutationError>>

bypassNode(nodeId: NodeId): Promise<Result<void, GraphMutationError>>

unbypassNode(nodeId: NodeId): Promise<Result<void, GraphMutationError>>

undo(): Promise<Result<void, GraphMutationError>>

redo(): Promise<Result<void, GraphMutationError>>
}
Loading
Loading