Skip to content

Commit c20d55d

Browse files
committed
add ocif library with initial implementation and tests and have separate ai-flow which runs in worker
1 parent 454d71c commit c20d55d

32 files changed

+1147
-235
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import {
2+
Flow,
3+
BaseNodeInfo,
4+
IComputeResult,
5+
} from '@devhelpr/visual-programming-system';
6+
7+
export interface AIWorkerMessage {
8+
message: string;
9+
flow: Flow<BaseNodeInfo>;
10+
}
11+
12+
export interface AIWorkerMessageResponse {
13+
message: string;
14+
result: IComputeResult;
15+
}
16+
17+
export interface AIWorkerWorker extends Omit<Worker, 'postMessage'> {
18+
postMessage: (message: AIWorkerMessage) => void;
19+
}
20+
21+
export interface AIWorkerWorkerSelf extends Omit<Worker, 'postMessage'> {
22+
postMessage: (message: AIWorkerMessageResponse) => void;
23+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/// <reference lib="webworker" />
2+
3+
import { IComputeResult } from '@devhelpr/visual-programming-system';
4+
import { FlowEngine } from '../flow-engine/flow-engine';
5+
import {
6+
AIWorkerMessage,
7+
AIWorkerWorkerSelf,
8+
} from './ai-flow-engine-worker-message';
9+
import { run } from '@devhelpr/web-flow-executor';
10+
11+
declare let self: AIWorkerWorkerSelf;
12+
console.log('WORKER RuntimeFlowContext', run);
13+
// Message event handler
14+
self.addEventListener('message', (event: MessageEvent<AIWorkerMessage>) => {
15+
try {
16+
const { data } = event;
17+
18+
const flowEngine = new FlowEngine();
19+
flowEngine.onSendUpdateToNode = (data, node) => {
20+
console.log('onSendUpdateToNode', data, node);
21+
self.postMessage({
22+
message: 'node-update',
23+
result: {
24+
result: node.id,
25+
output: data,
26+
} as IComputeResult,
27+
});
28+
};
29+
flowEngine.initialize(data.flow.flows['flow'].nodes);
30+
flowEngine
31+
.run()
32+
.then((output) => {
33+
// Send the result back to the main thread
34+
self.postMessage({
35+
message: 'computation-result',
36+
result: {
37+
result: 'success',
38+
output: output,
39+
followPath: undefined,
40+
},
41+
});
42+
})
43+
.catch((error) => {
44+
self.postMessage({
45+
message: 'error',
46+
result: {
47+
result: error?.toString?.() ?? 'Error in flow engine worker',
48+
output: undefined,
49+
followPath: undefined,
50+
},
51+
});
52+
});
53+
} catch (error) {
54+
self.postMessage({
55+
message: 'error',
56+
result: {
57+
result: error?.toString?.() ?? 'Error in flow engine worker',
58+
output: undefined,
59+
followPath: undefined,
60+
},
61+
});
62+
}
63+
});
64+
65+
// Error handling
66+
self.addEventListener('error', (error) => {
67+
console.log('Worker error:', error.message);
68+
self.postMessage({
69+
message: 'error',
70+
result: {
71+
result: error.message,
72+
output: undefined,
73+
followPath: undefined,
74+
},
75+
});
76+
});
77+
78+
export {};

apps/vps-web/src/app/custom-nodes/classes/core-properties-settings-editor.tsx

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,22 @@
1-
import { createJSXElement } from '@devhelpr/visual-programming-system';
1+
import {
2+
createJSXElement,
3+
renderElement,
4+
} from '@devhelpr/visual-programming-system';
5+
6+
class TestLabel extends HTMLElement {
7+
constructor() {
8+
super();
9+
10+
renderElement(
11+
<label>
12+
<slot name="label-text"></slot>
13+
</label>,
14+
this
15+
);
16+
}
17+
}
18+
19+
customElements.define('test-label', TestLabel);
220

321
const COLOR_PRESETS: [number, number, number][] = [
422
[0, 0, 0], // black
@@ -85,6 +103,9 @@ export const CorePropertiesSetupEditor = (
85103
<element:Fragment>
86104
<div class="control-group">
87105
<label>Stroke color</label>
106+
<test-label>
107+
<slot name="label-text">Stroke color</slot>
108+
</test-label>
88109
<input
89110
type="color"
90111
id="strokeColorPicker"

apps/vps-web/src/app/custom-nodes/rect-node.tsx

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ export const getRectNode =
9393
width: 200,
9494
height: 100,
9595
nodeInfo: {
96+
isOCIFNode: true,
9697
fillColor: fillColorDefault,
9798
strokeColor: strokeColorDefault,
9899
strokeWidth: strokeWidthDefault,
@@ -104,14 +105,22 @@ export const getRectNode =
104105
}
105106
rect = nodeInstance.rect;
106107
node = nodeInstance.node as IRectNodeComponent<NodeInfo>;
108+
109+
if (!node.nodeInfo) {
110+
node.nodeInfo = {} as any;
111+
}
112+
107113
if (!flowNode) {
108-
if (!node.nodeInfo) {
109-
node.nodeInfo = {} as any;
114+
if (node.nodeInfo) {
115+
(node.nodeInfo as any).fillColor = fillColorDefault;
116+
(node.nodeInfo as any).strokeColor = strokeColorDefault;
117+
(node.nodeInfo as any).strokeWidth = strokeWidthDefault;
118+
(node.nodeInfo as any).text = 'rect';
110119
}
111-
(node.nodeInfo as any).fillColor = fillColorDefault;
112-
(node.nodeInfo as any).strokeColor = strokeColorDefault;
113-
(node.nodeInfo as any).strokeWidth = strokeWidthDefault;
114-
(node.nodeInfo as any).text = 'rect';
120+
}
121+
122+
if (node.nodeInfo) {
123+
node.nodeInfo.isOCIFNode = true;
115124
}
116125

117126
rectNode = new NodeClass(node.id, updated, node);

apps/vps-web/src/app/flow-engine/flow-engine.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ export class FlowEngine {
2828
constructor() {
2929
this.canvasApp = createRuntimeFlowContext<NodeInfo>();
3030
}
31+
onSendUpdateToNode:
32+
| undefined
33+
| ((data: any, node: IRectNodeComponent<NodeInfo>) => void);
3134
initialize(flow: FlowNode<NodeInfo>[]) {
3235
if (!this.canvasApp) {
3336
throw new Error('CanvasAppInstance not initialized');
@@ -80,6 +83,11 @@ export class FlowEngine {
8083
}
8184
private runFlow = (input?: any) => {
8285
let output: any;
86+
console.log(
87+
' this.onSendUpdateToNode',
88+
this.onSendUpdateToNode !== undefined,
89+
this.onSendUpdateToNode
90+
);
8391
return new Promise<string>((resolve, _reject) => {
8492
const runCounter = new RunCounter();
8593
runCounter.setRunCounterResetHandler(() => {
@@ -94,6 +102,7 @@ export class FlowEngine {
94102
);
95103
}
96104
});
105+
console.log('run flow', run);
97106
run(
98107
this.canvasApp?.elements,
99108
this.canvasApp,
@@ -105,7 +114,12 @@ export class FlowEngine {
105114
undefined,
106115
undefined,
107116
runCounter,
108-
false
117+
false,
118+
undefined,
119+
(data, node) => {
120+
console.log('onSendUpdateToNode', data, node);
121+
this.onSendUpdateToNode?.(data, node);
122+
}
109123
);
110124
});
111125
};

0 commit comments

Comments
 (0)