@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.
Files changed (43) hide show
  1. package/dist/lib/application/files/gadmin2-game-angle-demo/DESIGN.md +348 -0
  2. package/dist/lib/application/files/gadmin2-game-angle-demo/PRODUCT.md +75 -0
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/workflow.prisma +5 -0
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +24 -1
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.controller.ts +32 -3
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.service.ts +28 -6
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-dsl-validate.spec.ts +220 -0
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-dsl-validate.ts +129 -0
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.dto.ts +1 -0
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.ts +4 -0
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.spec.ts +46 -0
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +27 -0
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.service.spec.ts +6 -0
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/node-types.ts +43 -4
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/validate.ts +109 -0
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/tests/validate.test.ts +205 -0
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +1 -1
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/promptGenerator.ts +19 -3
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +55 -56
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/layout.tsx +7 -3
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/logo.tsx +7 -1
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +179 -160
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/title.tsx +34 -31
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +24 -0
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +24 -2
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +24 -2
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +173 -1
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +27 -2
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasApi.ts +29 -0
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasConfigRegistry.tsx +2 -0
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasContextMenuRegistry.tsx +98 -3
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableConfigModal.tsx +192 -0
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/utils/tableCodeUtils.ts +338 -0
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.tsx +66 -51
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/EnhancedFlowRenderer.tsx +7 -1
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.tsx +66 -26
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/FlowRenderer.tsx +7 -1
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +9 -2
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.ts +30 -0
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/show.tsx +9 -2
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types.ts +1 -0
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.ts +27 -0
  43. 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<string, { category: string; icon: string }> = {};
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] = { category: nt.category, icon: nt.icon };
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]);
@@ -83,6 +83,7 @@ export interface WorkflowNodeType {
83
83
  configSchema: Record<string, any>;
84
84
  inputSchema: Record<string, any>;
85
85
  outputSchema: Record<string, any>;
86
+ outputs: string[] | null;
86
87
  }
87
88
 
88
89
  export interface NodeInstanceAgentOutput {
@@ -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
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gadmin2n/schematics",
3
- "version": "0.0.95",
3
+ "version": "0.0.97",
4
4
  "description": "Gadmin - modern, fast, powerful node.js web framework (@schematics)",
5
5
  "main": "dist/index.js",
6
6
  "files": [