@gadmin2n/schematics 0.0.95 → 0.0.97
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/application/files/gadmin2-game-angle-demo/DESIGN.md +348 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/PRODUCT.md +75 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/workflow.prisma +5 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +24 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.controller.ts +32 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.service.ts +28 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-dsl-validate.spec.ts +220 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-dsl-validate.ts +129 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.dto.ts +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.ts +4 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.spec.ts +46 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +27 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.service.spec.ts +6 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/node-types.ts +43 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/validate.ts +109 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/tests/validate.test.ts +205 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/promptGenerator.ts +19 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +55 -56
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/layout.tsx +7 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/logo.tsx +7 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +179 -160
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/title.tsx +34 -31
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +24 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +24 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +24 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +173 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +27 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasApi.ts +29 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasConfigRegistry.tsx +2 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasContextMenuRegistry.tsx +98 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableConfigModal.tsx +192 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/utils/tableCodeUtils.ts +338 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.tsx +66 -51
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/EnhancedFlowRenderer.tsx +7 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.tsx +66 -26
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/FlowRenderer.tsx +7 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +9 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.ts +30 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/show.tsx +9 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types.ts +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.ts +27 -0
- package/package.json +1 -1
|
@@ -118,6 +118,35 @@ export function useWorkflowAgent({ nodeTypes }: UseWorkflowAgentOptions) {
|
|
|
118
118
|
)
|
|
119
119
|
.join('\n');
|
|
120
120
|
|
|
121
|
+
const enumeratedHandleRules = nodeTypes
|
|
122
|
+
.filter((nt) => Array.isArray(nt.outputs) && nt.outputs.length > 0)
|
|
123
|
+
.map(
|
|
124
|
+
(nt) =>
|
|
125
|
+
` - ${nt.type}: sourceHandle MUST be one of [${nt
|
|
126
|
+
.outputs!.map((o) => `'${o}'`)
|
|
127
|
+
.join(', ')}]`,
|
|
128
|
+
)
|
|
129
|
+
.join('\n');
|
|
130
|
+
|
|
131
|
+
const dynamicHandleRules = nodeTypes
|
|
132
|
+
.filter((nt) => nt.outputs === null)
|
|
133
|
+
.map(
|
|
134
|
+
(nt) =>
|
|
135
|
+
` - ${nt.type}: sourceHandle MUST match a value listed in this node's config.cases[].value`,
|
|
136
|
+
)
|
|
137
|
+
.join('\n');
|
|
138
|
+
|
|
139
|
+
const noHandleTypes = nodeTypes
|
|
140
|
+
.filter((nt) => Array.isArray(nt.outputs) && nt.outputs.length === 0)
|
|
141
|
+
.map((nt) => nt.type)
|
|
142
|
+
.join(', ');
|
|
143
|
+
|
|
144
|
+
const handleSection = `
|
|
145
|
+
Source handle rules (each edge's sourceHandle MUST match the source node's outputs):
|
|
146
|
+
${enumeratedHandleRules}
|
|
147
|
+
${dynamicHandleRules}
|
|
148
|
+
For ALL OTHER node types (${noHandleTypes}), edges MUST NOT include the sourceHandle field — omit it entirely.`;
|
|
149
|
+
|
|
121
150
|
return `You are a workflow DSL generator. Output ONLY a JSON object wrapped in \`\`\`json code block.
|
|
122
151
|
|
|
123
152
|
Available node types:
|
|
@@ -131,6 +160,7 @@ DSL format:
|
|
|
131
160
|
|
|
132
161
|
Each node: { "id": "uuid", "type": "node_type", "label": "Display Name", "position": {"x": number, "y": number}, "config": {...} }
|
|
133
162
|
Each edge: { "id": "uuid", "source": "nodeId", "target": "nodeId", "sourceHandle?": "string", "label?": "string" }
|
|
163
|
+
${handleSection}
|
|
134
164
|
|
|
135
165
|
Position nodes using: x = vertical order (increment by 250 for each sequential step), y = horizontal lane (0 for single-path flows; use different y values spaced by 200 only for parallel branches).`;
|
|
136
166
|
}, [nodeTypes]);
|
|
@@ -81,9 +81,16 @@ export default function WorkflowShowPage() {
|
|
|
81
81
|
const [selectedNodeId, setSelectedNodeId] = useState<string | null>(null);
|
|
82
82
|
|
|
83
83
|
const nodeTypeMap = useMemo(() => {
|
|
84
|
-
const map: Record<
|
|
84
|
+
const map: Record<
|
|
85
|
+
string,
|
|
86
|
+
{ category: string; icon: string; outputs?: string[] | null }
|
|
87
|
+
> = {};
|
|
85
88
|
for (const nt of nodeTypes) {
|
|
86
|
-
map[nt.type] = {
|
|
89
|
+
map[nt.type] = {
|
|
90
|
+
category: nt.category,
|
|
91
|
+
icon: nt.icon,
|
|
92
|
+
outputs: nt.outputs,
|
|
93
|
+
};
|
|
87
94
|
}
|
|
88
95
|
return map;
|
|
89
96
|
}, [nodeTypes]);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { WorkflowNode } from '../types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Resolve the list of named output handles for a node at render time.
|
|
5
|
+
*
|
|
6
|
+
* - `switch` nodes derive their handles from `config.cases[].value` so the
|
|
7
|
+
* canvas reflects user-edited cases without round-tripping through the
|
|
8
|
+
* nodeType meta.
|
|
9
|
+
* - All other node types use the declared `outputs` from the WorkflowNodeType
|
|
10
|
+
* API (Phase 4); a missing or empty list means "render a single anonymous
|
|
11
|
+
* handle", which is what the canvas falls back to.
|
|
12
|
+
*/
|
|
13
|
+
export function resolveOutputs(
|
|
14
|
+
node: WorkflowNode,
|
|
15
|
+
nodeTypeMeta: { outputs?: string[] | null } | undefined,
|
|
16
|
+
): string[] {
|
|
17
|
+
if (node.type === 'switch') {
|
|
18
|
+
const cases = (node.config as any)?.cases as
|
|
19
|
+
| Array<{ value?: string }>
|
|
20
|
+
| undefined;
|
|
21
|
+
if (!Array.isArray(cases)) return [];
|
|
22
|
+
return cases
|
|
23
|
+
.map((c) => c?.value)
|
|
24
|
+
.filter((v): v is string => typeof v === 'string' && v.length > 0);
|
|
25
|
+
}
|
|
26
|
+
return nodeTypeMeta?.outputs ?? [];
|
|
27
|
+
}
|