@geenius/ai-workflow 0.1.0 → 0.4.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.
Files changed (159) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +69 -1
  3. package/package.json +60 -27
  4. package/packages/convex/dist/index.d.ts +363 -0
  5. package/packages/convex/dist/index.js +200 -0
  6. package/packages/convex/dist/index.js.map +1 -0
  7. package/packages/react/dist/index.d.ts +466 -0
  8. package/packages/react/dist/index.js +13914 -0
  9. package/packages/react/dist/index.js.map +1 -0
  10. package/packages/react-css/{src/styles.css → dist/index.css} +107 -253
  11. package/packages/react-css/dist/index.css.map +1 -0
  12. package/packages/react-css/dist/index.d.ts +495 -0
  13. package/packages/react-css/dist/index.js +13901 -0
  14. package/packages/react-css/dist/index.js.map +1 -0
  15. package/packages/shared/dist/index.d.ts +1368 -0
  16. package/packages/shared/dist/index.js +1681 -0
  17. package/packages/shared/dist/index.js.map +1 -0
  18. package/packages/solidjs/dist/index.d.ts +452 -0
  19. package/packages/solidjs/dist/index.js +13830 -0
  20. package/packages/solidjs/dist/index.js.map +1 -0
  21. package/packages/solidjs-css/{src/styles.css → dist/index.css} +107 -253
  22. package/packages/solidjs-css/dist/index.css.map +1 -0
  23. package/packages/solidjs-css/dist/index.d.ts +471 -0
  24. package/packages/solidjs-css/dist/index.js +13774 -0
  25. package/packages/solidjs-css/dist/index.js.map +1 -0
  26. package/.changeset/config.json +0 -11
  27. package/.github/CODEOWNERS +0 -1
  28. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -16
  29. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -11
  30. package/.github/PULL_REQUEST_TEMPLATE.md +0 -10
  31. package/.github/dependabot.yml +0 -11
  32. package/.github/workflows/ci.yml +0 -23
  33. package/.github/workflows/release.yml +0 -29
  34. package/.nvmrc +0 -1
  35. package/.project/ACCOUNT.yaml +0 -4
  36. package/.project/IDEAS.yaml +0 -7
  37. package/.project/PROJECT.yaml +0 -11
  38. package/.project/ROADMAP.yaml +0 -15
  39. package/CODE_OF_CONDUCT.md +0 -16
  40. package/CONTRIBUTING.md +0 -26
  41. package/SECURITY.md +0 -15
  42. package/SUPPORT.md +0 -8
  43. package/packages/convex/README.md +0 -1
  44. package/packages/convex/package.json +0 -12
  45. package/packages/convex/src/convex.config.ts +0 -3
  46. package/packages/convex/src/index.ts +0 -3
  47. package/packages/convex/src/mutations.ts +0 -36
  48. package/packages/convex/src/queries.ts +0 -19
  49. package/packages/convex/src/schema.ts +0 -24
  50. package/packages/convex/tsconfig.json +0 -25
  51. package/packages/react/README.md +0 -1
  52. package/packages/react/package.json +0 -46
  53. package/packages/react/src/components/ApprovalModal.tsx +0 -47
  54. package/packages/react/src/components/StepConfigPanel.tsx +0 -67
  55. package/packages/react/src/components/StepConnector.tsx +0 -47
  56. package/packages/react/src/components/StepNode.tsx +0 -38
  57. package/packages/react/src/components/StepPalette.tsx +0 -48
  58. package/packages/react/src/components/WorkflowCanvas.tsx +0 -42
  59. package/packages/react/src/components/WorkflowRunPanel.tsx +0 -64
  60. package/packages/react/src/components/WorkflowToolbar.tsx +0 -43
  61. package/packages/react/src/components/index.ts +0 -9
  62. package/packages/react/src/hooks/index.ts +0 -10
  63. package/packages/react/src/hooks/useApprovalGate.ts +0 -59
  64. package/packages/react/src/hooks/useWorkflow.ts +0 -39
  65. package/packages/react/src/hooks/useWorkflowBuilder.ts +0 -121
  66. package/packages/react/src/hooks/useWorkflowRun.ts +0 -75
  67. package/packages/react/src/hooks/useWorkflowStep.ts +0 -52
  68. package/packages/react/src/hooks/useWorkflowTemplates.ts +0 -54
  69. package/packages/react/src/index.ts +0 -16
  70. package/packages/react/src/pages/WorkflowBuilderPage.tsx +0 -81
  71. package/packages/react/src/pages/WorkflowRunsPage.tsx +0 -59
  72. package/packages/react/src/pages/index.ts +0 -3
  73. package/packages/react/tsconfig.json +0 -1
  74. package/packages/react/tsup.config.ts +0 -7
  75. package/packages/react-css/README.md +0 -1
  76. package/packages/react-css/package.json +0 -44
  77. package/packages/react-css/src/components/ApprovalModal.tsx +0 -6
  78. package/packages/react-css/src/components/StepConfigPanel.tsx +0 -7
  79. package/packages/react-css/src/components/StepConnector.tsx +0 -6
  80. package/packages/react-css/src/components/StepNode.tsx +0 -7
  81. package/packages/react-css/src/components/StepPalette.tsx +0 -6
  82. package/packages/react-css/src/components/WorkflowCanvas.tsx +0 -6
  83. package/packages/react-css/src/components/WorkflowRunPanel.tsx +0 -9
  84. package/packages/react-css/src/components/WorkflowToolbar.tsx +0 -4
  85. package/packages/react-css/src/components/index.ts +0 -9
  86. package/packages/react-css/src/hooks/index.ts +0 -3
  87. package/packages/react-css/src/hooks/useWorkflow.ts +0 -39
  88. package/packages/react-css/src/hooks/useWorkflowBuilder.ts +0 -121
  89. package/packages/react-css/src/index.ts +0 -7
  90. package/packages/react-css/src/pages/WorkflowBuilderPage.tsx +0 -16
  91. package/packages/react-css/src/pages/WorkflowRunsPage.tsx +0 -6
  92. package/packages/react-css/src/pages/index.ts +0 -3
  93. package/packages/react-css/tsconfig.json +0 -26
  94. package/packages/react-css/tsup.config.ts +0 -2
  95. package/packages/shared/README.md +0 -1
  96. package/packages/shared/package.json +0 -56
  97. package/packages/shared/src/__tests__/ai-workflow.test.ts +0 -217
  98. package/packages/shared/src/config.ts +0 -49
  99. package/packages/shared/src/convex/index.ts +0 -2
  100. package/packages/shared/src/convex/schemas.ts +0 -42
  101. package/packages/shared/src/engine.test.ts +0 -1
  102. package/packages/shared/src/engine.ts +0 -295
  103. package/packages/shared/src/index.ts +0 -43
  104. package/packages/shared/src/steps.ts +0 -68
  105. package/packages/shared/src/templates.ts +0 -172
  106. package/packages/shared/src/types.ts +0 -237
  107. package/packages/shared/src/utils/cost.ts +0 -79
  108. package/packages/shared/src/utils/dag.ts +0 -133
  109. package/packages/shared/src/utils/index.ts +0 -5
  110. package/packages/shared/src/utils/interpolation.ts +0 -53
  111. package/packages/shared/src/validators.ts +0 -215
  112. package/packages/shared/tsconfig.json +0 -1
  113. package/packages/shared/tsup.config.ts +0 -5
  114. package/packages/shared/vitest.config.ts +0 -4
  115. package/packages/solidjs/README.md +0 -1
  116. package/packages/solidjs/package.json +0 -45
  117. package/packages/solidjs/src/components/ApprovalModal.tsx +0 -18
  118. package/packages/solidjs/src/components/StepConfigPanel.tsx +0 -14
  119. package/packages/solidjs/src/components/StepConnector.tsx +0 -11
  120. package/packages/solidjs/src/components/StepNode.tsx +0 -12
  121. package/packages/solidjs/src/components/StepPalette.tsx +0 -22
  122. package/packages/solidjs/src/components/WorkflowCanvas.tsx +0 -23
  123. package/packages/solidjs/src/components/WorkflowRunPanel.tsx +0 -18
  124. package/packages/solidjs/src/components/WorkflowToolbar.tsx +0 -13
  125. package/packages/solidjs/src/components/index.ts +0 -9
  126. package/packages/solidjs/src/index.ts +0 -7
  127. package/packages/solidjs/src/pages/WorkflowBuilderPage.tsx +0 -37
  128. package/packages/solidjs/src/pages/WorkflowRunsPage.tsx +0 -20
  129. package/packages/solidjs/src/pages/index.ts +0 -3
  130. package/packages/solidjs/src/primitives/createApprovalGate.ts +0 -29
  131. package/packages/solidjs/src/primitives/createWorkflow.ts +0 -28
  132. package/packages/solidjs/src/primitives/createWorkflowBuilder.ts +0 -56
  133. package/packages/solidjs/src/primitives/createWorkflowRun.ts +0 -32
  134. package/packages/solidjs/src/primitives/createWorkflowStep.ts +0 -23
  135. package/packages/solidjs/src/primitives/createWorkflowTemplates.ts +0 -28
  136. package/packages/solidjs/src/primitives/index.ts +0 -8
  137. package/packages/solidjs/tsconfig.json +0 -1
  138. package/packages/solidjs/tsup.config.ts +0 -7
  139. package/packages/solidjs-css/README.md +0 -1
  140. package/packages/solidjs-css/package.json +0 -43
  141. package/packages/solidjs-css/src/components/ApprovalModal.tsx +0 -6
  142. package/packages/solidjs-css/src/components/StepConfigPanel.tsx +0 -7
  143. package/packages/solidjs-css/src/components/StepConnector.tsx +0 -6
  144. package/packages/solidjs-css/src/components/StepNode.tsx +0 -7
  145. package/packages/solidjs-css/src/components/StepPalette.tsx +0 -7
  146. package/packages/solidjs-css/src/components/WorkflowCanvas.tsx +0 -7
  147. package/packages/solidjs-css/src/components/WorkflowRunPanel.tsx +0 -8
  148. package/packages/solidjs-css/src/components/WorkflowToolbar.tsx +0 -5
  149. package/packages/solidjs-css/src/components/index.ts +0 -9
  150. package/packages/solidjs-css/src/index.ts +0 -7
  151. package/packages/solidjs-css/src/pages/WorkflowBuilderPage.tsx +0 -2
  152. package/packages/solidjs-css/src/pages/WorkflowRunsPage.tsx +0 -7
  153. package/packages/solidjs-css/src/pages/index.ts +0 -3
  154. package/packages/solidjs-css/src/primitives/createWorkflow.ts +0 -28
  155. package/packages/solidjs-css/src/primitives/createWorkflowBuilder.ts +0 -56
  156. package/packages/solidjs-css/src/primitives/index.ts +0 -1
  157. package/packages/solidjs-css/tsconfig.json +0 -27
  158. package/packages/solidjs-css/tsup.config.ts +0 -2
  159. 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,3 +0,0 @@
1
- // @geenius-ai-workflow/solidjs — pages/index.ts
2
- export { WorkflowBuilderPage } from './WorkflowBuilderPage'
3
- export { WorkflowRunsPage } from './WorkflowRunsPage'
@@ -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,2 +0,0 @@
1
- // @geenius-ai-workflow/solidjs-css — pages/WorkflowBuilderPage.tsx
2
- export { WorkflowBuilderPage } from '@geenius-ai-workflow/solidjs'
@@ -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,3 +0,0 @@
1
- // @geenius-ai-workflow/solidjs-css — pages/index.ts
2
- export { WorkflowBuilderPage } from './WorkflowBuilderPage'
3
- export { WorkflowRunsPage } from './WorkflowRunsPage'
@@ -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
- }
@@ -1,2 +0,0 @@
1
- import { defineConfig } from 'tsup'
2
- export default defineConfig({ entry: ['src/index.ts'], format: ['cjs', 'esm'], dts: true, clean: true, sourcemap: true, external: ['solid-js'] })
@@ -1,2 +0,0 @@
1
- packages:
2
- - 'packages/*'