@geenius/ai-workflow 0.1.0 → 0.5.0
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/CHANGELOG.md +13 -0
- package/README.md +69 -1
- package/package.json +60 -27
- package/packages/convex/dist/index.d.ts +363 -0
- package/packages/convex/dist/index.js +200 -0
- package/packages/convex/dist/index.js.map +1 -0
- package/packages/react/dist/index.d.ts +514 -0
- package/packages/react/dist/index.js +2633 -0
- package/packages/react/dist/index.js.map +1 -0
- package/packages/react-css/{src/styles.css → dist/index.css} +107 -253
- package/packages/react-css/dist/index.css.map +1 -0
- package/packages/react-css/dist/index.d.ts +533 -0
- package/packages/react-css/dist/index.js +2620 -0
- package/packages/react-css/dist/index.js.map +1 -0
- package/packages/shared/dist/index.d.ts +1305 -0
- package/packages/shared/dist/index.js +1594 -0
- package/packages/shared/dist/index.js.map +1 -0
- package/packages/solidjs/dist/index.d.ts +492 -0
- package/packages/solidjs/dist/index.js +2552 -0
- package/packages/solidjs/dist/index.js.map +1 -0
- package/packages/solidjs-css/{src/styles.css → dist/index.css} +107 -253
- package/packages/solidjs-css/dist/index.css.map +1 -0
- package/packages/solidjs-css/dist/index.d.ts +509 -0
- package/packages/solidjs-css/dist/index.js +2493 -0
- package/packages/solidjs-css/dist/index.js.map +1 -0
- package/.changeset/config.json +0 -11
- package/.github/CODEOWNERS +0 -1
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -16
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -11
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -10
- package/.github/dependabot.yml +0 -11
- package/.github/workflows/ci.yml +0 -23
- package/.github/workflows/release.yml +0 -29
- package/.nvmrc +0 -1
- package/.project/ACCOUNT.yaml +0 -4
- package/.project/IDEAS.yaml +0 -7
- package/.project/PROJECT.yaml +0 -11
- package/.project/ROADMAP.yaml +0 -15
- package/CODE_OF_CONDUCT.md +0 -16
- package/CONTRIBUTING.md +0 -26
- package/SECURITY.md +0 -15
- package/SUPPORT.md +0 -8
- package/packages/convex/README.md +0 -1
- package/packages/convex/package.json +0 -12
- package/packages/convex/src/convex.config.ts +0 -3
- package/packages/convex/src/index.ts +0 -3
- package/packages/convex/src/mutations.ts +0 -36
- package/packages/convex/src/queries.ts +0 -19
- package/packages/convex/src/schema.ts +0 -24
- package/packages/convex/tsconfig.json +0 -25
- package/packages/react/README.md +0 -1
- package/packages/react/package.json +0 -46
- package/packages/react/src/components/ApprovalModal.tsx +0 -47
- package/packages/react/src/components/StepConfigPanel.tsx +0 -67
- package/packages/react/src/components/StepConnector.tsx +0 -47
- package/packages/react/src/components/StepNode.tsx +0 -38
- package/packages/react/src/components/StepPalette.tsx +0 -48
- package/packages/react/src/components/WorkflowCanvas.tsx +0 -42
- package/packages/react/src/components/WorkflowRunPanel.tsx +0 -64
- package/packages/react/src/components/WorkflowToolbar.tsx +0 -43
- package/packages/react/src/components/index.ts +0 -9
- package/packages/react/src/hooks/index.ts +0 -10
- package/packages/react/src/hooks/useApprovalGate.ts +0 -59
- package/packages/react/src/hooks/useWorkflow.ts +0 -39
- package/packages/react/src/hooks/useWorkflowBuilder.ts +0 -121
- package/packages/react/src/hooks/useWorkflowRun.ts +0 -75
- package/packages/react/src/hooks/useWorkflowStep.ts +0 -52
- package/packages/react/src/hooks/useWorkflowTemplates.ts +0 -54
- package/packages/react/src/index.ts +0 -16
- package/packages/react/src/pages/WorkflowBuilderPage.tsx +0 -81
- package/packages/react/src/pages/WorkflowRunsPage.tsx +0 -59
- package/packages/react/src/pages/index.ts +0 -3
- package/packages/react/tsconfig.json +0 -1
- package/packages/react/tsup.config.ts +0 -7
- package/packages/react-css/README.md +0 -1
- package/packages/react-css/package.json +0 -44
- package/packages/react-css/src/components/ApprovalModal.tsx +0 -6
- package/packages/react-css/src/components/StepConfigPanel.tsx +0 -7
- package/packages/react-css/src/components/StepConnector.tsx +0 -6
- package/packages/react-css/src/components/StepNode.tsx +0 -7
- package/packages/react-css/src/components/StepPalette.tsx +0 -6
- package/packages/react-css/src/components/WorkflowCanvas.tsx +0 -6
- package/packages/react-css/src/components/WorkflowRunPanel.tsx +0 -9
- package/packages/react-css/src/components/WorkflowToolbar.tsx +0 -4
- package/packages/react-css/src/components/index.ts +0 -9
- package/packages/react-css/src/hooks/index.ts +0 -3
- package/packages/react-css/src/hooks/useWorkflow.ts +0 -39
- package/packages/react-css/src/hooks/useWorkflowBuilder.ts +0 -121
- package/packages/react-css/src/index.ts +0 -7
- package/packages/react-css/src/pages/WorkflowBuilderPage.tsx +0 -16
- package/packages/react-css/src/pages/WorkflowRunsPage.tsx +0 -6
- package/packages/react-css/src/pages/index.ts +0 -3
- package/packages/react-css/tsconfig.json +0 -26
- package/packages/react-css/tsup.config.ts +0 -2
- package/packages/shared/README.md +0 -1
- package/packages/shared/package.json +0 -56
- package/packages/shared/src/__tests__/ai-workflow.test.ts +0 -217
- package/packages/shared/src/config.ts +0 -49
- package/packages/shared/src/convex/index.ts +0 -2
- package/packages/shared/src/convex/schemas.ts +0 -42
- package/packages/shared/src/engine.test.ts +0 -1
- package/packages/shared/src/engine.ts +0 -295
- package/packages/shared/src/index.ts +0 -43
- package/packages/shared/src/steps.ts +0 -68
- package/packages/shared/src/templates.ts +0 -172
- package/packages/shared/src/types.ts +0 -237
- package/packages/shared/src/utils/cost.ts +0 -79
- package/packages/shared/src/utils/dag.ts +0 -133
- package/packages/shared/src/utils/index.ts +0 -5
- package/packages/shared/src/utils/interpolation.ts +0 -53
- package/packages/shared/src/validators.ts +0 -215
- package/packages/shared/tsconfig.json +0 -1
- package/packages/shared/tsup.config.ts +0 -5
- package/packages/shared/vitest.config.ts +0 -4
- package/packages/solidjs/README.md +0 -1
- package/packages/solidjs/package.json +0 -45
- package/packages/solidjs/src/components/ApprovalModal.tsx +0 -18
- package/packages/solidjs/src/components/StepConfigPanel.tsx +0 -14
- package/packages/solidjs/src/components/StepConnector.tsx +0 -11
- package/packages/solidjs/src/components/StepNode.tsx +0 -12
- package/packages/solidjs/src/components/StepPalette.tsx +0 -22
- package/packages/solidjs/src/components/WorkflowCanvas.tsx +0 -23
- package/packages/solidjs/src/components/WorkflowRunPanel.tsx +0 -18
- package/packages/solidjs/src/components/WorkflowToolbar.tsx +0 -13
- package/packages/solidjs/src/components/index.ts +0 -9
- package/packages/solidjs/src/index.ts +0 -7
- package/packages/solidjs/src/pages/WorkflowBuilderPage.tsx +0 -37
- package/packages/solidjs/src/pages/WorkflowRunsPage.tsx +0 -20
- package/packages/solidjs/src/pages/index.ts +0 -3
- package/packages/solidjs/src/primitives/createApprovalGate.ts +0 -29
- package/packages/solidjs/src/primitives/createWorkflow.ts +0 -28
- package/packages/solidjs/src/primitives/createWorkflowBuilder.ts +0 -56
- package/packages/solidjs/src/primitives/createWorkflowRun.ts +0 -32
- package/packages/solidjs/src/primitives/createWorkflowStep.ts +0 -23
- package/packages/solidjs/src/primitives/createWorkflowTemplates.ts +0 -28
- package/packages/solidjs/src/primitives/index.ts +0 -8
- package/packages/solidjs/tsconfig.json +0 -1
- package/packages/solidjs/tsup.config.ts +0 -7
- package/packages/solidjs-css/README.md +0 -1
- package/packages/solidjs-css/package.json +0 -43
- package/packages/solidjs-css/src/components/ApprovalModal.tsx +0 -6
- package/packages/solidjs-css/src/components/StepConfigPanel.tsx +0 -7
- package/packages/solidjs-css/src/components/StepConnector.tsx +0 -6
- package/packages/solidjs-css/src/components/StepNode.tsx +0 -7
- package/packages/solidjs-css/src/components/StepPalette.tsx +0 -7
- package/packages/solidjs-css/src/components/WorkflowCanvas.tsx +0 -7
- package/packages/solidjs-css/src/components/WorkflowRunPanel.tsx +0 -8
- package/packages/solidjs-css/src/components/WorkflowToolbar.tsx +0 -5
- package/packages/solidjs-css/src/components/index.ts +0 -9
- package/packages/solidjs-css/src/index.ts +0 -7
- package/packages/solidjs-css/src/pages/WorkflowBuilderPage.tsx +0 -2
- package/packages/solidjs-css/src/pages/WorkflowRunsPage.tsx +0 -7
- package/packages/solidjs-css/src/pages/index.ts +0 -3
- package/packages/solidjs-css/src/primitives/createWorkflow.ts +0 -28
- package/packages/solidjs-css/src/primitives/createWorkflowBuilder.ts +0 -56
- package/packages/solidjs-css/src/primitives/index.ts +0 -1
- package/packages/solidjs-css/tsconfig.json +0 -27
- package/packages/solidjs-css/tsup.config.ts +0 -2
- package/pnpm-workspace.yaml +0 -2
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
// @geenius-ai-workflow/solidjs — pages/WorkflowBuilderPage.tsx
|
|
2
|
-
import type { StepType, WorkflowStepDef } from '@geenius-ai-workflow/shared'
|
|
3
|
-
import { WorkflowEngine } from '@geenius-ai-workflow/shared'
|
|
4
|
-
import type { WorkflowEngineOptions } from '@geenius-ai-workflow/shared'
|
|
5
|
-
import { Show } from 'solid-js'
|
|
6
|
-
import { createWorkflowBuilder } from '../primitives/createWorkflowBuilder'
|
|
7
|
-
import { createWorkflowRun } from '../primitives/createWorkflowRun'
|
|
8
|
-
import { WorkflowCanvas } from '../components/WorkflowCanvas'
|
|
9
|
-
import { WorkflowToolbar } from '../components/WorkflowToolbar'
|
|
10
|
-
import { StepPalette } from '../components/StepPalette'
|
|
11
|
-
import { StepConfigPanel } from '../components/StepConfigPanel'
|
|
12
|
-
import { WorkflowRunPanel } from '../components/WorkflowRunPanel'
|
|
13
|
-
|
|
14
|
-
export function WorkflowBuilderPage(props: { engineOptions: WorkflowEngineOptions; onSave?: (def: any) => void }) {
|
|
15
|
-
const builder = createWorkflowBuilder()
|
|
16
|
-
const runTracker = createWorkflowRun()
|
|
17
|
-
const handleAddStep = (type: StepType) => {
|
|
18
|
-
const step: WorkflowStepDef = { id: `step_${Date.now()}`, name: `New ${type}`, type, config: { type } as any, position: { x: 100 + builder.definition().steps.length * 250, y: 200 } }
|
|
19
|
-
builder.addStep(step)
|
|
20
|
-
}
|
|
21
|
-
const handleRun = async () => {
|
|
22
|
-
const engine = new WorkflowEngine({ ...props.engineOptions, onStepComplete: (r) => runTracker.updateStep(r) })
|
|
23
|
-
const result = await engine.execute(builder.definition())
|
|
24
|
-
runTracker.trackRun(result)
|
|
25
|
-
}
|
|
26
|
-
return (
|
|
27
|
-
<div data-workflow="builder-page">
|
|
28
|
-
<WorkflowToolbar workflowName={builder.definition().name} isDirty={builder.isDirty()} isRunning={runTracker.isRunning()} canUndo={builder.canUndo()} canRedo={builder.canRedo()} onSave={() => props.onSave?.(builder.definition())} onRun={handleRun} onUndo={builder.undo} onRedo={builder.redo} />
|
|
29
|
-
<div data-workflow="builder-layout">
|
|
30
|
-
<StepPalette onAddStep={handleAddStep} />
|
|
31
|
-
<WorkflowCanvas definition={builder.definition()} selectedStepId={builder.selectedStepId()} onSelectStep={builder.selectStep} />
|
|
32
|
-
<Show when={builder.selectedStepId()}>{(id) => { const step = () => builder.definition().steps.find(s => s.id === id()); return <Show when={step()}>{(s) => <StepConfigPanel step={s()} onUpdate={builder.updateStep} onDelete={builder.removeStep} onClose={() => builder.selectStep(null)} />}</Show> }}</Show>
|
|
33
|
-
<Show when={runTracker.run()}>{(r) => <WorkflowRunPanel run={r()} isRunning={runTracker.isRunning()} />}</Show>
|
|
34
|
-
</div>
|
|
35
|
-
</div>
|
|
36
|
-
)
|
|
37
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
// @geenius-ai-workflow/solidjs — pages/WorkflowRunsPage.tsx
|
|
2
|
-
import { For, Show } from 'solid-js'
|
|
3
|
-
import type { WorkflowRun } from '@geenius-ai-workflow/shared'
|
|
4
|
-
const SI: Record<string, string> = { pending: '⏳', running: '🔄', completed: '✅', failed: '❌', cancelled: '⛔', paused: '⏸️' }
|
|
5
|
-
|
|
6
|
-
export function WorkflowRunsPage(props: { runs: WorkflowRun[]; onSelectRun?: (id: string) => void }) {
|
|
7
|
-
return (
|
|
8
|
-
<div data-workflow="runs-page"><div data-workflow="runs-header"><h1 data-workflow="runs-title">Workflow Runs</h1><span data-workflow="runs-count">{props.runs.length} runs</span></div>
|
|
9
|
-
<Show when={props.runs.length > 0} fallback={<div data-workflow="runs-empty"><p>No runs yet.</p></div>}>
|
|
10
|
-
<div data-workflow="runs-list" role="list"><For each={props.runs}>{(run) => {
|
|
11
|
-
const done = () => run.stepResults.filter(s => s.status === 'completed').length
|
|
12
|
-
return (<div data-workflow="run-card" data-status={run.status} role="listitem" onClick={() => props.onSelectRun?.(run.id)}>
|
|
13
|
-
<div data-workflow="run-card-header"><span data-workflow="run-card-status">{SI[run.status]} {run.status}</span><span data-workflow="run-card-id">{run.id.slice(0, 8)}…</span></div>
|
|
14
|
-
<div data-workflow="run-card-meta"><span>{done()}/{run.stepResults.length} steps</span><span>{new Date(run.startedAt).toLocaleString()}</span></div>
|
|
15
|
-
<Show when={run.error}><p data-workflow="run-card-error">{run.error}</p></Show>
|
|
16
|
-
</div>)
|
|
17
|
-
}}</For></div>
|
|
18
|
-
</Show></div>
|
|
19
|
-
)
|
|
20
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
// @geenius-ai-workflow/solidjs — src/primitives/createApprovalGate.ts
|
|
2
|
-
import { createSignal } from 'solid-js'
|
|
3
|
-
|
|
4
|
-
export interface ApprovalRequest { id: string; stepId: string; message: string; requestedAt: number; approvers?: string[] }
|
|
5
|
-
|
|
6
|
-
export function createApprovalGate() {
|
|
7
|
-
const [pendingApprovals, setPendingApprovals] = createSignal<ApprovalRequest[]>([])
|
|
8
|
-
const [history, setHistory] = createSignal<Array<ApprovalRequest & { decision: 'approved' | 'rejected'; decidedAt: number }>>([])
|
|
9
|
-
|
|
10
|
-
const requestApproval = (stepId: string, message: string, approvers?: string[]) => {
|
|
11
|
-
const request: ApprovalRequest = { id: `approval_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`, stepId, message, requestedAt: Date.now(), approvers }
|
|
12
|
-
setPendingApprovals(prev => [...prev, request])
|
|
13
|
-
return request.id
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const approve = (id: string) => {
|
|
17
|
-
const req = pendingApprovals().find(a => a.id === id)
|
|
18
|
-
if (req) setHistory(h => [...h, { ...req, decision: 'approved', decidedAt: Date.now() }])
|
|
19
|
-
setPendingApprovals(prev => prev.filter(a => a.id !== id))
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const reject = (id: string) => {
|
|
23
|
-
const req = pendingApprovals().find(a => a.id === id)
|
|
24
|
-
if (req) setHistory(h => [...h, { ...req, decision: 'rejected', decidedAt: Date.now() }])
|
|
25
|
-
setPendingApprovals(prev => prev.filter(a => a.id !== id))
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return { pendingApprovals, history, hasPending: () => pendingApprovals().length > 0, requestApproval, approve, reject, clearHistory: () => setHistory([]) }
|
|
29
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
// @geenius-ai-workflow/solidjs — src/primitives/createWorkflow.ts
|
|
2
|
-
import { createSignal } from 'solid-js'
|
|
3
|
-
import type { WorkflowDefinition, WorkflowRun, StepResult } from '@geenius-ai-workflow/shared'
|
|
4
|
-
import { WorkflowEngine } from '@geenius-ai-workflow/shared'
|
|
5
|
-
import type { WorkflowEngineOptions } from '@geenius-ai-workflow/shared'
|
|
6
|
-
|
|
7
|
-
export interface CreateWorkflowOptions extends WorkflowEngineOptions { }
|
|
8
|
-
|
|
9
|
-
export function createWorkflow(options: CreateWorkflowOptions) {
|
|
10
|
-
const [run, setRun] = createSignal<WorkflowRun | null>(null)
|
|
11
|
-
const [isRunning, setIsRunning] = createSignal(false)
|
|
12
|
-
const [error, setError] = createSignal<Error | null>(null)
|
|
13
|
-
const [stepResults, setStepResults] = createSignal<StepResult[]>([])
|
|
14
|
-
|
|
15
|
-
const engine = new WorkflowEngine({
|
|
16
|
-
...options,
|
|
17
|
-
onStepComplete: (result) => { setStepResults(prev => [...prev, result]); options.onStepComplete?.(result) },
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
const execute = async (definition: WorkflowDefinition, input?: Record<string, unknown>) => {
|
|
21
|
-
setIsRunning(true); setError(null); setStepResults([])
|
|
22
|
-
try { const res = await engine.execute(definition, input); setRun(res); return res }
|
|
23
|
-
catch (err) { const e = err instanceof Error ? err : new Error(String(err)); setError(e); throw e }
|
|
24
|
-
finally { setIsRunning(false) }
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
return { execute, cancel: () => engine.cancel(), run, isRunning, error, stepResults, reset: () => { setRun(null); setError(null); setStepResults([]) } }
|
|
28
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
// @geenius-ai-workflow/solidjs — src/primitives/createWorkflowBuilder.ts
|
|
2
|
-
import { createSignal } from 'solid-js'
|
|
3
|
-
import type { WorkflowDefinition, WorkflowStepDef, StepConnection, WorkflowBuilderState } from '@geenius-ai-workflow/shared'
|
|
4
|
-
|
|
5
|
-
const emptyDef = (): WorkflowDefinition => ({
|
|
6
|
-
id: crypto.randomUUID?.() ?? String(Date.now()), name: 'New Workflow', version: 1, status: 'draft',
|
|
7
|
-
steps: [], connections: [], createdBy: '', createdAt: Date.now(), updatedAt: Date.now(),
|
|
8
|
-
})
|
|
9
|
-
|
|
10
|
-
export function createWorkflowBuilder(initial?: Partial<WorkflowDefinition>) {
|
|
11
|
-
const [state, setState] = createSignal<WorkflowBuilderState>({
|
|
12
|
-
definition: { ...emptyDef(), ...initial }, selectedStepId: null, isDirty: false, undoStack: [], redoStack: [],
|
|
13
|
-
})
|
|
14
|
-
|
|
15
|
-
const pushUndo = () => setState(prev => ({ ...prev, undoStack: [...prev.undoStack.slice(-20), prev.definition], redoStack: [] }))
|
|
16
|
-
|
|
17
|
-
const addStep = (step: WorkflowStepDef) => {
|
|
18
|
-
pushUndo(); setState(prev => ({ ...prev, isDirty: true, definition: { ...prev.definition, steps: [...prev.definition.steps, step], updatedAt: Date.now() } }))
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const removeStep = (stepId: string) => {
|
|
22
|
-
pushUndo(); setState(prev => ({
|
|
23
|
-
...prev, isDirty: true,
|
|
24
|
-
definition: { ...prev.definition, steps: prev.definition.steps.filter(s => s.id !== stepId), connections: prev.definition.connections.filter(c => c.fromStepId !== stepId && c.toStepId !== stepId), updatedAt: Date.now() },
|
|
25
|
-
selectedStepId: prev.selectedStepId === stepId ? null : prev.selectedStepId,
|
|
26
|
-
}))
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const updateStep = (stepId: string, updates: Partial<WorkflowStepDef>) => {
|
|
30
|
-
pushUndo(); setState(prev => ({ ...prev, isDirty: true, definition: { ...prev.definition, steps: prev.definition.steps.map(s => s.id === stepId ? { ...s, ...updates } : s), updatedAt: Date.now() } }))
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const addConnection = (conn: StepConnection) => {
|
|
34
|
-
pushUndo(); setState(prev => ({ ...prev, isDirty: true, definition: { ...prev.definition, connections: [...prev.definition.connections, conn], updatedAt: Date.now() } }))
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const removeConnection = (fromStepId: string, toStepId: string) => {
|
|
38
|
-
pushUndo(); setState(prev => ({ ...prev, isDirty: true, definition: { ...prev.definition, connections: prev.definition.connections.filter(c => !(c.fromStepId === fromStepId && c.toStepId === toStepId)), updatedAt: Date.now() } }))
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const selectStep = (stepId: string | null) => setState(prev => ({ ...prev, selectedStepId: stepId }))
|
|
42
|
-
|
|
43
|
-
const undo = () => setState(prev => {
|
|
44
|
-
if (prev.undoStack.length === 0) return prev
|
|
45
|
-
return { ...prev, definition: prev.undoStack[prev.undoStack.length - 1], undoStack: prev.undoStack.slice(0, -1), redoStack: [prev.definition, ...prev.redoStack] }
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
const redo = () => setState(prev => {
|
|
49
|
-
if (prev.redoStack.length === 0) return prev
|
|
50
|
-
return { ...prev, definition: prev.redoStack[0], undoStack: [...prev.undoStack, prev.definition], redoStack: prev.redoStack.slice(1) }
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
const setDefinition = (def: WorkflowDefinition) => setState({ definition: def, selectedStepId: null, isDirty: false, undoStack: [], redoStack: [] })
|
|
54
|
-
|
|
55
|
-
return { state, addStep, removeStep, updateStep, addConnection, removeConnection, selectStep, undo, redo, setDefinition }
|
|
56
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
// @geenius-ai-workflow/solidjs — src/primitives/createWorkflowRun.ts
|
|
2
|
-
import { createSignal } from 'solid-js'
|
|
3
|
-
import type { WorkflowRun, StepResult, RunStatus } from '@geenius-ai-workflow/shared'
|
|
4
|
-
|
|
5
|
-
export function createWorkflowRun() {
|
|
6
|
-
const [run, setRun] = createSignal<WorkflowRun | null>(null)
|
|
7
|
-
const [status, setStatus] = createSignal<RunStatus>('pending')
|
|
8
|
-
const [currentStepIndex, setCurrentStepIndex] = createSignal(0)
|
|
9
|
-
const [completedSteps, setCompletedSteps] = createSignal<StepResult[]>([])
|
|
10
|
-
const [progress, setProgress] = createSignal(0)
|
|
11
|
-
const [error, setError] = createSignal<string | null>(null)
|
|
12
|
-
|
|
13
|
-
const trackRun = (wfRun: WorkflowRun) => {
|
|
14
|
-
setRun(wfRun); setStatus(wfRun.status); setCurrentStepIndex(wfRun.currentStepIndex)
|
|
15
|
-
setCompletedSteps(wfRun.stepResults); setError(wfRun.error ?? null)
|
|
16
|
-
const done = wfRun.stepResults.filter(s => s.status === 'completed' || s.status === 'skipped').length
|
|
17
|
-
setProgress(wfRun.stepResults.length > 0 ? Math.round((done / wfRun.stepResults.length) * 100) : 0)
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const updateStep = (result: StepResult) => {
|
|
21
|
-
setCompletedSteps(prev => {
|
|
22
|
-
const idx = prev.findIndex(s => s.stepId === result.stepId)
|
|
23
|
-
if (idx >= 0) { const u = [...prev]; u[idx] = result; return u }
|
|
24
|
-
return [...prev, result]
|
|
25
|
-
})
|
|
26
|
-
setCurrentStepIndex(prev => prev + 1)
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const reset = () => { setRun(null); setStatus('pending'); setCurrentStepIndex(0); setCompletedSteps([]); setProgress(0); setError(null) }
|
|
30
|
-
|
|
31
|
-
return { run, status, currentStepIndex, completedSteps, progress, error, trackRun, updateStep, reset, isRunning: () => status() === 'running', isComplete: () => status() === 'completed', isFailed: () => status() === 'failed' }
|
|
32
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
// @geenius-ai-workflow/solidjs — src/primitives/createWorkflowStep.ts
|
|
2
|
-
import { createSignal, createMemo } from 'solid-js'
|
|
3
|
-
import type { WorkflowStepDef, StepResult, StepStatus, StepConfig } from '@geenius-ai-workflow/shared'
|
|
4
|
-
|
|
5
|
-
const STEP_ICONS: Record<string, string> = { 'llm-call': '🤖', transform: '⚙️', condition: '🔀', 'human-approval': '👤', webhook: '🌐', delay: '⏱️', parallel: '⚡', loop: '🔄', 'sub-workflow': '📋', custom: '🔧' }
|
|
6
|
-
|
|
7
|
-
export function createWorkflowStep(stepDef: WorkflowStepDef) {
|
|
8
|
-
const [status, setStatus] = createSignal<StepStatus>('pending')
|
|
9
|
-
const [output, setOutput] = createSignal<unknown>(null)
|
|
10
|
-
const [error, setError] = createSignal<string | null>(null)
|
|
11
|
-
const [durationMs, setDurationMs] = createSignal(0)
|
|
12
|
-
|
|
13
|
-
const icon = createMemo(() => STEP_ICONS[stepDef.type] ?? '📦')
|
|
14
|
-
const statusColor = createMemo(() => {
|
|
15
|
-
const m: Record<StepStatus, string> = { pending: 'gray', running: 'blue', completed: 'green', failed: 'red', skipped: 'orange', 'waiting-approval': 'purple' }
|
|
16
|
-
return m[status()]
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
const updateFromResult = (result: StepResult) => { setStatus(result.status); setOutput(result.output ?? null); setError(result.error ?? null); setDurationMs(result.durationMs) }
|
|
20
|
-
const reset = () => { setStatus('pending'); setOutput(null); setError(null); setDurationMs(0) }
|
|
21
|
-
|
|
22
|
-
return { stepDef, status, output, error, durationMs, icon, statusColor, updateFromResult, reset, isComplete: () => status() === 'completed', isRunning: () => status() === 'running', isFailed: () => status() === 'failed', isWaiting: () => status() === 'waiting-approval', config: stepDef.config as StepConfig }
|
|
23
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
// @geenius-ai-workflow/solidjs — src/primitives/createWorkflowTemplates.ts
|
|
2
|
-
import { createSignal, createMemo } from 'solid-js'
|
|
3
|
-
import type { WorkflowDefinition } from '@geenius-ai-workflow/shared'
|
|
4
|
-
import { WORKFLOW_TEMPLATES, getTemplate, getTemplatesByCategory } from '@geenius-ai-workflow/shared'
|
|
5
|
-
import type { WorkflowTemplate } from '@geenius-ai-workflow/shared'
|
|
6
|
-
|
|
7
|
-
export function createWorkflowTemplates(userId: string) {
|
|
8
|
-
const [selectedTemplateId, setSelectedTemplateId] = createSignal<string | null>(null)
|
|
9
|
-
const [filterCategory, setFilterCategory] = createSignal<WorkflowTemplate['category'] | 'all'>('all')
|
|
10
|
-
const [searchQuery, setSearchQuery] = createSignal('')
|
|
11
|
-
|
|
12
|
-
const filteredTemplates = createMemo(() => {
|
|
13
|
-
let templates = filterCategory() === 'all' ? WORKFLOW_TEMPLATES : getTemplatesByCategory(filterCategory() as WorkflowTemplate['category'])
|
|
14
|
-
const q = searchQuery().toLowerCase()
|
|
15
|
-
if (q) templates = templates.filter(t => t.name.toLowerCase().includes(q) || t.description.toLowerCase().includes(q) || t.tags.some(tag => tag.includes(q)))
|
|
16
|
-
return templates
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
const selectedTemplate = createMemo(() => { const id = selectedTemplateId(); return id ? getTemplate(id) ?? null : null })
|
|
20
|
-
|
|
21
|
-
const createFromTemplate = (templateId: string): WorkflowDefinition | null => {
|
|
22
|
-
const tpl = getTemplate(templateId); return tpl ? tpl.create(userId) : null
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const categories = createMemo(() => [...new Set(WORKFLOW_TEMPLATES.map(t => t.category))])
|
|
26
|
-
|
|
27
|
-
return { templates: filteredTemplates, allTemplates: WORKFLOW_TEMPLATES, selectedTemplate, selectedTemplateId, categories, filterCategory, searchQuery, setSelectedTemplateId, setFilterCategory, setSearchQuery, createFromTemplate }
|
|
28
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
// @geenius-ai-workflow/solidjs — src/primitives/index.ts
|
|
2
|
-
export { createWorkflow } from './createWorkflow'
|
|
3
|
-
export { createWorkflowBuilder } from './createWorkflowBuilder'
|
|
4
|
-
export { createWorkflowRun } from './createWorkflowRun'
|
|
5
|
-
export { createWorkflowStep } from './createWorkflowStep'
|
|
6
|
-
export { createApprovalGate } from './createApprovalGate'
|
|
7
|
-
export type { ApprovalRequest } from './createApprovalGate'
|
|
8
|
-
export { createWorkflowTemplates } from './createWorkflowTemplates'
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"compilerOptions":{"target":"ES2022","module":"ESNext","moduleResolution":"bundler","jsx":"preserve","jsxImportSource":"solid-js","declaration":true,"declarationMap":true,"sourceMap":true,"outDir":"./dist","rootDir":"./src","strict":true,"esModuleInterop":true,"skipLibCheck":true,"forceConsistentCasingInFileNames":true,"resolveJsonModule":true,"isolatedModules":true},"include":["src"],"exclude":["node_modules","dist"]}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { defineConfig } from 'tsup'
|
|
2
|
-
export default defineConfig({
|
|
3
|
-
entry: { index: 'src/index.ts' },
|
|
4
|
-
format: ['esm'], dts: true, clean: true, sourcemap: true,
|
|
5
|
-
external: ['solid-js', '@geenius-ai-workflow/shared'],
|
|
6
|
-
esbuildOptions(options) { options.jsx = 'preserve' },
|
|
7
|
-
})
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
# ✦ @geenius-ai-workflow/solidjs-css\n\n> Geenius AI Workflow — SolidJS primitives (vanilla CSS variant)\n\n---\n\n## Overview\nBuilt with Steve Jobs-level minimalism and Jony Ive-level craftsmanship, this package is designed to deliver unparalleled developer experience (DX) and rock-solid performance.\n\n## Installation\n\n```bash\npnpm add @geenius-ai-workflow/solidjs-css\n```\n\n## Usage\n\n```typescript\nimport { init } from '@geenius-ai-workflow/solidjs-css';\n\n// Initialize the module with absolute precision\ninit({\n mode: 'premium',\n});\n```\n\n## Architecture\n- **Zero-config**: It just works.\n- **Strictly Typed**: Fully written in TypeScript for flawless IntelliSense.\n- **Framework Agnostic**: seamlessly integrates into the Geenius ecosystem.\n\n---\n\n*Designed by Antigravity HQ*\n
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@geenius-ai-workflow/solidjs-css",
|
|
3
|
-
"version": "0.1.0",
|
|
4
|
-
"description": "Geenius AI Workflow — SolidJS primitives (vanilla CSS variant)",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "./dist/index.js",
|
|
7
|
-
"module": "./dist/index.mjs",
|
|
8
|
-
"types": "./dist/index.d.ts",
|
|
9
|
-
"exports": {
|
|
10
|
-
".": {
|
|
11
|
-
"import": "./dist/index.mjs",
|
|
12
|
-
"require": "./dist/index.js",
|
|
13
|
-
"types": "./dist/index.d.ts"
|
|
14
|
-
}
|
|
15
|
-
},
|
|
16
|
-
"scripts": {
|
|
17
|
-
"build": "tsup",
|
|
18
|
-
"lint": "tsc --noEmit",
|
|
19
|
-
"clean": "rm -rf dist"
|
|
20
|
-
},
|
|
21
|
-
"files": [
|
|
22
|
-
"dist"
|
|
23
|
-
],
|
|
24
|
-
"publishConfig": {
|
|
25
|
-
"access": "public"
|
|
26
|
-
},
|
|
27
|
-
"peerDependencies": {
|
|
28
|
-
"solid-js": ">=1.6.0"
|
|
29
|
-
},
|
|
30
|
-
"dependencies": {
|
|
31
|
-
"@geenius-ai-workflow/shared": "workspace:*"
|
|
32
|
-
},
|
|
33
|
-
"devDependencies": {
|
|
34
|
-
"solid-js": "^1.9.5",
|
|
35
|
-
"tsup": "^8.5.1",
|
|
36
|
-
"typescript": "~5.9.3"
|
|
37
|
-
},
|
|
38
|
-
"author": "Antigravity HQ",
|
|
39
|
-
"license": "MIT",
|
|
40
|
-
"engines": {
|
|
41
|
-
"node": ">=20.0.0"
|
|
42
|
-
}
|
|
43
|
-
}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
// @geenius-ai-workflow/solidjs-css — components/ApprovalModal.tsx
|
|
2
|
-
import { Show, For } from 'solid-js'
|
|
3
|
-
import type { ApprovalRequest } from '../primitives'
|
|
4
|
-
export function ApprovalModal(props: { request: ApprovalRequest | null; onApprove: (id: string) => void; onReject: (id: string) => void }) {
|
|
5
|
-
return (<Show when={props.request}>{(req) => (<div role="dialog" aria-modal="true"><div class="ai-workflow__approval-overlay" /><div class="ai-workflow__approval-dialog"><div class="ai-workflow__approval-header"><span class="ai-workflow__approval-icon">👤</span><h3 class="ai-workflow__approval-title">Approval Required</h3></div><div><p class="ai-workflow__approval-message">{req().message}</p><Show when={req().approvers && req().approvers!.length > 0}><div><For each={req().approvers!}>{(a) => <span class="ai-workflow__approval-approver-badge">{a}</span>}</For></div></Show></div><div class="ai-workflow__approval-actions"><button class="ai-workflow__approval-reject" onClick={() => props.onReject(req().id)}>✕ Reject</button><button class="ai-workflow__approval-approve" onClick={() => props.onApprove(req().id)}>✓ Approve</button></div></div></div>)}</Show>)
|
|
6
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
// @geenius-ai-workflow/solidjs-css — components/StepConfigPanel.tsx
|
|
2
|
-
import { createSignal } from 'solid-js'
|
|
3
|
-
import type { WorkflowStepDef } from '@geenius-ai-workflow/shared'
|
|
4
|
-
export function StepConfigPanel(props: { step: WorkflowStepDef; onUpdate: (id: string, u: Partial<WorkflowStepDef>) => void; onDelete: (id: string) => void; onClose: () => void }) {
|
|
5
|
-
const [name, setName] = createSignal(props.step.name)
|
|
6
|
-
return (<div class="ai-workflow__config-panel" role="complementary"><div class="ai-workflow__config-header"><h3 class="ai-workflow__config-title">Configure Step</h3><button class="ai-workflow__config-close" onClick={props.onClose}>✕</button></div><div class="ai-workflow__config-body"><label class="ai-workflow__config-label">Step Name<input class="ai-workflow__config-input" value={name()} onInput={(e) => setName(e.currentTarget.value)} onBlur={() => { if (name().trim() && name() !== props.step.name) props.onUpdate(props.step.id, { name: name().trim() }) }} /></label><div class="ai-workflow__config-field"><span class="ai-workflow__config-field-label">Type</span><span class="ai-workflow__config-field-value">{props.step.type}</span></div><pre class="ai-workflow__config-json-view">{JSON.stringify(props.step.config, null, 2)}</pre></div><div><button class="ai-workflow__config-delete" onClick={() => { props.onDelete(props.step.id); props.onClose() }}>🗑 Delete</button></div></div>)
|
|
7
|
-
}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
// @geenius-ai-workflow/solidjs-css — components/StepConnector.tsx
|
|
2
|
-
const W = 200, H = 80
|
|
3
|
-
export function StepConnector(props: { from: { x: number; y: number }; to: { x: number; y: number }; label?: string; isActive?: boolean }) {
|
|
4
|
-
const x1 = () => props.from.x + W, y1 = () => props.from.y + H / 2, x2 = () => props.to.x, y2 = () => props.to.y + H / 2, mx = () => (x1() + x2()) / 2
|
|
5
|
-
return (<g class="ai-workflow__connector"><path d={`M ${x1()} ${y1()} C ${mx()} ${y1()}, ${mx()} ${y2()}, ${x2()} ${y2()}`} fill="none" stroke={props.isActive ? 'oklch(0.7 0.2 145)' : 'oklch(0.5 0.02 260)'} stroke-width={props.isActive ? 3 : 2} />{props.label && <text x={mx()} y={(y1() + y2()) / 2 - 8} text-anchor="middle" fill="oklch(0.7 0.02 260)" font-size="12">{props.label}</text>}</g>)
|
|
6
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
// @geenius-ai-workflow/solidjs-css — components/StepNode.tsx
|
|
2
|
-
import type { WorkflowStepDef, StepType } from '@geenius-ai-workflow/shared'
|
|
3
|
-
const ICONS: Record<StepType, string> = { 'llm-call': '🤖', transform: '⚙️', condition: '🔀', 'human-approval': '👤', webhook: '🌐', delay: '⏱️', parallel: '⚡', loop: '🔄', 'sub-workflow': '📋', custom: '🔧' }
|
|
4
|
-
export function StepNode(props: { step: WorkflowStepDef; isSelected?: boolean; status?: string; onClick?: () => void }) {
|
|
5
|
-
const cls = () => ['ai-workflow__step-node', props.isSelected && 'ai-workflow__step-node--selected', props.status && `ai-workflow__step-node--${props.status}`].filter(Boolean).join(' ')
|
|
6
|
-
return (<div class={cls()} role="button" tabIndex={0} onClick={props.onClick} style={props.step.position ? { position: 'absolute', left: `${props.step.position.x}px`, top: `${props.step.position.y}px` } : undefined}><div class="ai-workflow__step-header"><span class="ai-workflow__step-icon">{ICONS[props.step.type]}</span><span class="ai-workflow__step-name">{props.step.name}</span></div><div class="ai-workflow__step-type-badge">{props.step.type}</div></div>)
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
// @geenius-ai-workflow/solidjs-css — components/StepPalette.tsx
|
|
2
|
-
import { For } from 'solid-js'
|
|
3
|
-
import type { StepType } from '@geenius-ai-workflow/shared'
|
|
4
|
-
const ITEMS: Array<{ type: StepType; label: string; icon: string; desc: string }> = [{ type: 'llm-call', label: 'LLM Call', icon: '🤖', desc: 'Call an AI model' },{ type: 'transform', label: 'Transform', icon: '⚙️', desc: 'Transform data' },{ type: 'condition', label: 'Condition', icon: '🔀', desc: 'If/else branching' },{ type: 'human-approval', label: 'Approval', icon: '👤', desc: 'Human approval gate' },{ type: 'webhook', label: 'Webhook', icon: '🌐', desc: 'HTTP request' },{ type: 'delay', label: 'Delay', icon: '⏱️', desc: 'Wait' },{ type: 'parallel', label: 'Parallel', icon: '⚡', desc: 'Run in parallel' },{ type: 'loop', label: 'Loop', icon: '🔄', desc: 'Iterate' },{ type: 'sub-workflow', label: 'Sub-workflow', icon: '📋', desc: 'Run another workflow' },{ type: 'custom', label: 'Custom', icon: '🔧', desc: 'Custom handler' }]
|
|
5
|
-
export function StepPalette(props: { onAddStep: (t: StepType) => void }) {
|
|
6
|
-
return (<div class="ai-workflow__step-palette" role="list"><h3 class="ai-workflow__palette-title">Steps</h3><For each={ITEMS}>{(item) => <button class="ai-workflow__palette-item" onClick={() => props.onAddStep(item.type)}><span class="ai-workflow__palette-icon">{item.icon}</span><div class="ai-workflow__palette-info"><span class="ai-workflow__palette-label">{item.label}</span><span class="ai-workflow__palette-desc">{item.desc}</span></div></button>}</For></div>)
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
// @geenius-ai-workflow/solidjs-css — components/WorkflowCanvas.tsx
|
|
2
|
-
import { For, Show } from 'solid-js'
|
|
3
|
-
import type { WorkflowDefinition } from '@geenius-ai-workflow/shared'
|
|
4
|
-
import { StepNode } from './StepNode'; import { StepConnector } from './StepConnector'
|
|
5
|
-
export function WorkflowCanvas(props: { definition: WorkflowDefinition; selectedStepId: string | null; onSelectStep: (id: string | null) => void }) {
|
|
6
|
-
return (<div class="ai-workflow__canvas" role="application"><svg style={{ position: 'absolute', inset: '0', 'pointer-events': 'none' }}><For each={props.definition.connections}>{(conn) => { const f = () => props.definition.steps.find(s => s.id === conn.fromStepId); const t = () => props.definition.steps.find(s => s.id === conn.toStepId); return <Show when={f()?.position && t()?.position}><StepConnector from={f()!.position!} to={t()!.position!} label={conn.label} /></Show> }}</For></svg><div><For each={props.definition.steps}>{(step) => <StepNode step={step} isSelected={props.selectedStepId === step.id} onClick={() => props.onSelectStep(step.id === props.selectedStepId ? null : step.id)} />}</For></div><Show when={props.definition.steps.length === 0}><div class="ai-workflow__canvas-empty"><p>No steps yet</p></div></Show></div>)
|
|
7
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
// @geenius-ai-workflow/solidjs-css — components/WorkflowRunPanel.tsx
|
|
2
|
-
import { Show, For } from 'solid-js'
|
|
3
|
-
import type { WorkflowRun } from '@geenius-ai-workflow/shared'
|
|
4
|
-
import { formatCost } from '@geenius-ai-workflow/shared'
|
|
5
|
-
const SI: Record<string, string> = { pending: '⏳', running: '🔄', completed: '✅', failed: '❌', skipped: '⏭️', 'waiting-approval': '👤' }
|
|
6
|
-
export function WorkflowRunPanel(props: { run: WorkflowRun | null; isRunning: boolean; onCancel?: () => void }) {
|
|
7
|
-
return (<div class="ai-workflow__run-panel"><Show when={!props.run}><div class="ai-workflow__run-empty"><p>No active run.</p></div></Show><Show when={props.run}>{(r) => { const done = () => r().stepResults.filter(s => s.status === 'completed').length; const total = () => r().stepResults.length; const pct = () => total() > 0 ? Math.round((done() / total()) * 100) : 0; const cost = () => r().stepResults.reduce((s, x) => s + (x.costUsd ?? 0), 0); return (<><div class="ai-workflow__run-header"><h3 class="ai-workflow__run-title">{SI[r().status]} Run {r().status}</h3><Show when={props.isRunning && props.onCancel}><button class="ai-workflow__run-cancel" onClick={props.onCancel}>⏹ Cancel</button></Show></div><div class="ai-workflow__run-progress"><div class="ai-workflow__run-progress-bar"><div class="ai-workflow__run-progress-fill" style={{ width: `${pct()}%` }} /></div><span class="ai-workflow__run-progress-text">{done()}/{total()} ({pct()}%)</span></div><Show when={cost() > 0}><span class="ai-workflow__run-stat">💰 {formatCost(cost())}</span></Show><Show when={r().error}><div class="ai-workflow__run-error">{r().error}</div></Show><ul class="ai-workflow__run-steps"><For each={r().stepResults}>{(sr) => <li class="ai-workflow__run-step-item" data-status={sr.status}><span>{SI[sr.status]}</span><span>{sr.stepName}</span><span>{sr.durationMs}ms</span></li>}</For></ul></>)}}</Show></div>)
|
|
8
|
-
}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
// @geenius-ai-workflow/solidjs-css — components/WorkflowToolbar.tsx
|
|
2
|
-
import { Show } from 'solid-js'
|
|
3
|
-
export function WorkflowToolbar(props: { workflowName: string; isDirty: boolean; isRunning: boolean; canUndo: boolean; canRedo: boolean; onSave: () => void; onRun: () => void; onCancel?: () => void; onUndo: () => void; onRedo: () => void }) {
|
|
4
|
-
return (<div class="ai-workflow__toolbar" role="toolbar"><div class="ai-workflow__toolbar-left"><h2 class="ai-workflow__toolbar-title">{props.workflowName}</h2><Show when={props.isDirty}><span class="ai-workflow__toolbar-dirty">●</span></Show></div><div class="ai-workflow__toolbar-center"><button class="ai-workflow__toolbar-btn" onClick={props.onUndo} disabled={!props.canUndo}>↶</button><button class="ai-workflow__toolbar-btn" onClick={props.onRedo} disabled={!props.canRedo}>↷</button></div><div class="ai-workflow__toolbar-right"><button class="ai-workflow__toolbar-btn-secondary" onClick={props.onSave} disabled={!props.isDirty}>💾 Save</button><Show when={props.isRunning} fallback={<button class="ai-workflow__toolbar-btn-primary" onClick={props.onRun}>▶ Run</button>}><button class="ai-workflow__toolbar-btn-danger" onClick={props.onCancel}>⏹ Stop</button></Show></div></div>)
|
|
5
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
// @geenius-ai-workflow/solidjs-css — components/index.ts
|
|
2
|
-
export { WorkflowCanvas } from './WorkflowCanvas'
|
|
3
|
-
export { StepNode } from './StepNode'
|
|
4
|
-
export { StepConnector } from './StepConnector'
|
|
5
|
-
export { StepConfigPanel } from './StepConfigPanel'
|
|
6
|
-
export { WorkflowRunPanel } from './WorkflowRunPanel'
|
|
7
|
-
export { ApprovalModal } from './ApprovalModal'
|
|
8
|
-
export { WorkflowToolbar } from './WorkflowToolbar'
|
|
9
|
-
export { StepPalette } from './StepPalette'
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
// @geenius-ai-workflow/solidjs-css — src/index.ts
|
|
2
|
-
import './styles.css'
|
|
3
|
-
export type { WorkflowDefinition, WorkflowStepDef, WorkflowRun, StepResult } from '@geenius-ai-workflow/shared'
|
|
4
|
-
export { WorkflowEngine, WORKFLOW_TEMPLATES } from '@geenius-ai-workflow/shared'
|
|
5
|
-
export * from './primitives'
|
|
6
|
-
export * from './components'
|
|
7
|
-
export * from './pages'
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
// @geenius-ai-workflow/solidjs-css — pages/WorkflowRunsPage.tsx
|
|
2
|
-
import { For, Show } from 'solid-js'
|
|
3
|
-
import type { WorkflowRun } from '@geenius-ai-workflow/shared'
|
|
4
|
-
const SI: Record<string, string> = { pending: '⏳', running: '🔄', completed: '✅', failed: '❌', cancelled: '⛔', paused: '⏸️' }
|
|
5
|
-
export function WorkflowRunsPage(props: { runs: WorkflowRun[]; onSelectRun?: (id: string) => void }) {
|
|
6
|
-
return (<div><div class="ai-workflow__runs-header"><h1 class="ai-workflow__runs-title">Workflow Runs</h1><span class="ai-workflow__runs-count">{props.runs.length} runs</span></div><Show when={props.runs.length > 0} fallback={<div class="ai-workflow__runs-empty"><p>No runs yet.</p></div>}><div role="list"><For each={props.runs}>{(run) => <div class="ai-workflow__run-card" role="listitem" onClick={() => props.onSelectRun?.(run.id)}><div class="ai-workflow__run-card-header"><span class="ai-workflow__run-card-status">{SI[run.status]} {run.status}</span><span class="ai-workflow__run-card-id">{run.id.slice(0, 8)}…</span></div><div class="ai-workflow__run-card-meta"><span>{run.stepResults.filter(s => s.status === 'completed').length}/{run.stepResults.length} steps</span></div><Show when={run.error}><p class="ai-workflow__run-card-error">{run.error}</p></Show></div>}</For></div></Show></div>)
|
|
7
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
// @geenius-ai-workflow/solidjs — src/primitives/createWorkflow.ts
|
|
2
|
-
import { createSignal } from 'solid-js'
|
|
3
|
-
import type { WorkflowDefinition, WorkflowRun, StepResult } from '@geenius-ai-workflow/shared'
|
|
4
|
-
import { WorkflowEngine } from '@geenius-ai-workflow/shared'
|
|
5
|
-
import type { WorkflowEngineOptions } from '@geenius-ai-workflow/shared'
|
|
6
|
-
|
|
7
|
-
export interface CreateWorkflowOptions extends WorkflowEngineOptions { }
|
|
8
|
-
|
|
9
|
-
export function createWorkflow(options: CreateWorkflowOptions) {
|
|
10
|
-
const [run, setRun] = createSignal<WorkflowRun | null>(null)
|
|
11
|
-
const [isRunning, setIsRunning] = createSignal(false)
|
|
12
|
-
const [error, setError] = createSignal<Error | null>(null)
|
|
13
|
-
const [stepResults, setStepResults] = createSignal<StepResult[]>([])
|
|
14
|
-
|
|
15
|
-
const engine = new WorkflowEngine({
|
|
16
|
-
...options,
|
|
17
|
-
onStepComplete: (result) => { setStepResults(prev => [...prev, result]); options.onStepComplete?.(result) },
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
const execute = async (definition: WorkflowDefinition, input?: Record<string, unknown>) => {
|
|
21
|
-
setIsRunning(true); setError(null); setStepResults([])
|
|
22
|
-
try { const res = await engine.execute(definition, input); setRun(res); return res }
|
|
23
|
-
catch (err) { const e = err instanceof Error ? err : new Error(String(err)); setError(e); throw e }
|
|
24
|
-
finally { setIsRunning(false) }
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
return { execute, cancel: () => engine.cancel(), run, isRunning, error, stepResults, reset: () => { setRun(null); setError(null); setStepResults([]) } }
|
|
28
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
// @geenius-ai-workflow/solidjs — src/primitives/createWorkflowBuilder.ts
|
|
2
|
-
import { createSignal } from 'solid-js'
|
|
3
|
-
import type { WorkflowDefinition, WorkflowStepDef, StepConnection, WorkflowBuilderState } from '@geenius-ai-workflow/shared'
|
|
4
|
-
|
|
5
|
-
const emptyDef = (): WorkflowDefinition => ({
|
|
6
|
-
id: crypto.randomUUID?.() ?? String(Date.now()), name: 'New Workflow', version: 1, status: 'draft',
|
|
7
|
-
steps: [], connections: [], createdBy: '', createdAt: Date.now(), updatedAt: Date.now(),
|
|
8
|
-
})
|
|
9
|
-
|
|
10
|
-
export function createWorkflowBuilder(initial?: Partial<WorkflowDefinition>) {
|
|
11
|
-
const [state, setState] = createSignal<WorkflowBuilderState>({
|
|
12
|
-
definition: { ...emptyDef(), ...initial }, selectedStepId: null, isDirty: false, undoStack: [], redoStack: [],
|
|
13
|
-
})
|
|
14
|
-
|
|
15
|
-
const pushUndo = () => setState(prev => ({ ...prev, undoStack: [...prev.undoStack.slice(-20), prev.definition], redoStack: [] }))
|
|
16
|
-
|
|
17
|
-
const addStep = (step: WorkflowStepDef) => {
|
|
18
|
-
pushUndo(); setState(prev => ({ ...prev, isDirty: true, definition: { ...prev.definition, steps: [...prev.definition.steps, step], updatedAt: Date.now() } }))
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const removeStep = (stepId: string) => {
|
|
22
|
-
pushUndo(); setState(prev => ({
|
|
23
|
-
...prev, isDirty: true,
|
|
24
|
-
definition: { ...prev.definition, steps: prev.definition.steps.filter(s => s.id !== stepId), connections: prev.definition.connections.filter(c => c.fromStepId !== stepId && c.toStepId !== stepId), updatedAt: Date.now() },
|
|
25
|
-
selectedStepId: prev.selectedStepId === stepId ? null : prev.selectedStepId,
|
|
26
|
-
}))
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const updateStep = (stepId: string, updates: Partial<WorkflowStepDef>) => {
|
|
30
|
-
pushUndo(); setState(prev => ({ ...prev, isDirty: true, definition: { ...prev.definition, steps: prev.definition.steps.map(s => s.id === stepId ? { ...s, ...updates } : s), updatedAt: Date.now() } }))
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const addConnection = (conn: StepConnection) => {
|
|
34
|
-
pushUndo(); setState(prev => ({ ...prev, isDirty: true, definition: { ...prev.definition, connections: [...prev.definition.connections, conn], updatedAt: Date.now() } }))
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const removeConnection = (fromStepId: string, toStepId: string) => {
|
|
38
|
-
pushUndo(); setState(prev => ({ ...prev, isDirty: true, definition: { ...prev.definition, connections: prev.definition.connections.filter(c => !(c.fromStepId === fromStepId && c.toStepId === toStepId)), updatedAt: Date.now() } }))
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const selectStep = (stepId: string | null) => setState(prev => ({ ...prev, selectedStepId: stepId }))
|
|
42
|
-
|
|
43
|
-
const undo = () => setState(prev => {
|
|
44
|
-
if (prev.undoStack.length === 0) return prev
|
|
45
|
-
return { ...prev, definition: prev.undoStack[prev.undoStack.length - 1], undoStack: prev.undoStack.slice(0, -1), redoStack: [prev.definition, ...prev.redoStack] }
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
const redo = () => setState(prev => {
|
|
49
|
-
if (prev.redoStack.length === 0) return prev
|
|
50
|
-
return { ...prev, definition: prev.redoStack[0], undoStack: [...prev.undoStack, prev.definition], redoStack: prev.redoStack.slice(1) }
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
const setDefinition = (def: WorkflowDefinition) => setState({ definition: def, selectedStepId: null, isDirty: false, undoStack: [], redoStack: [] })
|
|
54
|
-
|
|
55
|
-
return { state, addStep, removeStep, updateStep, addConnection, removeConnection, selectStep, undo, redo, setDefinition }
|
|
56
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from '@geenius-ai-workflow/solidjs';
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2022",
|
|
4
|
-
"module": "ESNext",
|
|
5
|
-
"moduleResolution": "bundler",
|
|
6
|
-
"declaration": true,
|
|
7
|
-
"declarationMap": true,
|
|
8
|
-
"sourceMap": true,
|
|
9
|
-
"outDir": "./dist",
|
|
10
|
-
"rootDir": "./src",
|
|
11
|
-
"strict": true,
|
|
12
|
-
"esModuleInterop": true,
|
|
13
|
-
"skipLibCheck": true,
|
|
14
|
-
"forceConsistentCasingInFileNames": true,
|
|
15
|
-
"resolveJsonModule": true,
|
|
16
|
-
"isolatedModules": true,
|
|
17
|
-
"jsx": "preserve",
|
|
18
|
-
"jsxImportSource": "solid-js"
|
|
19
|
-
},
|
|
20
|
-
"include": [
|
|
21
|
-
"src"
|
|
22
|
-
],
|
|
23
|
-
"exclude": [
|
|
24
|
-
"node_modules",
|
|
25
|
-
"dist"
|
|
26
|
-
]
|
|
27
|
-
}
|
package/pnpm-workspace.yaml
DELETED