@solidxai/core 0.1.13-beta.10 → 0.1.13-beta.12

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 (105) hide show
  1. package/CHANGELOG.md +1115 -0
  2. package/dist/commands/run-tests.command.d.ts +2 -0
  3. package/dist/commands/run-tests.command.d.ts.map +1 -1
  4. package/dist/commands/run-tests.command.js +20 -3
  5. package/dist/commands/run-tests.command.js.map +1 -1
  6. package/dist/entities/dashboard-user-layout.entity.js +2 -2
  7. package/dist/entities/dashboard-user-layout.entity.js.map +1 -1
  8. package/dist/entities/view-metadata.entity.js.map +1 -1
  9. package/dist/entities/workflow-execution-artifact.entity.d.ts.map +1 -1
  10. package/dist/entities/workflow-execution-artifact.entity.js +4 -3
  11. package/dist/entities/workflow-execution-artifact.entity.js.map +1 -1
  12. package/dist/entities/workflow-execution-log.entity.d.ts.map +1 -1
  13. package/dist/entities/workflow-execution-log.entity.js +4 -3
  14. package/dist/entities/workflow-execution-log.entity.js.map +1 -1
  15. package/dist/entities/workflow-execution.entity.d.ts.map +1 -1
  16. package/dist/entities/workflow-execution.entity.js +3 -2
  17. package/dist/entities/workflow-execution.entity.js.map +1 -1
  18. package/dist/entities/workflow-secret.entity.d.ts.map +1 -1
  19. package/dist/entities/workflow-secret.entity.js +3 -2
  20. package/dist/entities/workflow-secret.entity.js.map +1 -1
  21. package/dist/entities/workflow-step-execution.entity.d.ts.map +1 -1
  22. package/dist/entities/workflow-step-execution.entity.js +3 -2
  23. package/dist/entities/workflow-step-execution.entity.js.map +1 -1
  24. package/dist/entities/workflow-trigger-execution.entity.d.ts.map +1 -1
  25. package/dist/entities/workflow-trigger-execution.entity.js +6 -5
  26. package/dist/entities/workflow-trigger-execution.entity.js.map +1 -1
  27. package/dist/helpers/typeorm-db-helper.d.ts.map +1 -1
  28. package/dist/helpers/typeorm-db-helper.js +9 -0
  29. package/dist/helpers/typeorm-db-helper.js.map +1 -1
  30. package/dist/testing/reporter/console-reporter.d.ts +3 -0
  31. package/dist/testing/reporter/console-reporter.d.ts.map +1 -1
  32. package/dist/testing/reporter/console-reporter.js +2 -0
  33. package/dist/testing/reporter/console-reporter.js.map +1 -1
  34. package/dist/testing/reporter/progress-reporter.d.ts +64 -0
  35. package/dist/testing/reporter/progress-reporter.d.ts.map +1 -0
  36. package/dist/testing/reporter/progress-reporter.js +224 -0
  37. package/dist/testing/reporter/progress-reporter.js.map +1 -0
  38. package/dist/testing/reporter/reporter.types.d.ts +3 -0
  39. package/dist/testing/reporter/reporter.types.d.ts.map +1 -1
  40. package/dist/testing/reporter/reporter.types.js.map +1 -1
  41. package/dist/testing/runner/run-from-metadata.d.ts.map +1 -1
  42. package/dist/testing/runner/run-from-metadata.js +1 -0
  43. package/dist/testing/runner/run-from-metadata.js.map +1 -1
  44. package/dist-tests/api/authenticate.spec.js +119 -0
  45. package/dist-tests/api/authenticate.spec.js.map +1 -0
  46. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +97 -0
  47. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +1 -0
  48. package/dist-tests/api/ping.spec.js +21 -0
  49. package/dist-tests/api/ping.spec.js.map +1 -0
  50. package/dist-tests/helpers/auth.js +41 -0
  51. package/dist-tests/helpers/auth.js.map +1 -0
  52. package/dist-tests/helpers/env.js +11 -0
  53. package/dist-tests/helpers/env.js.map +1 -0
  54. package/docs/agent-builder/notebook-lm-prompt-for-agent-builder.md +136 -0
  55. package/docs/agent-builder/team-ready-note-agent-builder.md +305 -0
  56. package/docs/agent-hub-grooming.md +301 -0
  57. package/docs/dashboards/AGENTIC_DASHBOARD_IMPLEMENTATION_PLAN.md +438 -0
  58. package/docs/dashboards/dashboard-curl-smoke-tests.txt +146 -0
  59. package/docs/dashboards/delete-legacy-dashboard-metadata.sql +172 -0
  60. package/docs/datasource-introspection-ddl-analysis.md +326 -0
  61. package/docs/datasource-introspection-implementation-plan.md +306 -0
  62. package/docs/grouping-enhancements.md +89 -0
  63. package/docs/java-spring/README.md +3 -0
  64. package/docs/java-spring/solid-core-module-deep-dive-report.md +1317 -0
  65. package/docs/module-package-import-handoff.md +691 -0
  66. package/docs/seed-changes.md +65 -0
  67. package/docs/test-data-workflow.md +200 -0
  68. package/docs/type-declaration-import-issue.md +24 -0
  69. package/docs/workflow/business-automation-example-notes.md +309 -0
  70. package/docs/workflow/control-flow-node-addition-sop.md +324 -0
  71. package/docs/workflow/data-engineering-pipeline-example-notes.md +330 -0
  72. package/docs/workflow/foreach-example-notes.md +187 -0
  73. package/docs/workflow/hello-world-example-notes.md +271 -0
  74. package/docs/workflow/kestra-concepts-plugins-blueprints.md +315 -0
  75. package/docs/workflow/loop-until-example-notes.md +198 -0
  76. package/docs/workflow/microservices-and-apis-example-notes.md +264 -0
  77. package/docs/workflow/samples.md +25 -0
  78. package/docs/workflow/what-is-kestra.md +79 -0
  79. package/docs/workflow/workflow-core-module-handoff-summary.md +191 -0
  80. package/docs/workflow/workflow-module-brd.md +185 -0
  81. package/docs/workflow/workflow-module-domain-model.md +252 -0
  82. package/docs/workflow/workflow-module-metadata-dsl.md +302 -0
  83. package/docs/workflow/workflow-module-technical-spec.md +293 -0
  84. package/docs/workflow/workflow-node-type-contracts.md +635 -0
  85. package/docs/workflow/workflow-node-ui-metadata-contract.md +1262 -0
  86. package/docs/workflow/workflow-solidx-model-field-spec.md +284 -0
  87. package/package.json +1 -1
  88. package/src/commands/run-tests.command.ts +17 -3
  89. package/src/entities/dashboard-user-layout.entity.ts +2 -2
  90. package/src/entities/view-metadata.entity.ts +2 -2
  91. package/src/entities/workflow-execution-artifact.entity.ts +4 -3
  92. package/src/entities/workflow-execution-log.entity.ts +4 -3
  93. package/src/entities/workflow-execution.entity.ts +3 -2
  94. package/src/entities/workflow-secret.entity.ts +3 -2
  95. package/src/entities/workflow-step-execution.entity.ts +3 -2
  96. package/src/entities/workflow-trigger-execution.entity.ts +6 -5
  97. package/src/helpers/typeorm-db-helper.ts +12 -1
  98. package/src/testing/README.md +2 -1
  99. package/src/testing/reporter/console-reporter.ts +4 -0
  100. package/src/testing/reporter/progress-reporter.ts +251 -0
  101. package/src/testing/reporter/reporter.types.ts +3 -0
  102. package/src/testing/runner/run-from-metadata.ts +1 -0
  103. package/.claude/settings.local.json +0 -16
  104. package/CLAUDE.md +0 -26
  105. package/src/services/1.js +0 -6
@@ -0,0 +1,284 @@
1
+ # Workflow SolidX Model Field Specification
2
+
3
+ This document translates the agreed workflow-management domain model into SolidX model and field definitions.
4
+
5
+ It is intended as the final field-level design pass before using the SolidX model MCP tools.
6
+
7
+ ## SolidX Field Types
8
+
9
+ The local `@solidxai/core` package defines these field types in `SolidFieldType`:
10
+
11
+ - `int`
12
+ - `bigint`
13
+ - `decimal`
14
+ - `shortText`
15
+ - `longText`
16
+ - `richText`
17
+ - `json`
18
+ - `boolean`
19
+ - `date`
20
+ - `datetime`
21
+ - `time`
22
+ - `relation`
23
+ - `mediaSingle`
24
+ - `mediaMultiple`
25
+ - `email`
26
+ - `password`
27
+ - `selectionStatic`
28
+ - `selectionDynamic`
29
+ - `computed`
30
+ - `uuid`
31
+
32
+ Useful relation metadata:
33
+
34
+ - `relationType`: `many-to-one`, `one-to-many`, `many-to-many`
35
+ - `relationCascade`: `set null`, `restrict`, `cascade`
36
+
37
+ ## Modeling Philosophy
38
+
39
+ - Workflow definitions store their canonical DSL in YAML text.
40
+ - Workflow definitions are metadata-backed: manually created workflows should also be persisted back to the module metadata JSON so developers can commit and share them.
41
+ - Workflow execution data is normalized enough to support monitoring, filtering, and debugging.
42
+ - Workflow version history is not a separate model in v1.
43
+ - `definitionVersion` and `definitionChecksum` live on both definition and execution records.
44
+ - `WorkflowBlueprint` is intentionally deferred for now.
45
+
46
+ ## Model: `workflowDefinition`
47
+
48
+ Purpose: stores the current reusable workflow definition.
49
+
50
+ Suggested table name: `wm_workflow_definition`
51
+
52
+ | Field | SolidX Type | Required | Notes |
53
+ | --- | --- | --- | --- |
54
+ | `key` | `shortText` | Yes | Stable workflow key. Should be unique. |
55
+ | `moduleMetadata` | `relation` | Yes | Many-to-one to SolidX `moduleMetadata`; identifies the owning module/package for metadata persistence. |
56
+ | `displayName` | `shortText` | Yes | Human-facing name. |
57
+ | `namespace` | `shortText` | No | Dot-path grouping, e.g. `ops.monitoring`. |
58
+ | `description` | `longText` | No | Workflow description. |
59
+ | `status` | `selectionStatic` | Yes | `draft`, `active`, `inactive`, `archived`. |
60
+ | `definitionVersion` | `shortText` | No | Human-managed or seed-managed version string. |
61
+ | `definitionChecksum` | `shortText` | No | Hash of canonical `definitionYaml`. |
62
+ | `definitionYaml` | `longText` | Yes | Canonical workflow DSL YAML used for sharing, seeding, validation, and execution. |
63
+ | `tags` | `json` | No | Array of tags. |
64
+
65
+ Recommended indexes/search fields:
66
+
67
+ - `key`
68
+ - `moduleMetadata`
69
+ - `displayName`
70
+ - `namespace`
71
+ - `status`
72
+ - `definitionChecksum`
73
+
74
+ Recommended user key:
75
+
76
+ - `key`
77
+
78
+ Metadata persistence notes:
79
+
80
+ - `key` acts as the workflow user key and metadata identity.
81
+ - A TypeORM subscriber or workflow persistence service should synchronize workflow definition changes back to the owning module metadata JSON.
82
+ - Since UI-created workflows are also metadata-backed, separate `sourceType`, `seedSource`, `seedKey`, `seedVersion`, and `isSeeded` fields are not needed.
83
+
84
+ ## Model: `workflowExecution`
85
+
86
+ Purpose: stores one run of a workflow definition.
87
+
88
+ Suggested table name: `wm_workflow_execution`
89
+
90
+ | Field | SolidX Type | Required | Notes |
91
+ | --- | --- | --- | --- |
92
+ | `executionIdentifier` | `computed` | Yes | System-generated readable execution id. Recommended provider: `SequenceNumComputedFieldProvider`. |
93
+ | `workflowDefinition` | `relation` | Yes | Many-to-one to `workflowDefinition`. |
94
+ | `workflowKey` | `shortText` | Yes | Snapshot of definition key for easier querying. |
95
+ | `workflowDisplayName` | `shortText` | No | Snapshot of display name. |
96
+ | `status` | `selectionStatic` | Yes | `created`, `running`, `success`, `failed`, `cancelled`. |
97
+ | `triggerType` | `selectionStatic` | Yes | `manual`, `schedule`, `webhook`, `flow`, `polling`, `event`. |
98
+ | `triggerExecution` | `relation` | No | Many-to-one to `workflowTriggerExecution`; nullable for manual runs. |
99
+ | `startedAt` | `datetime` | No | Execution start time. |
100
+ | `finishedAt` | `datetime` | No | Execution end time. |
101
+ | `durationMs` | `bigint` | No | Runtime duration. |
102
+ | `inputPayload` | `json` | No | Runtime inputs supplied to the execution. |
103
+ | `outputPayload` | `json` | No | Flow-level outputs. |
104
+ | `definitionVersion` | `shortText` | No | Version used by this execution. |
105
+ | `definitionChecksum` | `shortText` | No | Checksum used by this execution. |
106
+ | `definitionSnapshot` | `longText` | Yes | Exact workflow YAML used for this run. |
107
+ | `errorSummary` | `longText` | No | Human-readable failure summary. |
108
+ | `errorDetails` | `json` | No | Structured error payload. |
109
+ | `requestedByUserId` | `bigint` | No | User id or actor id if available. |
110
+
111
+ Recommended indexes/search fields:
112
+
113
+ - `executionIdentifier`
114
+ - `workflowKey`
115
+ - `status`
116
+ - `triggerType`
117
+ - `startedAt`
118
+ - `finishedAt`
119
+ - `definitionChecksum`
120
+
121
+ Recommended computed field configuration:
122
+
123
+ - `type`: `computed`
124
+ - `computedFieldValueProvider`: `SequenceNumComputedFieldProvider`
125
+ - `computedFieldValueProviderCtxt`: `{"sequenceName":"workflowExecution","mode":"counter"}`
126
+ - `computedFieldValueType`: `string`
127
+ - `computedFieldTriggerConfig`: after insert for `workflowExecution`
128
+
129
+ Recommended model sequence:
130
+
131
+ - `sequenceName`: `workflowExecution`
132
+ - `prefix`: `WFE`
133
+ - `separator`: `-`
134
+ - `padding`: `8`
135
+ - Example output: `WFE-00000001`
136
+
137
+ ## Model: `workflowStepExecution`
138
+
139
+ Purpose: stores runtime state for one workflow node execution.
140
+
141
+ Suggested table name: `wm_workflow_step_execution`
142
+
143
+ | Field | SolidX Type | Required | Notes |
144
+ | --- | --- | --- | --- |
145
+ | `workflowExecution` | `relation` | Yes | Many-to-one to `workflowExecution`. |
146
+ | `parentStepExecution` | `relation` | No | Self many-to-one for nested/control execution. |
147
+ | `nodeId` | `shortText` | Yes | Node id from workflow YAML. |
148
+ | `nodeName` | `shortText` | No | Snapshot of node name. |
149
+ | `nodeKind` | `selectionStatic` | Yes | `task`, `control`, `subflow`. |
150
+ | `nodeType` | `shortText` | Yes | e.g. `http.request`, `if`. |
151
+ | `status` | `selectionStatic` | Yes | `pending`, `running`, `success`, `failed`, `skipped`. |
152
+ | `attemptNumber` | `int` | Yes | Defaults to 1. |
153
+ | `branchId` | `shortText` | No | For `parallel` branch context. |
154
+ | `iterationIndex` | `int` | No | For `forEach` context. |
155
+ | `startedAt` | `datetime` | No | Step start time. |
156
+ | `finishedAt` | `datetime` | No | Step end time. |
157
+ | `durationMs` | `bigint` | No | Step runtime duration. |
158
+ | `inputContext` | `json` | No | Resolved node input context. |
159
+ | `outputPayload` | `json` | No | Node outputs. |
160
+ | `errorSummary` | `longText` | No | Human-readable failure summary. |
161
+ | `errorDetails` | `json` | No | Structured error payload. |
162
+
163
+ Recommended indexes/search fields:
164
+
165
+ - `workflowExecution`
166
+ - `nodeId`
167
+ - `nodeType`
168
+ - `status`
169
+ - `startedAt`
170
+
171
+ ## Model: `workflowExecutionLog`
172
+
173
+ Purpose: stores execution and step logs as queryable records.
174
+
175
+ Suggested table name: `wm_workflow_execution_log`
176
+
177
+ | Field | SolidX Type | Required | Notes |
178
+ | --- | --- | --- | --- |
179
+ | `workflowExecution` | `relation` | Yes | Many-to-one to `workflowExecution`. |
180
+ | `workflowStepExecution` | `relation` | No | Many-to-one to `workflowStepExecution`; nullable for execution-level logs. |
181
+ | `level` | `selectionStatic` | Yes | `debug`, `info`, `warn`, `error`. |
182
+ | `message` | `longText` | Yes | Log message. |
183
+ | `metadata` | `json` | No | Structured log metadata. |
184
+ | `loggedAt` | `datetime` | Yes | Timestamp of log event. |
185
+
186
+ Recommended indexes/search fields:
187
+
188
+ - `workflowExecution`
189
+ - `workflowStepExecution`
190
+ - `level`
191
+ - `loggedAt`
192
+
193
+ ## Model: `workflowExecutionArtifact`
194
+
195
+ Purpose: stores references to files or large artifacts produced during execution.
196
+
197
+ Suggested table name: `wm_workflow_execution_artifact`
198
+
199
+ | Field | SolidX Type | Required | Notes |
200
+ | --- | --- | --- | --- |
201
+ | `workflowExecution` | `relation` | Yes | Many-to-one to `workflowExecution`. |
202
+ | `workflowStepExecution` | `relation` | No | Many-to-one to `workflowStepExecution`. |
203
+ | `artifactKey` | `shortText` | Yes | Stable artifact key within the execution. |
204
+ | `displayName` | `shortText` | No | Human-facing name. |
205
+ | `artifactType` | `selectionStatic` | Yes | `file`, `json`, `text`, `binary`, `uri`. |
206
+ | `media` | `mediaSingle` | No | SolidX media attachment for stored file artifacts. |
207
+ | `uri` | `longText` | No | External artifact URI if not stored in media. |
208
+ | `contentType` | `shortText` | No | MIME type if known. |
209
+ | `sizeBytes` | `bigint` | No | Artifact size. |
210
+ | `metadata` | `json` | No | Structured artifact metadata. |
211
+ | `createdAtRuntime` | `datetime` | No | Runtime artifact creation timestamp. |
212
+
213
+ Recommended indexes/search fields:
214
+
215
+ - `workflowExecution`
216
+ - `workflowStepExecution`
217
+ - `artifactKey`
218
+ - `artifactType`
219
+
220
+ ## Model: `workflowTriggerExecution`
221
+
222
+ Purpose: records trigger events that started or attempted to start workflow executions.
223
+
224
+ Suggested table name: `wm_workflow_trigger_execution`
225
+
226
+ | Field | SolidX Type | Required | Notes |
227
+ | --- | --- | --- | --- |
228
+ | `workflowDefinition` | `relation` | Yes | Many-to-one to `workflowDefinition`. |
229
+ | `triggerId` | `shortText` | Yes | Trigger id from workflow YAML. |
230
+ | `triggerType` | `selectionStatic` | Yes | `schedule`, `webhook`, `flow`, `polling`, `event`. |
231
+ | `status` | `selectionStatic` | Yes | `received`, `accepted`, `ignored`, `failed`. |
232
+ | `firedAt` | `datetime` | Yes | Trigger fire time. |
233
+ | `inputPayload` | `json` | No | Inputs supplied by trigger. |
234
+ | `triggerPayload` | `json` | No | Raw trigger/event payload. |
235
+ | `workflowExecution` | `relation` | No | Many-to-one to `workflowExecution`; nullable if ignored/failed before execution creation. |
236
+ | `errorSummary` | `longText` | No | Human-readable failure summary. |
237
+ | `errorDetails` | `json` | No | Structured error payload. |
238
+
239
+ Recommended indexes/search fields:
240
+
241
+ - `workflowDefinition`
242
+ - `triggerId`
243
+ - `triggerType`
244
+ - `status`
245
+ - `firedAt`
246
+
247
+ ## Deferred Model: `workflowBlueprint`
248
+
249
+ `WorkflowBlueprint` is intentionally ignored for now.
250
+
251
+ When reintroduced, it should likely include:
252
+
253
+ - `key`
254
+ - `displayName`
255
+ - `description`
256
+ - `tags`
257
+ - `definitionYaml`
258
+ - `source`
259
+ - `sourceVersion`
260
+
261
+ ## Relation Summary
262
+
263
+ - `workflowDefinition` has many `workflowExecution`
264
+ - `workflowDefinition` has many `workflowTriggerExecution`
265
+ - `moduleMetadata` has many `workflowDefinition`
266
+ - `workflowExecution` has many `workflowStepExecution`
267
+ - `workflowExecution` has many `workflowExecutionLog`
268
+ - `workflowExecution` has many `workflowExecutionArtifact`
269
+ - `workflowTriggerExecution` may link to one created `workflowExecution`
270
+ - `workflowStepExecution` may have many child `workflowStepExecution` records via `parentStepExecution`
271
+ - `workflowStepExecution` has many `workflowExecutionLog`
272
+ - `workflowStepExecution` has many `workflowExecutionArtifact`
273
+
274
+ ## MCP Modeling Readiness Checklist
275
+
276
+ Before calling the SolidX model MCP tools, confirm:
277
+
278
+ - Use `workflow-builder` as the module key.
279
+ - Use the six active models above.
280
+ - Use `longText` for `definitionYaml` and `definitionSnapshot`; parse them as YAML in the workflow services to keep the workflow engine DB agnostic.
281
+ - Use `selectionStatic` for status/type enum fields.
282
+ - Use `relation` fields for cross-model links.
283
+ - Add a many-to-one relation from `workflowDefinition` to SolidX `moduleMetadata`.
284
+ - Keep `WorkflowBlueprint` deferred.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solidxai/core",
3
- "version": "0.1.13-beta.10",
3
+ "version": "0.1.13-beta.12",
4
4
  "description": "This module is a NestJS module containing all the required core providers required by a Solid application",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -3,6 +3,7 @@ import { SubCommand, CommandRunner, Option } from 'nest-commander';
3
3
  import * as path from 'path';
4
4
  import { ModuleMetadataHelperService } from 'src/helpers/module-metadata-helper.service';
5
5
  import { ConsoleReporter } from 'src/testing/reporter/console-reporter';
6
+ import { ProgressReporter } from 'src/testing/reporter/progress-reporter';
6
7
  import { WebhookReporter } from 'src/testing/reporter/webhook-reporter';
7
8
  import { runFromMetadata } from 'src/testing/runner/run-from-metadata';
8
9
  import type { TestingMetadata } from 'src/testing/contracts/testing-metadata.types';
@@ -27,6 +28,7 @@ interface TestRunCommandOptions {
27
28
  listSpecs?: boolean;
28
29
  printApiLogs?: boolean;
29
30
  runName?: string;
31
+ progress?: boolean;
30
32
  }
31
33
 
32
34
  @SubCommand({
@@ -106,9 +108,12 @@ export class TestRunCommand extends CommandRunner {
106
108
 
107
109
  const webhookUrl = process.env.SOLIDCTL_WEBHOOK_URL;
108
110
  const runName = options?.runName ?? `run-${Date.now()}`;
109
- const reporter = webhookUrl
111
+ const baseReporter = webhookUrl
110
112
  ? new WebhookReporter(webhookUrl, runName)
111
113
  : new ConsoleReporter();
114
+ const reporter = options?.progress === false
115
+ ? baseReporter
116
+ : new ProgressReporter(baseReporter);
112
117
 
113
118
  try {
114
119
  await runFromMetadata({
@@ -138,8 +143,8 @@ export class TestRunCommand extends CommandRunner {
138
143
  console.error('Run tests command failed');
139
144
  process.exitCode = 1;
140
145
  } finally {
141
- if (reporter instanceof WebhookReporter) {
142
- await reporter.flush(Number(process.exitCode ?? 0));
146
+ if (baseReporter instanceof WebhookReporter) {
147
+ await baseReporter.flush(Number(process.exitCode ?? 0));
143
148
  }
144
149
  }
145
150
  return;
@@ -289,6 +294,15 @@ export class TestRunCommand extends CommandRunner {
289
294
  parseRunName(val: string): string {
290
295
  return val;
291
296
  }
297
+
298
+ @Option({
299
+ flags: '--no-progress',
300
+ description: 'Disable the interactive test progress footer.',
301
+ required: false,
302
+ })
303
+ parseNoProgress(): boolean {
304
+ return false;
305
+ }
292
306
  }
293
307
 
294
308
  function splitCsv(value?: string): string[] | undefined {
@@ -6,12 +6,12 @@ import { ModuleMetadata } from 'src/entities/module-metadata.entity'
6
6
  @Entity('ss_dashboard_user_layout')
7
7
  export class DashboardUserLayout extends CommonEntity {
8
8
  @Index()
9
- @ManyToOne(() => User, { onDelete: "CASCADE", nullable: false })
9
+ @ManyToOne(() => User, { nullable: false })
10
10
  @JoinColumn()
11
11
  user: User;
12
12
 
13
13
  @Index()
14
- @ManyToOne(() => ModuleMetadata, { onDelete: "CASCADE", nullable: false })
14
+ @ManyToOne(() => ModuleMetadata, { nullable: false })
15
15
  @JoinColumn()
16
16
  module: ModuleMetadata;
17
17
 
@@ -19,11 +19,11 @@ export class ViewMetadata extends CommonEntity {
19
19
  @Column({ name: "type", type: "varchar" })
20
20
  type: string;
21
21
 
22
- //TODO: To make this truly cross db compatible, we should avoid setting a db type
22
+ // TODO: To make this truly cross db compatible, we should avoid setting a db type
23
23
  @Column({ name: "context", type: "text" })
24
24
  context: any = "{}";
25
25
 
26
- //TODO: To make this truly cross db compatible, we should avoid setting a db type
26
+ // TODO: To make this truly cross db compatible, we should avoid setting a db type
27
27
  @Column({ name: "layout", type: "text" })
28
28
  layout: any;
29
29
 
@@ -2,6 +2,7 @@ import { CommonEntity } from 'src/entities/common.entity';
2
2
  import { Entity, Column, Index, JoinColumn, ManyToOne } from 'typeorm';
3
3
  import { WorkflowExecution } from './workflow-execution.entity';
4
4
  import { WorkflowStepExecution } from './workflow-step-execution.entity'
5
+ import { getColumnType } from 'src/helpers/typeorm-db-helper';
5
6
 
6
7
  @Entity('ss_workflow_execution_artifact')
7
8
  export class WorkflowExecutionArtifact extends CommonEntity {
@@ -10,12 +11,12 @@ export class WorkflowExecutionArtifact extends CommonEntity {
10
11
  artifactKey: string;
11
12
 
12
13
  @Index()
13
- @ManyToOne(() => WorkflowExecution, { onDelete: "CASCADE", nullable: false })
14
+ @ManyToOne(() => WorkflowExecution, { nullable: false })
14
15
  @JoinColumn()
15
16
  workflowExecution: WorkflowExecution;
16
17
 
17
18
  @Index()
18
- @ManyToOne(() => WorkflowStepExecution, { onDelete: "CASCADE", nullable: true })
19
+ @ManyToOne(() => WorkflowStepExecution, { nullable: true })
19
20
  @JoinColumn()
20
21
  workflowStepExecution: WorkflowStepExecution;
21
22
 
@@ -61,7 +62,7 @@ export class WorkflowExecutionArtifact extends CommonEntity {
61
62
  checksum: string;
62
63
 
63
64
  @Index()
64
- @Column({ type: "timestamp", nullable: true })
65
+ @Column({ nullable: true, ...getColumnType('datetime') })
65
66
  producedAt: Date;
66
67
 
67
68
  @Column({ type: "simple-json", nullable: true })
@@ -2,6 +2,7 @@ import { CommonEntity } from 'src/entities/common.entity';
2
2
  import { Entity, Column, Index, JoinColumn, ManyToOne } from 'typeorm';
3
3
  import { WorkflowExecution } from './workflow-execution.entity';
4
4
  import { WorkflowStepExecution } from './workflow-step-execution.entity'
5
+ import { getColumnType } from 'src/helpers/typeorm-db-helper';
5
6
 
6
7
  @Entity('ss_workflow_execution_log')
7
8
  export class WorkflowExecutionLog extends CommonEntity {
@@ -10,12 +11,12 @@ export class WorkflowExecutionLog extends CommonEntity {
10
11
  logKey: string;
11
12
 
12
13
  @Index()
13
- @ManyToOne(() => WorkflowExecution, { onDelete: "CASCADE", nullable: false })
14
+ @ManyToOne(() => WorkflowExecution, { nullable: false })
14
15
  @JoinColumn()
15
16
  workflowExecution: WorkflowExecution;
16
17
 
17
18
  @Index()
18
- @ManyToOne(() => WorkflowStepExecution, { onDelete: "CASCADE", nullable: true })
19
+ @ManyToOne(() => WorkflowStepExecution, { nullable: true })
19
20
  @JoinColumn()
20
21
  workflowStepExecution: WorkflowStepExecution;
21
22
 
@@ -47,7 +48,7 @@ export class WorkflowExecutionLog extends CommonEntity {
47
48
  sequenceNumber: number;
48
49
 
49
50
  @Index()
50
- @Column({ type: "timestamp" })
51
+ @Column({ ...getColumnType('datetime') })
51
52
  occurredAt: Date;
52
53
 
53
54
  @Column({ type: "simple-json", nullable: true })
@@ -4,6 +4,7 @@ import { WorkflowDefinition } from './workflow-definition.entity'
4
4
  import { WorkflowStepExecution } from './workflow-step-execution.entity';
5
5
  import { WorkflowExecutionLog } from './workflow-execution-log.entity';
6
6
  import { WorkflowExecutionArtifact } from './workflow-execution-artifact.entity';
7
+ import { getColumnType } from 'src/helpers/typeorm-db-helper';
7
8
 
8
9
  @Entity('ss_workflow_execution')
9
10
  export class WorkflowExecution extends CommonEntity {
@@ -32,11 +33,11 @@ export class WorkflowExecution extends CommonEntity {
32
33
  triggerType: string = "manual";
33
34
 
34
35
  @Index()
35
- @Column({ type: "timestamp", nullable: true })
36
+ @Column({ nullable: true, ...getColumnType('datetime') })
36
37
  startedAt: Date;
37
38
 
38
39
  @Index()
39
- @Column({ type: "timestamp", nullable: true })
40
+ @Column({ nullable: true, ...getColumnType('datetime') })
40
41
  finishedAt: Date;
41
42
 
42
43
  @Column({ type: "bigint", nullable: true })
@@ -1,5 +1,6 @@
1
1
  import { CommonEntity } from 'src/entities/common.entity';
2
2
  import { Entity, Column, Index } from 'typeorm';
3
+ import { getColumnType } from 'src/helpers/typeorm-db-helper';
3
4
 
4
5
  @Entity('ss_workflow_secret')
5
6
  export class WorkflowSecret extends CommonEntity {
@@ -25,9 +26,9 @@ export class WorkflowSecret extends CommonEntity {
25
26
  @Column({ type: "varchar", default: "active" })
26
27
  status: string = "active";
27
28
 
28
- @Column({ type: "timestamp", nullable: true })
29
+ @Column({ nullable: true, ...getColumnType('datetime') })
29
30
  lastRotatedAt: Date;
30
31
 
31
- @Column({ type: "timestamp", nullable: true })
32
+ @Column({ nullable: true, ...getColumnType('datetime') })
32
33
  lastAccessedAt: Date;
33
34
  }
@@ -1,6 +1,7 @@
1
1
  import { CommonEntity } from 'src/entities/common.entity';
2
2
  import { Entity, Column, Index, JoinColumn, ManyToOne } from 'typeorm';
3
3
  import { WorkflowExecution } from './workflow-execution.entity'
4
+ import { getColumnType } from 'src/helpers/typeorm-db-helper';
4
5
 
5
6
  @Entity('ss_workflow_step_execution')
6
7
  export class WorkflowStepExecution extends CommonEntity {
@@ -55,11 +56,11 @@ export class WorkflowStepExecution extends CommonEntity {
55
56
  sequenceNumber: number;
56
57
 
57
58
  @Index()
58
- @Column({ type: "timestamp", nullable: true })
59
+ @Column({ nullable: true, ...getColumnType('datetime') })
59
60
  startedAt: Date;
60
61
 
61
62
  @Index()
62
- @Column({ type: "timestamp", nullable: true })
63
+ @Column({ nullable: true, ...getColumnType('datetime') })
63
64
  finishedAt: Date;
64
65
 
65
66
  @Column({ type: "bigint", nullable: true })
@@ -2,6 +2,7 @@ import { CommonEntity } from 'src/entities/common.entity';
2
2
  import { Entity, Column, Index, JoinColumn, ManyToOne } from 'typeorm';
3
3
  import { WorkflowDefinition } from './workflow-definition.entity';
4
4
  import { WorkflowExecution } from './workflow-execution.entity'
5
+ import { getColumnType } from 'src/helpers/typeorm-db-helper';
5
6
 
6
7
  @Entity('ss_workflow_trigger_execution')
7
8
  export class WorkflowTriggerExecution extends CommonEntity {
@@ -10,12 +11,12 @@ export class WorkflowTriggerExecution extends CommonEntity {
10
11
  triggerExecutionKey: string;
11
12
 
12
13
  @Index()
13
- @ManyToOne(() => WorkflowDefinition, { onDelete: "CASCADE", nullable: false })
14
+ @ManyToOne(() => WorkflowDefinition, { nullable: false })
14
15
  @JoinColumn()
15
16
  workflowDefinition: WorkflowDefinition;
16
17
 
17
18
  @Index()
18
- @ManyToOne(() => WorkflowExecution, { onDelete: "CASCADE", nullable: true })
19
+ @ManyToOne(() => WorkflowExecution, { nullable: true })
19
20
  @JoinColumn()
20
21
  workflowExecution: WorkflowExecution;
21
22
 
@@ -39,15 +40,15 @@ export class WorkflowTriggerExecution extends CommonEntity {
39
40
  matched: boolean = false;
40
41
 
41
42
  @Index()
42
- @Column({ type: "timestamp" })
43
+ @Column({ ...getColumnType('datetime') })
43
44
  firedAt: Date;
44
45
 
45
46
  @Index()
46
- @Column({ type: "timestamp", nullable: true })
47
+ @Column({ nullable: true, ...getColumnType('datetime') })
47
48
  startedAt: Date;
48
49
 
49
50
  @Index()
50
- @Column({ type: "timestamp", nullable: true })
51
+ @Column({ nullable: true, ...getColumnType('datetime') })
51
52
  finishedAt: Date;
52
53
 
53
54
  @Column({ type: "bigint", nullable: true })
@@ -40,6 +40,14 @@ const DECIMAL_MAP: Record<DatasourceType, ColumnOptions> = {
40
40
  [DatasourceType.oracle]: { type: "float" },
41
41
  };
42
42
 
43
+ const DATE_TIME_MAP: Record<DatasourceType, ColumnOptions> = {
44
+ [DatasourceType.postgres]: { type: "timestamp" },
45
+ [DatasourceType.mssql]: { type: "datetime2" },
46
+ [DatasourceType.mysql]: { type: "datetime" },
47
+ [DatasourceType.mariadb]: { type: "datetime" },
48
+ [DatasourceType.oracle]: { type: "timestamp" },
49
+ };
50
+
43
51
  const solidCoreDbType: DatasourceType =
44
52
  Object.values(DatasourceType).includes(process.env.SOLID_CORE_DB_TYPE as DatasourceType)
45
53
  ? (process.env.SOLID_CORE_DB_TYPE as DatasourceType)
@@ -72,7 +80,10 @@ export function getColumnType(solidType: string): ColumnOptions {
72
80
  case "decimal":
73
81
  return DECIMAL_MAP[solidCoreDbType];
74
82
 
83
+ case "datetime":
84
+ return DATE_TIME_MAP[solidCoreDbType];
85
+
75
86
  default:
76
87
  return {};
77
88
  }
78
- }
89
+ }
@@ -479,10 +479,11 @@ Common `test run` flags (all pass through solidctl unchanged):
479
479
  - `--ui-navigation-timeout-ms <number>` — default wait for `ui.goto`
480
480
  - `--timeout-ms <number>` / `--retries <number>` — scenario-level guard and retry count
481
481
  - `--scenario-ids <ids>` / `--include-tags <tags>` / `--skip-scenario-ids <ids>`
482
+ - `--no-progress` — disable the interactive test progress footer
482
483
 
483
484
  ## Add A New Step (SOP)
484
485
  1. Create a new `*.step.ts` in the right domain folder.
485
486
  2. Implement a `registerXSteps(registry)` function and `registry.register("op.name", handler)`.
486
487
  3. Validate required `step.with` fields and throw clear errors.
487
488
  4. Use adapters via `ctx.api` / `ctx.ui` and update `ctx.last` when helpful.
488
- 5. Export and register it from the domain `index.ts`.
489
+ 5. Export and register it from the domain `index.ts`.
@@ -150,6 +150,10 @@ export class ConsoleReporter implements Reporter {
150
150
  private passedScenarios = 0;
151
151
  private failedScenarios = 0;
152
152
 
153
+ onRunStart(_args: { total: number }): void {
154
+ // Progress-aware reporters use this hook; the plain console reporter has no setup.
155
+ }
156
+
153
157
  onScenarioStart(scenario: { id: string; name?: string }): void {
154
158
  const label = scenario.name ? `${scenario.id} (${scenario.name})` : scenario.id;
155
159
  console.log(`\n▶ Scenario: ${label}`);