@solidxai/core 0.1.12-beta.2 → 0.1.12-beta.4
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/.claude/settings.local.json +16 -0
- package/CLAUDE.md +26 -0
- package/dist/commands/seed.command.d.ts.map +1 -1
- package/dist/commands/seed.command.js +15 -2
- package/dist/commands/seed.command.js.map +1 -1
- package/dist/constants/media-file-types.d.ts +5 -0
- package/dist/constants/media-file-types.d.ts.map +1 -0
- package/dist/constants/media-file-types.js +27 -0
- package/dist/constants/media-file-types.js.map +1 -0
- package/dist/controllers/media.controller.d.ts +14 -11
- package/dist/controllers/media.controller.d.ts.map +1 -1
- package/dist/controllers/media.controller.js +72 -33
- package/dist/controllers/media.controller.js.map +1 -1
- package/dist/dtos/create-media.dto.d.ts +1 -0
- package/dist/dtos/create-media.dto.d.ts.map +1 -1
- package/dist/dtos/create-media.dto.js +7 -1
- package/dist/dtos/create-media.dto.js.map +1 -1
- package/dist/dtos/create-role-metadata.dto.d.ts +2 -0
- package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/create-role-metadata.dto.js +3 -1
- package/dist/dtos/create-role-metadata.dto.js.map +1 -1
- package/dist/dtos/update-media.dto.d.ts +1 -0
- package/dist/dtos/update-media.dto.d.ts.map +1 -1
- package/dist/dtos/update-media.dto.js +7 -1
- package/dist/dtos/update-media.dto.js.map +1 -1
- package/dist/entities/media.entity.d.ts +1 -0
- package/dist/entities/media.entity.d.ts.map +1 -1
- package/dist/entities/media.entity.js +9 -1
- package/dist/entities/media.entity.js.map +1 -1
- package/dist/enums/auth-type.enum.d.ts +2 -1
- package/dist/enums/auth-type.enum.d.ts.map +1 -1
- package/dist/enums/auth-type.enum.js +1 -0
- package/dist/enums/auth-type.enum.js.map +1 -1
- package/dist/guards/authentication.guard.d.ts +3 -1
- package/dist/guards/authentication.guard.d.ts.map +1 -1
- package/dist/guards/authentication.guard.js +5 -1
- package/dist/guards/authentication.guard.js.map +1 -1
- package/dist/guards/media-signed-url.guard.d.ts +9 -0
- package/dist/guards/media-signed-url.guard.d.ts.map +1 -0
- package/dist/guards/media-signed-url.guard.js +49 -0
- package/dist/guards/media-signed-url.guard.js.map +1 -0
- package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts.map +1 -1
- package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js +10 -13
- package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js.map +1 -1
- package/dist/interfaces.d.ts +19 -1
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js +2 -0
- package/dist/interfaces.js.map +1 -1
- package/dist/repository/media.repository.d.ts.map +1 -1
- package/dist/repository/media.repository.js +2 -0
- package/dist/repository/media.repository.js.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.d.ts +7 -1
- package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js +87 -3
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/permission-metadata-seeder.service.d.ts +1 -0
- package/dist/seeders/permission-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/permission-metadata-seeder.service.js +6 -1
- package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +114 -13
- package/dist/services/authentication.service.d.ts +1 -0
- package/dist/services/authentication.service.d.ts.map +1 -1
- package/dist/services/authentication.service.js +19 -1
- package/dist/services/authentication.service.js.map +1 -1
- package/dist/services/media-download-url.service.d.ts +21 -0
- package/dist/services/media-download-url.service.d.ts.map +1 -0
- package/dist/services/media-download-url.service.js +67 -0
- package/dist/services/media-download-url.service.js.map +1 -0
- package/dist/services/media-storage.utils.d.ts +27 -0
- package/dist/services/media-storage.utils.d.ts.map +1 -0
- package/dist/services/media-storage.utils.js +82 -0
- package/dist/services/media-storage.utils.js.map +1 -0
- package/dist/services/media.service.d.ts +20 -4
- package/dist/services/media.service.d.ts.map +1 -1
- package/dist/services/media.service.js +157 -55
- package/dist/services/media.service.js.map +1 -1
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts +4 -4
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +37 -63
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.d.ts +5 -5
- package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.js +37 -38
- package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
- package/dist/services/role-metadata.service.d.ts +1 -0
- package/dist/services/role-metadata.service.d.ts.map +1 -1
- package/dist/services/role-metadata.service.js +8 -5
- package/dist/services/role-metadata.service.js.map +1 -1
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +11 -1
- package/dist/solid-core.module.js.map +1 -1
- package/dist/subscribers/audit.subscriber.js +1 -1
- package/dist/subscribers/audit.subscriber.js.map +1 -1
- package/package.json +1 -1
- package/src/commands/seed.command.ts +17 -3
- package/src/constants/media-file-types.ts +44 -0
- package/src/controllers/media.controller.ts +44 -24
- package/src/dtos/create-media.dto.ts +8 -3
- package/src/dtos/create-role-metadata.dto.ts +2 -0
- package/src/dtos/update-media.dto.ts +8 -3
- package/src/entities/media.entity.ts +4 -1
- package/src/enums/auth-type.enum.ts +1 -0
- package/src/guards/authentication.guard.ts +3 -0
- package/src/guards/media-signed-url.guard.ts +41 -0
- package/src/helpers/field-crud-managers/MediaFieldCrudManager.ts +12 -24
- package/src/interfaces.ts +20 -0
- package/src/repository/media.repository.ts +2 -0
- package/src/seeders/module-metadata-seeder.service.ts +109 -3
- package/src/seeders/permission-metadata-seeder.service.ts +6 -1
- package/src/seeders/seed-data/solid-core-metadata.json +114 -13
- package/src/services/1.js +6 -0
- package/src/services/authentication.service.ts +24 -1
- package/src/services/media-download-url.service.ts +67 -0
- package/src/services/media-storage.utils.ts +79 -0
- package/src/services/media.service.ts +189 -59
- package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +52 -76
- package/src/services/mediaStorageProviders/file-storage-provider.ts +44 -48
- package/src/services/role-metadata.service.ts +17 -5
- package/src/solid-core.module.ts +21 -2
- package/src/subscribers/audit.subscriber.ts +1 -1
- package/dist-tests/api/authenticate.spec.js +0 -119
- package/dist-tests/api/authenticate.spec.js.map +0 -1
- package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +0 -97
- package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +0 -1
- package/dist-tests/api/ping.spec.js +0 -21
- package/dist-tests/api/ping.spec.js.map +0 -1
- package/dist-tests/helpers/auth.js +0 -41
- package/dist-tests/helpers/auth.js.map +0 -1
- package/dist-tests/helpers/env.js +0 -11
- package/dist-tests/helpers/env.js.map +0 -1
- package/docs/agent-builder/notebook-lm-prompt-for-agent-builder.md +0 -136
- package/docs/agent-builder/team-ready-note-agent-builder.md +0 -305
- package/docs/agent-hub-grooming.md +0 -301
- package/docs/dashboards/AGENTIC_DASHBOARD_IMPLEMENTATION_PLAN.md +0 -438
- package/docs/dashboards/dashboard-curl-smoke-tests.txt +0 -146
- package/docs/dashboards/delete-legacy-dashboard-metadata.sql +0 -172
- package/docs/datasource-introspection-ddl-analysis.md +0 -326
- package/docs/datasource-introspection-implementation-plan.md +0 -306
- package/docs/grouping-enhancements.md +0 -89
- package/docs/java-spring/README.md +0 -3
- package/docs/java-spring/solid-core-module-deep-dive-report.md +0 -1317
- package/docs/module-package-import-handoff.md +0 -691
- package/docs/seed-changes.md +0 -65
- package/docs/test-data-workflow.md +0 -200
- package/docs/type-declaration-import-issue.md +0 -24
- package/docs/workflow/business-automation-example-notes.md +0 -309
- package/docs/workflow/data-engineering-pipeline-example-notes.md +0 -330
- package/docs/workflow/foreach-example-notes.md +0 -187
- package/docs/workflow/hello-world-example-notes.md +0 -271
- package/docs/workflow/kestra-concepts-plugins-blueprints.md +0 -315
- package/docs/workflow/loop-until-example-notes.md +0 -198
- package/docs/workflow/microservices-and-apis-example-notes.md +0 -264
- package/docs/workflow/samples.md +0 -25
- package/docs/workflow/what-is-kestra.md +0 -79
- package/docs/workflow/workflow-core-module-handoff-summary.md +0 -191
- package/docs/workflow/workflow-module-brd.md +0 -185
- package/docs/workflow/workflow-module-domain-model.md +0 -252
- package/docs/workflow/workflow-module-metadata-dsl.md +0 -302
- package/docs/workflow/workflow-module-technical-spec.md +0 -293
- package/docs/workflow/workflow-node-type-contracts.md +0 -635
- package/docs/workflow/workflow-node-ui-metadata-contract.md +0 -1262
- package/docs/workflow/workflow-solidx-model-field-spec.md +0 -284
|
@@ -1,330 +0,0 @@
|
|
|
1
|
-
# Data Engineering Pipeline Example Notes
|
|
2
|
-
|
|
3
|
-
## Purpose
|
|
4
|
-
|
|
5
|
-
This document captures a concrete workflow example and the accompanying UI notes derived from the Kestra reference screens. It is intended to serve as a working design reference for the SolidX workflow-definition list view, detail view, and editor experience.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Example Workflow YAML
|
|
10
|
-
|
|
11
|
-
```yaml
|
|
12
|
-
id: data-engineering-pipeline
|
|
13
|
-
namespace: tutorial
|
|
14
|
-
labels:
|
|
15
|
-
name: Data Engineering Pipeline
|
|
16
|
-
|
|
17
|
-
inputs:
|
|
18
|
-
- id: columns_to_keep
|
|
19
|
-
type: ARRAY
|
|
20
|
-
itemType: STRING
|
|
21
|
-
defaults:
|
|
22
|
-
- brand
|
|
23
|
-
- price
|
|
24
|
-
|
|
25
|
-
tasks:
|
|
26
|
-
- id: extract
|
|
27
|
-
type: io.kestra.plugin.core.http.Download
|
|
28
|
-
description: Download the raw products JSON data.
|
|
29
|
-
uri: https://dummyjson.com/products
|
|
30
|
-
|
|
31
|
-
- id: transform
|
|
32
|
-
type: io.kestra.plugin.scripts.python.Script
|
|
33
|
-
description: Filter the product fields and write a cleaned JSON file.
|
|
34
|
-
containerImage: python:3.11-alpine
|
|
35
|
-
inputFiles:
|
|
36
|
-
data.json: "{{ outputs.extract.uri }}"
|
|
37
|
-
outputFiles:
|
|
38
|
-
- "*.json"
|
|
39
|
-
script: |
|
|
40
|
-
import json
|
|
41
|
-
import os
|
|
42
|
-
|
|
43
|
-
with open("data.json", "r") as file:
|
|
44
|
-
data = json.load(file)
|
|
45
|
-
|
|
46
|
-
filtered_data = [
|
|
47
|
-
{column: product.get(column, "N/A") for column in {{ inputs.columns_to_keep }}}
|
|
48
|
-
for product in data["products"]
|
|
49
|
-
]
|
|
50
|
-
|
|
51
|
-
with open("products.json", "w") as file:
|
|
52
|
-
json.dump(filtered_data, file, indent=4)
|
|
53
|
-
|
|
54
|
-
- id: query
|
|
55
|
-
type: io.kestra.plugin.jdbc.duckdb.Queries
|
|
56
|
-
description: Aggregate the cleaned data with DuckDB and store the result.
|
|
57
|
-
inputFiles:
|
|
58
|
-
products.json: "{{ outputs.transform.outputFiles['products.json'] }}"
|
|
59
|
-
sql: |
|
|
60
|
-
INSTALL json;
|
|
61
|
-
LOAD json;
|
|
62
|
-
SELECT brand, round(avg(price), 2) as avg_price
|
|
63
|
-
FROM read_json_auto('{{ workingDir }}/products.json')
|
|
64
|
-
GROUP BY brand
|
|
65
|
-
ORDER BY avg_price DESC;
|
|
66
|
-
fetchType: STORE
|
|
67
|
-
|
|
68
|
-
description: |
|
|
69
|
-
**Use case:** Compact data engineering pipeline that filters product data and aggregates it by brand.
|
|
70
|
-
**Highlights:**
|
|
71
|
-
- Download product JSON from a public API.
|
|
72
|
-
- Run a Python transform that keeps only the requested columns and emits a cleaned file.
|
|
73
|
-
- Query the cleaned data with DuckDB to compute average prices per brand and store the result for download in the UI.
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
---
|
|
77
|
-
|
|
78
|
-
## What This Example Represents
|
|
79
|
-
|
|
80
|
-
This workflow is a good V1 reference because it is:
|
|
81
|
-
|
|
82
|
-
- Simple enough to understand quickly.
|
|
83
|
-
- Sequential, so it maps well to the current implicit-edge model.
|
|
84
|
-
- Realistic, because it uses HTTP download, transformation, and data querying.
|
|
85
|
-
- Rich enough to exercise inputs, outputs, descriptions, code editing, and topology rendering.
|
|
86
|
-
|
|
87
|
-
The visual topology implied by this workflow is:
|
|
88
|
-
|
|
89
|
-
```text
|
|
90
|
-
Start
|
|
91
|
-
|
|
|
92
|
-
v
|
|
93
|
-
extract
|
|
94
|
-
|
|
|
95
|
-
v
|
|
96
|
-
transform
|
|
97
|
-
|
|
|
98
|
-
v
|
|
99
|
-
query
|
|
100
|
-
|
|
|
101
|
-
v
|
|
102
|
-
End
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
---
|
|
106
|
-
|
|
107
|
-
## Detail Page Notes
|
|
108
|
-
|
|
109
|
-
The reference detail experience suggests a workflow page shaped around tabs, not a single long form.
|
|
110
|
-
|
|
111
|
-
### Tabs Observed
|
|
112
|
-
|
|
113
|
-
- `Overview`
|
|
114
|
-
- `Topology`
|
|
115
|
-
- `Executions`
|
|
116
|
-
- `Edit`
|
|
117
|
-
- `Revisions`
|
|
118
|
-
- `Triggers`
|
|
119
|
-
- `Logs`
|
|
120
|
-
- `Metrics`
|
|
121
|
-
- `Dependencies`
|
|
122
|
-
- `Concurrency`
|
|
123
|
-
- `Audit Logs`
|
|
124
|
-
|
|
125
|
-
### SolidX Interpretation
|
|
126
|
-
|
|
127
|
-
For SolidX workflow-definition UX, the current recommended prioritization is:
|
|
128
|
-
|
|
129
|
-
- Keep: `Overview`
|
|
130
|
-
- Keep: `Topology`
|
|
131
|
-
- Keep: `Executions`
|
|
132
|
-
- Keep: `Edit`
|
|
133
|
-
- Keep: `Triggers`
|
|
134
|
-
- Keep: `Logs`
|
|
135
|
-
- Keep: `Metrics`
|
|
136
|
-
- Ignore for now: `Revisions`
|
|
137
|
-
- Ignore for now: `Concurrency`
|
|
138
|
-
- Ignore for now: `Audit Logs`
|
|
139
|
-
|
|
140
|
-
---
|
|
141
|
-
|
|
142
|
-
## Overview Notes
|
|
143
|
-
|
|
144
|
-
The overview page should change meaningfully once executions exist.
|
|
145
|
-
|
|
146
|
-
### Before Executions
|
|
147
|
-
|
|
148
|
-
The page can show an empty-state hero with a primary call to action:
|
|
149
|
-
|
|
150
|
-
- execute workflow
|
|
151
|
-
- guide the user toward the first run
|
|
152
|
-
|
|
153
|
-
### After Executions
|
|
154
|
-
|
|
155
|
-
The page can evolve into a summary dashboard showing:
|
|
156
|
-
|
|
157
|
-
- success ratio
|
|
158
|
-
- failed ratio
|
|
159
|
-
- in-progress count
|
|
160
|
-
- pending count
|
|
161
|
-
- total executions
|
|
162
|
-
- execution trend / chart
|
|
163
|
-
- description panel
|
|
164
|
-
|
|
165
|
-
This means the overview page should not be treated as static documentation. It should become an operational summary once runtime data exists.
|
|
166
|
-
|
|
167
|
-
---
|
|
168
|
-
|
|
169
|
-
## Topology Notes
|
|
170
|
-
|
|
171
|
-
Topology is read-only in the reference detail page.
|
|
172
|
-
|
|
173
|
-
Recommended SolidX interpretation:
|
|
174
|
-
|
|
175
|
-
- `Topology` tab should be a clean read-only visualization.
|
|
176
|
-
- It should render the workflow structure without edit affordances.
|
|
177
|
-
- It can reuse the same layout logic as the editor flow view, but without mutation controls.
|
|
178
|
-
|
|
179
|
-
---
|
|
180
|
-
|
|
181
|
-
## Executions Notes
|
|
182
|
-
|
|
183
|
-
The `Executions` tab should present a list of all executions for the workflow.
|
|
184
|
-
|
|
185
|
-
Important characteristics from the reference:
|
|
186
|
-
|
|
187
|
-
- list-based presentation
|
|
188
|
-
- filtering/search support
|
|
189
|
-
- empty state when no executions exist
|
|
190
|
-
|
|
191
|
-
For SolidX:
|
|
192
|
-
|
|
193
|
-
- use existing retrieve APIs
|
|
194
|
-
- support server-side pagination, sorting, and search where possible
|
|
195
|
-
- keep the visuals close to SolidX list/table patterns
|
|
196
|
-
|
|
197
|
-
---
|
|
198
|
-
|
|
199
|
-
## Edit Tab Notes
|
|
200
|
-
|
|
201
|
-
This is the most important area for the current UI work.
|
|
202
|
-
|
|
203
|
-
### Desired Structure
|
|
204
|
-
|
|
205
|
-
- `Edit` is a top-level detail tab.
|
|
206
|
-
- Inside `Edit`, only `Code` and `Flow` should be primary editing surfaces.
|
|
207
|
-
- `Docs` should open in a side panel, not as a main third panel in the base layout.
|
|
208
|
-
|
|
209
|
-
### Editor Layout
|
|
210
|
-
|
|
211
|
-
- left: code editor
|
|
212
|
-
- right: flow editor
|
|
213
|
-
- docs: contextual side panel that opens on demand
|
|
214
|
-
|
|
215
|
-
### Editing Mode
|
|
216
|
-
|
|
217
|
-
- flow uses React Flow
|
|
218
|
-
- modal editing for nodes
|
|
219
|
-
- docs are contextual to the selected node type
|
|
220
|
-
- save remains manual
|
|
221
|
-
|
|
222
|
-
---
|
|
223
|
-
|
|
224
|
-
## Flow Canvas Notes
|
|
225
|
-
|
|
226
|
-
The reference behavior to preserve:
|
|
227
|
-
|
|
228
|
-
- `+` insertion controls between nodes
|
|
229
|
-
- per-node actions:
|
|
230
|
-
- edit
|
|
231
|
-
- delete
|
|
232
|
-
- view docs
|
|
233
|
-
- directional flow should be visible
|
|
234
|
-
- zoom in / zoom out controls should exist
|
|
235
|
-
- users may drag nodes to rearrange the graph visually
|
|
236
|
-
- dragging is for visual arrangement only, not for defining semantic connections via drag-and-drop wiring
|
|
237
|
-
|
|
238
|
-
### Important Modeling Note
|
|
239
|
-
|
|
240
|
-
Workflow structure is still governed by the workflow DSL contract.
|
|
241
|
-
|
|
242
|
-
That means:
|
|
243
|
-
|
|
244
|
-
- node order remains driven by workflow structure
|
|
245
|
-
- edges are implicit from the DSL
|
|
246
|
-
- the canvas is a visual/editor representation of the workflow, not the source of truth for execution semantics
|
|
247
|
-
|
|
248
|
-
---
|
|
249
|
-
|
|
250
|
-
## Triggers Notes
|
|
251
|
-
|
|
252
|
-
Triggers are wanted, but not the first editing priority.
|
|
253
|
-
|
|
254
|
-
Current note:
|
|
255
|
-
|
|
256
|
-
- keep a `Triggers` tab in the long-term detail experience
|
|
257
|
-
- rendering and editing of triggers can come after the core editor is stabilized
|
|
258
|
-
|
|
259
|
-
---
|
|
260
|
-
|
|
261
|
-
## Logs Notes
|
|
262
|
-
|
|
263
|
-
Logs are wanted.
|
|
264
|
-
|
|
265
|
-
Recommended direction:
|
|
266
|
-
|
|
267
|
-
- separate `Logs` tab
|
|
268
|
-
- searchable / filterable runtime log list
|
|
269
|
-
- use workflow or execution context to scope logs
|
|
270
|
-
|
|
271
|
-
---
|
|
272
|
-
|
|
273
|
-
## Metrics Notes
|
|
274
|
-
|
|
275
|
-
Metrics are wanted, but depend on runtime persistence.
|
|
276
|
-
|
|
277
|
-
Important note:
|
|
278
|
-
|
|
279
|
-
- metrics are only meaningful once we persist them into backing tables or another queryable runtime store
|
|
280
|
-
|
|
281
|
-
So for now:
|
|
282
|
-
|
|
283
|
-
- keep `Metrics` in the design vocabulary
|
|
284
|
-
- treat it as a pending feature unless the persistence model is implemented
|
|
285
|
-
|
|
286
|
-
---
|
|
287
|
-
|
|
288
|
-
## Pending Feature Notes
|
|
289
|
-
|
|
290
|
-
The following are intentionally deferred or partially deferred:
|
|
291
|
-
|
|
292
|
-
- metrics persistence and reporting
|
|
293
|
-
- trigger authoring experience
|
|
294
|
-
- richer overview analytics
|
|
295
|
-
- revisions
|
|
296
|
-
- concurrency controls
|
|
297
|
-
- audit-log specific workflow views
|
|
298
|
-
- blueprints for this area as part of a later phase
|
|
299
|
-
|
|
300
|
-
---
|
|
301
|
-
|
|
302
|
-
## Screenshot References
|
|
303
|
-
|
|
304
|
-
These screenshots informed the notes above:
|
|
305
|
-
|
|
306
|
-
- `/Users/harishpatel/Desktop/Screenshot 2026-07-10 at 16.58.43.png`
|
|
307
|
-
- `/Users/harishpatel/Desktop/Screenshot 2026-07-10 at 16.58.48.png`
|
|
308
|
-
- `/Users/harishpatel/Desktop/Screenshot 2026-07-10 at 16.58.53.png`
|
|
309
|
-
- `/Users/harishpatel/Desktop/Screenshot 2026-07-10 at 16.58.59.png`
|
|
310
|
-
- `/Users/harishpatel/Desktop/Screenshot 2026-07-10 at 16.59.07.png`
|
|
311
|
-
- `/Users/harishpatel/Desktop/Screenshot 2026-07-10 at 16.59.16.png`
|
|
312
|
-
- `/Users/harishpatel/Desktop/Screenshot 2026-07-10 at 16.59.22.png`
|
|
313
|
-
- `/Users/harishpatel/Desktop/Screenshot 2026-07-10 at 16.59.28.png`
|
|
314
|
-
- `/Users/harishpatel/Desktop/Screenshot 2026-07-10 at 17.01.42.png`
|
|
315
|
-
- `/Users/harishpatel/Desktop/Screenshot 2026-07-10 at 17.01.47.png`
|
|
316
|
-
|
|
317
|
-
---
|
|
318
|
-
|
|
319
|
-
## Recommended Next UI Build Order
|
|
320
|
-
|
|
321
|
-
Based on this example, the clean next implementation sequence is:
|
|
322
|
-
|
|
323
|
-
1. Finish the bespoke workflow-definition list view.
|
|
324
|
-
2. Tighten the workflow-definition detail shell with tabs.
|
|
325
|
-
3. Refine the `Edit` tab into:
|
|
326
|
-
- left code editor
|
|
327
|
-
- right React Flow editor
|
|
328
|
-
- contextual docs side panel
|
|
329
|
-
4. Add modal-based node configuration using schema-driven forms.
|
|
330
|
-
5. Add runtime tabs for executions, logs, and later metrics.
|
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
# ForEach Example Notes
|
|
2
|
-
|
|
3
|
-
## Purpose
|
|
4
|
-
|
|
5
|
-
This document captures a reference workflow for loop-based control flow using `ForEach`. It fills an important gap in the example set by showing how repeated execution over a list of values should be represented in topology and editor views.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Example Workflow YAML
|
|
10
|
-
|
|
11
|
-
```yaml
|
|
12
|
-
id: foreach_example
|
|
13
|
-
namespace: my.namespace
|
|
14
|
-
|
|
15
|
-
tasks:
|
|
16
|
-
- id: for_each_loop
|
|
17
|
-
type: io.kestra.core.tasks.flows.ForEach
|
|
18
|
-
values: ["item_1", "item_2", "item_3"]
|
|
19
|
-
tasks:
|
|
20
|
-
- id: print_value
|
|
21
|
-
type: io.kestra.core.tasks.scripts.Bash
|
|
22
|
-
commands:
|
|
23
|
-
- echo "Current loop value is {{ taskrun.value }}"
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## What This Example Adds
|
|
29
|
-
|
|
30
|
-
This example is useful because it shows:
|
|
31
|
-
|
|
32
|
-
- iterative control flow
|
|
33
|
-
- a loop container node
|
|
34
|
-
- child tasks executed once per loop item
|
|
35
|
-
- loop-scoped runtime values such as `taskrun.value`
|
|
36
|
-
|
|
37
|
-
It is the cleanest reference for repeated execution semantics in the workflow DSL.
|
|
38
|
-
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
## High-Level Structure
|
|
42
|
-
|
|
43
|
-
```text
|
|
44
|
-
Start
|
|
45
|
-
|
|
|
46
|
-
v
|
|
47
|
-
for_each_loop
|
|
48
|
-
|
|
|
49
|
-
v
|
|
50
|
-
print_value
|
|
51
|
-
|
|
|
52
|
-
v
|
|
53
|
-
End
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
Conceptually, the structure is:
|
|
57
|
-
|
|
58
|
-
```text
|
|
59
|
-
Workflow
|
|
60
|
-
└── for_each_loop
|
|
61
|
-
└── print_value
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
Runtime interpretation:
|
|
65
|
-
|
|
66
|
-
```text
|
|
67
|
-
for_each_loop over ["item_1", "item_2", "item_3"]
|
|
68
|
-
- run print_value with taskrun.value = "item_1"
|
|
69
|
-
- run print_value with taskrun.value = "item_2"
|
|
70
|
-
- run print_value with taskrun.value = "item_3"
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
---
|
|
74
|
-
|
|
75
|
-
## Main Note
|
|
76
|
-
|
|
77
|
-
### Example With `ForEach`
|
|
78
|
-
|
|
79
|
-
This is the key purpose of the example.
|
|
80
|
-
|
|
81
|
-
It shows that a loop is not just a visual group. It represents repeated execution of its child tasks across a collection of values.
|
|
82
|
-
|
|
83
|
-
For SolidX, the topology should communicate:
|
|
84
|
-
|
|
85
|
-
- the loop container
|
|
86
|
-
- the loop body
|
|
87
|
-
- that child tasks belong to the repeated block
|
|
88
|
-
|
|
89
|
-
The canvas does not need to simulate every repeated instance visually. It should represent the structural loop definition cleanly.
|
|
90
|
-
|
|
91
|
-
---
|
|
92
|
-
|
|
93
|
-
## Topology Notes
|
|
94
|
-
|
|
95
|
-
The screenshot suggests:
|
|
96
|
-
|
|
97
|
-
- `ForEach` appears as a grouped/container region
|
|
98
|
-
- the loop node is rendered inside that region
|
|
99
|
-
- the child task appears within the same grouped flow area
|
|
100
|
-
- the overall sequence still remains vertical and directional
|
|
101
|
-
|
|
102
|
-
This means the renderer should support a loop-specific grouped layout similar to other control-flow containers, but with loop semantics instead of branch semantics.
|
|
103
|
-
|
|
104
|
-
---
|
|
105
|
-
|
|
106
|
-
## Loop Semantics Notes
|
|
107
|
-
|
|
108
|
-
This example is important because it introduces loop-local context:
|
|
109
|
-
|
|
110
|
-
- `taskrun.value`
|
|
111
|
-
|
|
112
|
-
That means the editor and docs system will eventually need to help users understand:
|
|
113
|
-
|
|
114
|
-
- which context values are available inside loops
|
|
115
|
-
- that those values only exist within the loop body
|
|
116
|
-
- how expressions differ between workflow scope and loop scope
|
|
117
|
-
|
|
118
|
-
This is a documentation and autocomplete concern as much as a topology concern.
|
|
119
|
-
|
|
120
|
-
---
|
|
121
|
-
|
|
122
|
-
## Implications For SolidX Flow Modeling
|
|
123
|
-
|
|
124
|
-
This example implies the flow model should support a distinct category for loop containers.
|
|
125
|
-
|
|
126
|
-
Useful structural categories now include:
|
|
127
|
-
|
|
128
|
-
- simple task node
|
|
129
|
-
- trigger group
|
|
130
|
-
- branch/control-flow container
|
|
131
|
-
- nested/group container
|
|
132
|
-
- loop container
|
|
133
|
-
|
|
134
|
-
For `ForEach` specifically, the model should preserve:
|
|
135
|
-
|
|
136
|
-
- loop source values
|
|
137
|
-
- child task list
|
|
138
|
-
- loop-local expression scope
|
|
139
|
-
|
|
140
|
-
---
|
|
141
|
-
|
|
142
|
-
## Editor Notes
|
|
143
|
-
|
|
144
|
-
This example is a good reminder that the editor should remain DSL-driven.
|
|
145
|
-
|
|
146
|
-
For a loop:
|
|
147
|
-
|
|
148
|
-
- the source of truth is the `ForEach` node definition
|
|
149
|
-
- the canvas should reflect loop structure
|
|
150
|
-
- the user should edit loop configuration from metadata/schema, not by drawing repeated paths manually
|
|
151
|
-
|
|
152
|
-
This fits well with the current direction:
|
|
153
|
-
|
|
154
|
-
- code + flow are the primary surfaces
|
|
155
|
-
- node editing is modal
|
|
156
|
-
- docs are contextual
|
|
157
|
-
|
|
158
|
-
---
|
|
159
|
-
|
|
160
|
-
## Future UX Notes
|
|
161
|
-
|
|
162
|
-
This example points to a few future needs:
|
|
163
|
-
|
|
164
|
-
- loop-aware docs for `taskrun.value`
|
|
165
|
-
- loop-container editing modal
|
|
166
|
-
- schema-driven configuration for `values`
|
|
167
|
-
- clear distinction between loop definition and loop runtime iterations
|
|
168
|
-
|
|
169
|
-
---
|
|
170
|
-
|
|
171
|
-
## Screenshot References
|
|
172
|
-
|
|
173
|
-
This screenshot informed the notes above:
|
|
174
|
-
|
|
175
|
-
- `/var/folders/z_/h0rqj1693gs4cxm3k_vks86c0000gn/T/TemporaryItems/NSIRD_screencaptureui_ptomjl/Screenshot 2026-07-10 at 17.17.48.png`
|
|
176
|
-
|
|
177
|
-
---
|
|
178
|
-
|
|
179
|
-
## Recommended Follow-On Use
|
|
180
|
-
|
|
181
|
-
This example should be used as a reference for:
|
|
182
|
-
|
|
183
|
-
1. `ForEach` node rendering
|
|
184
|
-
2. loop-container layout rules
|
|
185
|
-
3. loop-local expression awareness
|
|
186
|
-
4. schema-driven loop configuration UX
|
|
187
|
-
5. future autocomplete help for loop scope values
|