ultravisor 1.0.4 → 1.0.8
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/card-audit.json +1545 -0
- package/docs/_sidebar.md +17 -0
- package/docs/css/docuserve.css +73 -0
- package/docs/features/beacon-authentication.md +209 -0
- package/docs/features/beacon-providers.md +1299 -0
- package/docs/features/beacons.md +530 -0
- package/docs/features/capabilities.md +193 -0
- package/docs/features/llm-model-setup.md +505 -0
- package/docs/features/llm.md +262 -0
- package/docs/features/tasks-content-system.md +110 -0
- package/docs/features/tasks-data-transform.md +233 -0
- package/docs/features/tasks-extension.md +36 -0
- package/docs/features/tasks-file-system.md +203 -0
- package/docs/features/tasks-flow-control.md +125 -0
- package/docs/features/tasks-http-client.md +119 -0
- package/docs/features/tasks-llm.md +118 -0
- package/docs/features/tasks-meadow-api.md +163 -0
- package/docs/features/tasks-user-interaction.md +49 -0
- package/docs/features/tasks.md +14 -0
- package/docs/index.html +1 -1
- package/docs/retold-catalog.json +1 -1
- package/docs/retold-keyword-index.json +17374 -5
- package/operation-library/api-data-pipeline.json +143 -0
- package/operation-library/beacon-remote-command.json +72 -0
- package/operation-library/conditional-file-backup.json +143 -0
- package/operation-library/config-processor.json +136 -0
- package/operation-library/csv-data-analysis.json +228 -0
- package/operation-library/csv-to-json.json +160 -0
- package/operation-library/directory-inventory.json +128 -0
- package/operation-library/expression-calculator.json +114 -0
- package/operation-library/file-search-replace.json +175 -0
- package/operation-library/git-status-report.json +368 -0
- package/operation-library/health-check-ping.json +329 -0
- package/operation-library/json-config-merge.json +313 -0
- package/operation-library/llm-embedding-tool-use.json +314 -0
- package/operation-library/llm-multi-turn-analysis.json +322 -0
- package/operation-library/llm-summarize.json +264 -0
- package/operation-library/log-line-counter.json +185 -0
- package/operation-library/meadow-crud-lifecycle.json +264 -0
- package/operation-library/npm-project-validator.json +193 -0
- package/operation-library/rest-api-orchestrator.json +218 -0
- package/operation-library/shell-system-info.json +137 -0
- package/operation-library/simple-echo.json +95 -0
- package/operation-library/template-processor.json +299 -0
- package/operation-library/text-sanitizer.json +176 -0
- package/package.json +9 -6
- package/source/Ultravisor.cjs +18 -10
- package/source/beacon/Ultravisor-Beacon-CLI.cjs +143 -0
- package/source/beacon/Ultravisor-Beacon-CapabilityProvider.cjs +129 -0
- package/source/beacon/Ultravisor-Beacon-Client.cjs +568 -0
- package/source/beacon/Ultravisor-Beacon-Executor.cjs +500 -0
- package/source/beacon/Ultravisor-Beacon-ProviderRegistry.cjs +330 -0
- package/source/beacon/providers/Ultravisor-Beacon-Provider-FileSystem.cjs +331 -0
- package/source/beacon/providers/Ultravisor-Beacon-Provider-LLM.cjs +966 -0
- package/source/beacon/providers/Ultravisor-Beacon-Provider-Shell.cjs +95 -0
- package/source/cli/Ultravisor-CLIProgram.cjs +10 -0
- package/source/config/Ultravisor-Default-Command-Configuration.cjs +8 -1
- package/source/services/Ultravisor-Beacon-Coordinator.cjs +966 -0
- package/source/services/Ultravisor-ExecutionEngine.cjs +62 -8
- package/source/services/Ultravisor-ExecutionManifest.cjs +232 -2
- package/source/services/Ultravisor-Hypervisor.cjs +155 -0
- package/source/services/Ultravisor-Schedule-Persistence-Base.cjs +45 -0
- package/source/services/Ultravisor-StateManager.cjs +12 -0
- package/source/services/Ultravisor-TaskTypeRegistry.cjs +95 -25
- package/source/services/persistence/Ultravisor-Schedule-Persistence-JSONFile.cjs +140 -0
- package/source/services/tasks/Ultravisor-BuiltIn-TaskConfigs.cjs +19 -0
- package/source/services/tasks/Ultravisor-TaskHelper-BeaconDispatch.cjs +107 -0
- package/source/services/tasks/Ultravisor-TaskType-Base.cjs +20 -0
- package/source/services/tasks/content-system/Ultravisor-TaskConfigs-ContentSystem.cjs +90 -0
- package/source/services/tasks/content-system/definitions/content-create-folder.json +24 -0
- package/source/services/tasks/content-system/definitions/content-list-files.json +27 -0
- package/source/services/tasks/content-system/definitions/content-read-file.json +26 -0
- package/source/services/tasks/content-system/definitions/content-save-file.json +26 -0
- package/source/services/tasks/data-transform/Ultravisor-TaskConfigs-DataTransform.cjs +577 -0
- package/source/services/tasks/{data → data-transform}/Ultravisor-TaskType-ReplaceString.cjs +27 -29
- package/source/services/tasks/{data → data-transform}/Ultravisor-TaskType-SetValues.cjs +10 -17
- package/source/services/tasks/{data → data-transform}/Ultravisor-TaskType-StringAppender.cjs +13 -24
- package/source/services/tasks/data-transform/definitions/comprehension-intersect.json +24 -0
- package/source/services/tasks/data-transform/definitions/csv-transform.json +24 -0
- package/source/services/tasks/data-transform/definitions/expression-solver.json +20 -0
- package/source/services/tasks/data-transform/definitions/histogram.json +23 -0
- package/source/services/tasks/data-transform/definitions/parse-csv.json +27 -0
- package/source/services/tasks/data-transform/definitions/replace-string.json +27 -0
- package/source/services/tasks/data-transform/definitions/set-values.json +17 -0
- package/source/services/tasks/data-transform/definitions/string-appender.json +22 -0
- package/source/services/tasks/data-transform/definitions/template-string.json +20 -0
- package/source/services/tasks/extension/Ultravisor-TaskConfigs-Extension.cjs +87 -0
- package/source/services/tasks/extension/definitions/beacon-dispatch.json +32 -0
- package/source/services/tasks/file-system/Ultravisor-TaskConfigs-FileSystem.cjs +509 -0
- package/source/services/tasks/{file-io → file-system}/Ultravisor-TaskType-ReadFile.cjs +27 -34
- package/source/services/tasks/file-system/Ultravisor-TaskType-ReadFileBuffered.cjs +123 -0
- package/source/services/tasks/{file-io → file-system}/Ultravisor-TaskType-WriteFile.cjs +26 -37
- package/source/services/tasks/file-system/definitions/copy-file.json +27 -0
- package/source/services/tasks/file-system/definitions/list-files.json +27 -0
- package/source/services/tasks/file-system/definitions/read-file-buffered.json +31 -0
- package/source/services/tasks/file-system/definitions/read-file.json +26 -0
- package/source/services/tasks/file-system/definitions/read-json.json +23 -0
- package/source/services/tasks/file-system/definitions/write-file.json +29 -0
- package/source/services/tasks/file-system/definitions/write-json.json +30 -0
- package/source/services/tasks/flow-control/Ultravisor-TaskConfigs-FlowControl.cjs +353 -0
- package/source/services/tasks/{control → flow-control}/Ultravisor-TaskType-IfConditional.cjs +1 -24
- package/source/services/tasks/{control → flow-control}/Ultravisor-TaskType-LaunchOperation.cjs +27 -28
- package/source/services/tasks/{control → flow-control}/Ultravisor-TaskType-SplitExecute.cjs +9 -29
- package/source/services/tasks/flow-control/definitions/if-conditional.json +25 -0
- package/source/services/tasks/flow-control/definitions/launch-operation.json +27 -0
- package/source/services/tasks/flow-control/definitions/split-execute.json +32 -0
- package/source/services/tasks/http-client/Ultravisor-TaskConfigs-HttpClient.cjs +281 -0
- package/source/services/tasks/http-client/definitions/get-json.json +26 -0
- package/source/services/tasks/http-client/definitions/get-text.json +26 -0
- package/source/services/tasks/http-client/definitions/rest-request.json +32 -0
- package/source/services/tasks/http-client/definitions/send-json.json +28 -0
- package/source/services/tasks/llm/Ultravisor-TaskConfigs-LLM.cjs +605 -0
- package/source/services/tasks/llm/definitions/llm-chat-completion.json +46 -0
- package/source/services/tasks/llm/definitions/llm-embedding.json +31 -0
- package/source/services/tasks/llm/definitions/llm-tool-use.json +42 -0
- package/source/services/tasks/meadow-api/Ultravisor-TaskConfigs-MeadowApi.cjs +341 -0
- package/source/services/tasks/meadow-api/definitions/meadow-count.json +26 -0
- package/source/services/tasks/meadow-api/definitions/meadow-create.json +26 -0
- package/source/services/tasks/meadow-api/definitions/meadow-delete.json +23 -0
- package/source/services/tasks/meadow-api/definitions/meadow-read.json +26 -0
- package/source/services/tasks/meadow-api/definitions/meadow-reads.json +29 -0
- package/source/services/tasks/meadow-api/definitions/meadow-update.json +26 -0
- package/source/services/tasks/shell/Ultravisor-TaskConfigs-Shell.cjs +63 -0
- package/source/services/tasks/shell/definitions/command.json +29 -0
- package/source/services/tasks/user-interaction/Ultravisor-TaskConfigs-UserInteraction.cjs +64 -0
- package/source/services/tasks/{interaction → user-interaction}/Ultravisor-TaskType-ErrorMessage.cjs +19 -18
- package/source/services/tasks/{interaction → user-interaction}/Ultravisor-TaskType-ValueInput.cjs +4 -19
- package/source/services/tasks/user-interaction/definitions/error-message.json +18 -0
- package/source/services/tasks/user-interaction/definitions/value-input.json +23 -0
- package/source/web_server/Ultravisor-API-Server.cjs +613 -1
- package/test/Ultravisor_operation_library_tests.js +894 -0
- package/test/Ultravisor_tests.js +4601 -12
- package/test/workflows/test-content-concatenate-all.json +339 -0
- package/test/workflows/test-content-full-pipeline.json +159 -0
- package/test/workflows/test-content-list-files.json +76 -0
- package/test/workflows/test-content-save-and-read.json +106 -0
- package/webinterface/css/ultravisor-themes.css +668 -0
- package/webinterface/css/ultravisor.css +15 -15
- package/webinterface/docs/card-help/beacon-dispatch.md +30 -0
- package/webinterface/docs/card-help/command.md +27 -0
- package/webinterface/docs/card-help/comprehension-intersect.md +24 -0
- package/webinterface/docs/card-help/content-create-folder.md +22 -0
- package/webinterface/docs/card-help/content-list-files.md +25 -0
- package/webinterface/docs/card-help/content-read-file.md +24 -0
- package/webinterface/docs/card-help/content-save-file.md +24 -0
- package/webinterface/docs/card-help/copy-file.md +25 -0
- package/webinterface/docs/card-help/csv-transform.md +24 -0
- package/webinterface/docs/card-help/end.md +11 -0
- package/webinterface/docs/card-help/error-message.md +16 -0
- package/webinterface/docs/card-help/expression-solver.md +21 -0
- package/webinterface/docs/card-help/get-json.md +24 -0
- package/webinterface/docs/card-help/get-text.md +24 -0
- package/webinterface/docs/card-help/histogram.md +23 -0
- package/webinterface/docs/card-help/if-conditional.md +23 -0
- package/webinterface/docs/card-help/launch-operation.md +25 -0
- package/webinterface/docs/card-help/list-files.md +25 -0
- package/webinterface/docs/card-help/llm-chat-completion.md +43 -0
- package/webinterface/docs/card-help/llm-embedding.md +24 -0
- package/webinterface/docs/card-help/llm-tool-use.md +39 -0
- package/webinterface/docs/card-help/meadow-count.md +24 -0
- package/webinterface/docs/card-help/meadow-create.md +24 -0
- package/webinterface/docs/card-help/meadow-delete.md +19 -0
- package/webinterface/docs/card-help/meadow-read.md +24 -0
- package/webinterface/docs/card-help/meadow-reads.md +27 -0
- package/webinterface/docs/card-help/meadow-update.md +24 -0
- package/webinterface/docs/card-help/parse-csv.md +27 -0
- package/webinterface/docs/card-help/read-file-buffered.md +29 -0
- package/webinterface/docs/card-help/read-file.md +24 -0
- package/webinterface/docs/card-help/read-json.md +21 -0
- package/webinterface/docs/card-help/replace-string.md +25 -0
- package/webinterface/docs/card-help/rest-request.md +30 -0
- package/webinterface/docs/card-help/send-json.md +26 -0
- package/webinterface/docs/card-help/set-values.md +16 -0
- package/webinterface/docs/card-help/split-execute.md +35 -0
- package/webinterface/docs/card-help/start.md +11 -0
- package/webinterface/docs/card-help/string-appender.md +22 -0
- package/webinterface/docs/card-help/template-string.md +21 -0
- package/webinterface/docs/card-help/value-input.md +24 -0
- package/webinterface/docs/card-help/write-file.md +27 -0
- package/webinterface/docs/card-help/write-json.md +28 -0
- package/webinterface/html/index.html +5 -0
- package/webinterface/package.json +8 -2
- package/webinterface/source/Pict-Application-Ultravisor.js +483 -9
- package/webinterface/source/Ultravisor-TimingUtils.js +99 -0
- package/webinterface/source/card-help-content.js +46 -0
- package/webinterface/source/cards/Ultravisor-BuiltIn-CardConfigs.js +174 -0
- package/webinterface/source/cards/Ultravisor-CardConfigGenerator.js +431 -0
- package/webinterface/source/panels/Ultravisor-CardSettingsPanel.js +902 -0
- package/webinterface/source/providers/PictRouter-Ultravisor-Configuration.json +12 -0
- package/webinterface/source/views/PictView-Ultravisor-BeaconList.js +817 -0
- package/webinterface/source/views/PictView-Ultravisor-BottomBar.js +5 -5
- package/webinterface/source/views/PictView-Ultravisor-Dashboard.js +19 -19
- package/webinterface/source/views/PictView-Ultravisor-Documentation.js +856 -0
- package/webinterface/source/views/PictView-Ultravisor-FlowEditor.js +425 -84
- package/webinterface/source/views/PictView-Ultravisor-ManifestList.js +293 -32
- package/webinterface/source/views/PictView-Ultravisor-OperationEdit.js +3 -3
- package/webinterface/source/views/PictView-Ultravisor-OperationList.js +307 -50
- package/webinterface/source/views/PictView-Ultravisor-PendingInput.js +16 -16
- package/webinterface/source/views/PictView-Ultravisor-Schedule.js +520 -29
- package/webinterface/source/views/PictView-Ultravisor-TimingView.js +311 -62
- package/webinterface/source/views/PictView-Ultravisor-TopBar.js +256 -21
- package/webinterface/theme-sampler.html +645 -0
- package/.ultravisor.json +0 -426
- package/webinterface/source/cards/FlowCard-CSVTransform.js +0 -43
- package/webinterface/source/cards/FlowCard-Command.js +0 -86
- package/webinterface/source/cards/FlowCard-ComprehensionIntersect.js +0 -40
- package/webinterface/source/cards/FlowCard-Conditional.js +0 -87
- package/webinterface/source/cards/FlowCard-CopyFile.js +0 -55
- package/webinterface/source/cards/FlowCard-End.js +0 -29
- package/webinterface/source/cards/FlowCard-GetJSON.js +0 -55
- package/webinterface/source/cards/FlowCard-GetText.js +0 -54
- package/webinterface/source/cards/FlowCard-Histogram.js +0 -176
- package/webinterface/source/cards/FlowCard-LaunchOperation.js +0 -82
- package/webinterface/source/cards/FlowCard-ListFiles.js +0 -55
- package/webinterface/source/cards/FlowCard-MeadowCount.js +0 -44
- package/webinterface/source/cards/FlowCard-MeadowCreate.js +0 -44
- package/webinterface/source/cards/FlowCard-MeadowDelete.js +0 -45
- package/webinterface/source/cards/FlowCard-MeadowRead.js +0 -46
- package/webinterface/source/cards/FlowCard-MeadowReads.js +0 -46
- package/webinterface/source/cards/FlowCard-MeadowUpdate.js +0 -44
- package/webinterface/source/cards/FlowCard-ParseCSV.js +0 -85
- package/webinterface/source/cards/FlowCard-ReadJSON.js +0 -54
- package/webinterface/source/cards/FlowCard-ReadText.js +0 -54
- package/webinterface/source/cards/FlowCard-RestRequest.js +0 -59
- package/webinterface/source/cards/FlowCard-SendJSON.js +0 -57
- package/webinterface/source/cards/FlowCard-Solver.js +0 -77
- package/webinterface/source/cards/FlowCard-Start.js +0 -29
- package/webinterface/source/cards/FlowCard-TemplateString.js +0 -77
- package/webinterface/source/cards/FlowCard-WriteJSON.js +0 -54
- package/webinterface/source/cards/FlowCard-WriteText.js +0 -54
package/card-audit.json
ADDED
|
@@ -0,0 +1,1545 @@
|
|
|
1
|
+
{
|
|
2
|
+
"AuditDate": "2026-03-16",
|
|
3
|
+
"TotalCards": 39,
|
|
4
|
+
"FlowMarkers": ["start", "end"],
|
|
5
|
+
|
|
6
|
+
"Cards": [
|
|
7
|
+
{
|
|
8
|
+
"Hash": "set-values",
|
|
9
|
+
"Name": "Set Values",
|
|
10
|
+
"Category": "data",
|
|
11
|
+
"Capability": "Data Transform",
|
|
12
|
+
"Tier": "Engine",
|
|
13
|
+
"EventInputs": [
|
|
14
|
+
{ "Name": "Execute" }
|
|
15
|
+
],
|
|
16
|
+
"EventOutputs": [
|
|
17
|
+
{ "Name": "Complete" }
|
|
18
|
+
],
|
|
19
|
+
"SettingsInputs": [
|
|
20
|
+
{ "Name": "Mappings", "DataType": "Array", "Required": true }
|
|
21
|
+
],
|
|
22
|
+
"StateOutputs": [],
|
|
23
|
+
"Recommendations": [
|
|
24
|
+
{
|
|
25
|
+
"Type": "MissingPort",
|
|
26
|
+
"Port": "EventOutput",
|
|
27
|
+
"Name": "Error",
|
|
28
|
+
"Rationale": "If Mappings contains invalid entries (non-object, missing Address), the task silently skips them. An Error event output would let flows handle bad data explicitly."
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"Hash": "replace-string",
|
|
34
|
+
"Name": "Replace String",
|
|
35
|
+
"Category": "data",
|
|
36
|
+
"Capability": "Data Transform",
|
|
37
|
+
"Tier": "Engine",
|
|
38
|
+
"EventInputs": [
|
|
39
|
+
{ "Name": "Replace" }
|
|
40
|
+
],
|
|
41
|
+
"EventOutputs": [
|
|
42
|
+
{ "Name": "ReplaceComplete" },
|
|
43
|
+
{ "Name": "Error", "IsError": true }
|
|
44
|
+
],
|
|
45
|
+
"SettingsInputs": [
|
|
46
|
+
{ "Name": "InputString", "DataType": "String", "Required": true },
|
|
47
|
+
{ "Name": "SearchString", "DataType": "String", "Required": true },
|
|
48
|
+
{ "Name": "ReplaceString", "DataType": "String", "Required": false }
|
|
49
|
+
],
|
|
50
|
+
"StateOutputs": [
|
|
51
|
+
{ "Name": "ReplacedString", "DataType": "String" }
|
|
52
|
+
],
|
|
53
|
+
"Recommendations": [
|
|
54
|
+
{
|
|
55
|
+
"Type": "MissingSetting",
|
|
56
|
+
"Name": "UseRegex",
|
|
57
|
+
"DataType": "Boolean",
|
|
58
|
+
"Rationale": "Currently uses string split/join. A UseRegex flag would enable regex-based search/replace, vastly increasing utility."
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"Type": "MissingSetting",
|
|
62
|
+
"Name": "CaseSensitive",
|
|
63
|
+
"DataType": "Boolean",
|
|
64
|
+
"Rationale": "No way to do case-insensitive replacements without regex."
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"Type": "MissingOutput",
|
|
68
|
+
"Name": "ReplacementCount",
|
|
69
|
+
"DataType": "Number",
|
|
70
|
+
"Rationale": "The count is already computed internally but discarded. Exposing it as an output enables conditional branching (e.g., 'if no replacements were made')."
|
|
71
|
+
}
|
|
72
|
+
]
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"Hash": "string-appender",
|
|
76
|
+
"Name": "String Appender",
|
|
77
|
+
"Category": "data",
|
|
78
|
+
"Capability": "Data Transform",
|
|
79
|
+
"Tier": "Engine",
|
|
80
|
+
"EventInputs": [
|
|
81
|
+
{ "Name": "Append" }
|
|
82
|
+
],
|
|
83
|
+
"EventOutputs": [
|
|
84
|
+
{ "Name": "Completed" }
|
|
85
|
+
],
|
|
86
|
+
"SettingsInputs": [
|
|
87
|
+
{ "Name": "InputString", "DataType": "String", "Required": true },
|
|
88
|
+
{ "Name": "OutputAddress", "DataType": "String", "Required": true },
|
|
89
|
+
{ "Name": "AppendNewline", "DataType": "Boolean", "Required": false }
|
|
90
|
+
],
|
|
91
|
+
"StateOutputs": [
|
|
92
|
+
{ "Name": "AppendedString", "DataType": "String" }
|
|
93
|
+
],
|
|
94
|
+
"Recommendations": [
|
|
95
|
+
{
|
|
96
|
+
"Type": "MissingSetting",
|
|
97
|
+
"Name": "Separator",
|
|
98
|
+
"DataType": "String",
|
|
99
|
+
"Rationale": "AppendNewline is a special case. A general Separator setting (default: empty) would let you join with commas, semicolons, custom delimiters, etc. AppendNewline becomes Separator='\\n'."
|
|
100
|
+
}
|
|
101
|
+
]
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"Hash": "template-string",
|
|
105
|
+
"Name": "Template String",
|
|
106
|
+
"Category": "core",
|
|
107
|
+
"Capability": "Data Transform",
|
|
108
|
+
"Tier": "Engine",
|
|
109
|
+
"EventInputs": [
|
|
110
|
+
{ "Name": "In" }
|
|
111
|
+
],
|
|
112
|
+
"EventOutputs": [
|
|
113
|
+
{ "Name": "Complete" }
|
|
114
|
+
],
|
|
115
|
+
"SettingsInputs": [
|
|
116
|
+
{ "Name": "Template", "DataType": "String", "Required": true },
|
|
117
|
+
{ "Name": "Destination", "DataType": "String", "Required": false }
|
|
118
|
+
],
|
|
119
|
+
"StateOutputs": [
|
|
120
|
+
{ "Name": "Result", "DataType": "String" }
|
|
121
|
+
],
|
|
122
|
+
"Recommendations": [
|
|
123
|
+
{
|
|
124
|
+
"Type": "MissingPort",
|
|
125
|
+
"Port": "EventOutput",
|
|
126
|
+
"Name": "Error",
|
|
127
|
+
"IsError": true,
|
|
128
|
+
"Rationale": "Template parsing failures are caught silently and fall back to the raw template. An Error output would let flows detect bad templates."
|
|
129
|
+
}
|
|
130
|
+
]
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"Hash": "expression-solver",
|
|
134
|
+
"Name": "Expression Solver",
|
|
135
|
+
"Category": "core",
|
|
136
|
+
"Capability": "Data Transform",
|
|
137
|
+
"Tier": "Engine",
|
|
138
|
+
"EventInputs": [
|
|
139
|
+
{ "Name": "In" }
|
|
140
|
+
],
|
|
141
|
+
"EventOutputs": [
|
|
142
|
+
{ "Name": "Complete" }
|
|
143
|
+
],
|
|
144
|
+
"SettingsInputs": [
|
|
145
|
+
{ "Name": "Expression", "DataType": "String", "Required": true },
|
|
146
|
+
{ "Name": "Destination", "DataType": "String", "Required": false }
|
|
147
|
+
],
|
|
148
|
+
"StateOutputs": [
|
|
149
|
+
{ "Name": "Result", "DataType": "String" }
|
|
150
|
+
],
|
|
151
|
+
"Recommendations": [
|
|
152
|
+
{
|
|
153
|
+
"Type": "MissingPort",
|
|
154
|
+
"Port": "EventOutput",
|
|
155
|
+
"Name": "Error",
|
|
156
|
+
"IsError": true,
|
|
157
|
+
"Rationale": "Expression errors currently fire Complete with an empty string. An Error event would let flows branch on bad expressions rather than silently propagating empty values."
|
|
158
|
+
}
|
|
159
|
+
]
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"Hash": "parse-csv",
|
|
163
|
+
"Name": "Parse CSV",
|
|
164
|
+
"Category": "pipeline",
|
|
165
|
+
"Capability": "Data Transform",
|
|
166
|
+
"Tier": "Engine",
|
|
167
|
+
"EventInputs": [
|
|
168
|
+
{ "Name": "Execute" }
|
|
169
|
+
],
|
|
170
|
+
"EventOutputs": [
|
|
171
|
+
{ "Name": "Complete" }
|
|
172
|
+
],
|
|
173
|
+
"SettingsInputs": [
|
|
174
|
+
{ "Name": "SourceAddress", "DataType": "String", "Required": false },
|
|
175
|
+
{ "Name": "Delimiter", "DataType": "String", "Required": false },
|
|
176
|
+
{ "Name": "HasHeaders", "DataType": "Boolean", "Required": false },
|
|
177
|
+
{ "Name": "Destination", "DataType": "String", "Required": false }
|
|
178
|
+
],
|
|
179
|
+
"StateOutputs": [
|
|
180
|
+
{ "Name": "Records", "DataType": "Array" }
|
|
181
|
+
],
|
|
182
|
+
"Recommendations": [
|
|
183
|
+
{
|
|
184
|
+
"Type": "MissingSetting",
|
|
185
|
+
"Name": "QuoteCharacter",
|
|
186
|
+
"DataType": "String",
|
|
187
|
+
"Rationale": "CSV fields containing the delimiter must be quoted. The parser currently has no quote handling, so fields like '\"Smith, John\"' would be split incorrectly."
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
"Type": "MissingSetting",
|
|
191
|
+
"Name": "TrimFields",
|
|
192
|
+
"DataType": "Boolean",
|
|
193
|
+
"Rationale": "Fields are trimmed implicitly. A setting to control this is useful for whitespace-sensitive data."
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"Type": "MissingSetting",
|
|
197
|
+
"Name": "SkipEmptyLines",
|
|
198
|
+
"DataType": "Boolean",
|
|
199
|
+
"Rationale": "Empty lines are already filtered, but this should be an explicit setting."
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"Type": "MissingOutput",
|
|
203
|
+
"Name": "ColumnCount",
|
|
204
|
+
"DataType": "Number",
|
|
205
|
+
"Rationale": "Useful for validation — knowing how many columns were found."
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"Type": "MissingOutput",
|
|
209
|
+
"Name": "Headers",
|
|
210
|
+
"DataType": "Array",
|
|
211
|
+
"Rationale": "Expose the parsed header names so downstream tasks can reference them."
|
|
212
|
+
}
|
|
213
|
+
]
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
"Hash": "csv-transform",
|
|
217
|
+
"Name": "CSV Transform",
|
|
218
|
+
"Category": "pipeline",
|
|
219
|
+
"Capability": "Data Transform",
|
|
220
|
+
"Tier": "Engine",
|
|
221
|
+
"EventInputs": [
|
|
222
|
+
{ "Name": "Execute" }
|
|
223
|
+
],
|
|
224
|
+
"EventOutputs": [
|
|
225
|
+
{ "Name": "Complete" }
|
|
226
|
+
],
|
|
227
|
+
"SettingsInputs": [
|
|
228
|
+
{ "Name": "SourceAddress", "DataType": "String", "Required": false },
|
|
229
|
+
{ "Name": "Destination", "DataType": "String", "Required": false },
|
|
230
|
+
{ "Name": "Delimiter", "DataType": "String", "Required": false }
|
|
231
|
+
],
|
|
232
|
+
"StateOutputs": [
|
|
233
|
+
{ "Name": "Records", "DataType": "Array" }
|
|
234
|
+
],
|
|
235
|
+
"Recommendations": [
|
|
236
|
+
{
|
|
237
|
+
"Type": "MissingSetting",
|
|
238
|
+
"Name": "FieldMapping",
|
|
239
|
+
"DataType": "String",
|
|
240
|
+
"Rationale": "Currently a pass-through with no transformation logic. A FieldMapping (JSON: [{From, To, Template}]) would make this card actually do something."
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
"Type": "MissingSetting",
|
|
244
|
+
"Name": "FilterExpression",
|
|
245
|
+
"DataType": "String",
|
|
246
|
+
"Rationale": "Filter rows by an expression, e.g. 'Amount > 100'."
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
"Type": "MissingSetting",
|
|
250
|
+
"Name": "OutputFields",
|
|
251
|
+
"DataType": "String",
|
|
252
|
+
"Rationale": "JSON array of field names to include in output (column projection)."
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
"Type": "Observation",
|
|
256
|
+
"Rationale": "This card is currently a no-op stub. The Execute function just passes records through unchanged. Needs actual transformation logic."
|
|
257
|
+
}
|
|
258
|
+
]
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
"Hash": "comprehension-intersect",
|
|
262
|
+
"Name": "Comprehension Intersect",
|
|
263
|
+
"Category": "pipeline",
|
|
264
|
+
"Capability": "Data Transform",
|
|
265
|
+
"Tier": "Engine",
|
|
266
|
+
"EventInputs": [
|
|
267
|
+
{ "Name": "Execute" }
|
|
268
|
+
],
|
|
269
|
+
"EventOutputs": [
|
|
270
|
+
{ "Name": "Complete" }
|
|
271
|
+
],
|
|
272
|
+
"SettingsInputs": [
|
|
273
|
+
{ "Name": "SourceAddressA", "DataType": "String", "Required": true },
|
|
274
|
+
{ "Name": "SourceAddressB", "DataType": "String", "Required": true },
|
|
275
|
+
{ "Name": "MatchField", "DataType": "String", "Required": false },
|
|
276
|
+
{ "Name": "Destination", "DataType": "String", "Required": false }
|
|
277
|
+
],
|
|
278
|
+
"StateOutputs": [
|
|
279
|
+
{ "Name": "Result", "DataType": "Array" }
|
|
280
|
+
],
|
|
281
|
+
"Recommendations": [
|
|
282
|
+
{
|
|
283
|
+
"Type": "MissingSetting",
|
|
284
|
+
"Name": "JoinType",
|
|
285
|
+
"DataType": "String",
|
|
286
|
+
"Rationale": "Currently only does inner intersection. A JoinType setting ('inner', 'left', 'right', 'full') would add SQL-style join semantics."
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
"Type": "MissingOutput",
|
|
290
|
+
"Name": "MatchCount",
|
|
291
|
+
"DataType": "Number",
|
|
292
|
+
"Rationale": "How many matches were found — useful for validation."
|
|
293
|
+
}
|
|
294
|
+
]
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
"Hash": "histogram",
|
|
298
|
+
"Name": "Histogram",
|
|
299
|
+
"Category": "pipeline",
|
|
300
|
+
"Capability": "Data Transform",
|
|
301
|
+
"Tier": "Engine",
|
|
302
|
+
"EventInputs": [
|
|
303
|
+
{ "Name": "Execute" }
|
|
304
|
+
],
|
|
305
|
+
"EventOutputs": [
|
|
306
|
+
{ "Name": "Complete" }
|
|
307
|
+
],
|
|
308
|
+
"SettingsInputs": [
|
|
309
|
+
{ "Name": "SourceAddress", "DataType": "String", "Required": false },
|
|
310
|
+
{ "Name": "Field", "DataType": "String", "Required": false },
|
|
311
|
+
{ "Name": "Bins", "DataType": "Number", "Required": false },
|
|
312
|
+
{ "Name": "Destination", "DataType": "String", "Required": false }
|
|
313
|
+
],
|
|
314
|
+
"StateOutputs": [
|
|
315
|
+
{ "Name": "Stats", "DataType": "Object" }
|
|
316
|
+
],
|
|
317
|
+
"Recommendations": [
|
|
318
|
+
{
|
|
319
|
+
"Type": "Observation",
|
|
320
|
+
"Rationale": "The Bins setting is defined but never used in the execution logic. Currently just counts unique values — does not create numeric bin ranges."
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
"Type": "MissingSetting",
|
|
324
|
+
"Name": "SortBy",
|
|
325
|
+
"DataType": "String",
|
|
326
|
+
"Rationale": "Sort frequency results by 'count' (descending) or 'key' (alphabetical)."
|
|
327
|
+
}
|
|
328
|
+
]
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
"Hash": "if-conditional",
|
|
332
|
+
"Name": "If Conditional",
|
|
333
|
+
"Category": "control",
|
|
334
|
+
"Capability": "Flow Control",
|
|
335
|
+
"Tier": "Engine",
|
|
336
|
+
"EventInputs": [
|
|
337
|
+
{ "Name": "Evaluate" }
|
|
338
|
+
],
|
|
339
|
+
"EventOutputs": [
|
|
340
|
+
{ "Name": "True" },
|
|
341
|
+
{ "Name": "False" }
|
|
342
|
+
],
|
|
343
|
+
"SettingsInputs": [
|
|
344
|
+
{ "Name": "DataAddress", "DataType": "String", "Required": false },
|
|
345
|
+
{ "Name": "CompareValue", "DataType": "String", "Required": false },
|
|
346
|
+
{ "Name": "Operator", "DataType": "String", "Required": false },
|
|
347
|
+
{ "Name": "Expression", "DataType": "String", "Required": false }
|
|
348
|
+
],
|
|
349
|
+
"StateOutputs": [
|
|
350
|
+
{ "Name": "Result", "DataType": "Boolean" }
|
|
351
|
+
],
|
|
352
|
+
"Recommendations": []
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
"Hash": "split-execute",
|
|
356
|
+
"Name": "Split Execute",
|
|
357
|
+
"Category": "control",
|
|
358
|
+
"Capability": "Flow Control",
|
|
359
|
+
"Tier": "Engine",
|
|
360
|
+
"EventInputs": [
|
|
361
|
+
{ "Name": "PerformSplit" },
|
|
362
|
+
{ "Name": "StepComplete" }
|
|
363
|
+
],
|
|
364
|
+
"EventOutputs": [
|
|
365
|
+
{ "Name": "TokenDataSent" },
|
|
366
|
+
{ "Name": "CompletedAllSubtasks" },
|
|
367
|
+
{ "Name": "Error", "IsError": true }
|
|
368
|
+
],
|
|
369
|
+
"SettingsInputs": [
|
|
370
|
+
{ "Name": "InputString", "DataType": "String", "Required": true },
|
|
371
|
+
{ "Name": "SplitDelimiter", "DataType": "String", "Required": true }
|
|
372
|
+
],
|
|
373
|
+
"StateOutputs": [
|
|
374
|
+
{ "Name": "CurrentToken", "DataType": "String" },
|
|
375
|
+
{ "Name": "TokenIndex", "DataType": "Number" },
|
|
376
|
+
{ "Name": "TokenCount", "DataType": "Number" },
|
|
377
|
+
{ "Name": "CompletedCount", "DataType": "Number" }
|
|
378
|
+
],
|
|
379
|
+
"Recommendations": [
|
|
380
|
+
{
|
|
381
|
+
"Type": "MissingSetting",
|
|
382
|
+
"Name": "SkipEmpty",
|
|
383
|
+
"DataType": "Boolean",
|
|
384
|
+
"Rationale": "When splitting by newline, trailing newlines produce empty tokens that trigger needless iterations. A SkipEmpty flag would filter them out."
|
|
385
|
+
},
|
|
386
|
+
{
|
|
387
|
+
"Type": "MissingSetting",
|
|
388
|
+
"Name": "TrimTokens",
|
|
389
|
+
"DataType": "Boolean",
|
|
390
|
+
"Rationale": "Whitespace around tokens (especially from CSV or multiline text) causes subtle bugs. A TrimTokens option would strip leading/trailing whitespace from each token."
|
|
391
|
+
}
|
|
392
|
+
]
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
"Hash": "launch-operation",
|
|
396
|
+
"Name": "Launch Operation",
|
|
397
|
+
"Category": "control",
|
|
398
|
+
"Capability": "Flow Control",
|
|
399
|
+
"Tier": "Engine",
|
|
400
|
+
"EventInputs": [
|
|
401
|
+
{ "Name": "Launch" }
|
|
402
|
+
],
|
|
403
|
+
"EventOutputs": [
|
|
404
|
+
{ "Name": "Completed" },
|
|
405
|
+
{ "Name": "Error", "IsError": true }
|
|
406
|
+
],
|
|
407
|
+
"SettingsInputs": [
|
|
408
|
+
{ "Name": "OperationHash", "DataType": "String", "Required": true },
|
|
409
|
+
{ "Name": "InputData", "DataType": "String", "Required": false }
|
|
410
|
+
],
|
|
411
|
+
"StateOutputs": [
|
|
412
|
+
{ "Name": "Result", "DataType": "String" },
|
|
413
|
+
{ "Name": "Status", "DataType": "String" },
|
|
414
|
+
{ "Name": "ElapsedMs", "DataType": "Number" }
|
|
415
|
+
],
|
|
416
|
+
"Recommendations": [
|
|
417
|
+
{
|
|
418
|
+
"Type": "MissingSetting",
|
|
419
|
+
"Name": "TimeoutMs",
|
|
420
|
+
"DataType": "Number",
|
|
421
|
+
"Rationale": "Child operations can run indefinitely. A timeout prevents runaway sub-flows from hanging the parent."
|
|
422
|
+
},
|
|
423
|
+
{
|
|
424
|
+
"Type": "MissingSetting",
|
|
425
|
+
"Name": "InheritGlobalState",
|
|
426
|
+
"DataType": "Boolean",
|
|
427
|
+
"Rationale": "Currently always copies GlobalState into the child. A flag to disable this would enable fully isolated sub-operations."
|
|
428
|
+
}
|
|
429
|
+
]
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
"Hash": "read-file",
|
|
433
|
+
"Name": "Read File",
|
|
434
|
+
"Category": "file-io",
|
|
435
|
+
"Capability": "File System",
|
|
436
|
+
"Tier": "Platform",
|
|
437
|
+
"EventInputs": [
|
|
438
|
+
{ "Name": "BeginRead" }
|
|
439
|
+
],
|
|
440
|
+
"EventOutputs": [
|
|
441
|
+
{ "Name": "ReadComplete" },
|
|
442
|
+
{ "Name": "Error", "IsError": true }
|
|
443
|
+
],
|
|
444
|
+
"SettingsInputs": [
|
|
445
|
+
{ "Name": "FilePath", "DataType": "String", "Required": true },
|
|
446
|
+
{ "Name": "Encoding", "DataType": "String", "Required": false }
|
|
447
|
+
],
|
|
448
|
+
"StateOutputs": [
|
|
449
|
+
{ "Name": "FileContent", "DataType": "String" },
|
|
450
|
+
{ "Name": "BytesRead", "DataType": "Number" }
|
|
451
|
+
],
|
|
452
|
+
"Recommendations": [
|
|
453
|
+
{
|
|
454
|
+
"Type": "MissingSetting",
|
|
455
|
+
"Name": "MaxBytes",
|
|
456
|
+
"DataType": "Number",
|
|
457
|
+
"Rationale": "No size guard. Reading a multi-GB file will crash the process. A MaxBytes limit (default: 50MB) would prevent accidental OOM."
|
|
458
|
+
},
|
|
459
|
+
{
|
|
460
|
+
"Type": "MissingOutput",
|
|
461
|
+
"Name": "FileName",
|
|
462
|
+
"DataType": "String",
|
|
463
|
+
"Rationale": "write-file outputs FileName, FileLocation, and FilePath. read-file should too, for symmetry and downstream use."
|
|
464
|
+
}
|
|
465
|
+
]
|
|
466
|
+
},
|
|
467
|
+
{
|
|
468
|
+
"Hash": "write-file",
|
|
469
|
+
"Name": "Write File",
|
|
470
|
+
"Category": "file-io",
|
|
471
|
+
"Capability": "File System",
|
|
472
|
+
"Tier": "Platform",
|
|
473
|
+
"EventInputs": [
|
|
474
|
+
{ "Name": "BeginWrite" }
|
|
475
|
+
],
|
|
476
|
+
"EventOutputs": [
|
|
477
|
+
{ "Name": "WriteComplete" },
|
|
478
|
+
{ "Name": "Error", "IsError": true }
|
|
479
|
+
],
|
|
480
|
+
"SettingsInputs": [
|
|
481
|
+
{ "Name": "FilePath", "DataType": "String", "Required": true },
|
|
482
|
+
{ "Name": "Content", "DataType": "String", "Required": true },
|
|
483
|
+
{ "Name": "Encoding", "DataType": "String", "Required": false }
|
|
484
|
+
],
|
|
485
|
+
"StateOutputs": [
|
|
486
|
+
{ "Name": "FileLocation", "DataType": "String" },
|
|
487
|
+
{ "Name": "FileName", "DataType": "String" },
|
|
488
|
+
{ "Name": "FilePath", "DataType": "String" },
|
|
489
|
+
{ "Name": "BytesWritten", "DataType": "Number" }
|
|
490
|
+
],
|
|
491
|
+
"Recommendations": [
|
|
492
|
+
{
|
|
493
|
+
"Type": "MissingSetting",
|
|
494
|
+
"Name": "Append",
|
|
495
|
+
"DataType": "Boolean",
|
|
496
|
+
"Rationale": "Currently always overwrites. An Append mode would enable log-file-style accumulation without needing string-appender + write-file chains."
|
|
497
|
+
},
|
|
498
|
+
{
|
|
499
|
+
"Type": "MissingSetting",
|
|
500
|
+
"Name": "LineEnding",
|
|
501
|
+
"DataType": "String",
|
|
502
|
+
"Rationale": "No control over line endings (lf vs crlf). Important for cross-platform file generation."
|
|
503
|
+
}
|
|
504
|
+
]
|
|
505
|
+
},
|
|
506
|
+
{
|
|
507
|
+
"Hash": "read-json",
|
|
508
|
+
"Name": "Read JSON",
|
|
509
|
+
"Category": "file-io",
|
|
510
|
+
"Capability": "File System",
|
|
511
|
+
"Tier": "Platform",
|
|
512
|
+
"EventInputs": [
|
|
513
|
+
{ "Name": "Trigger" }
|
|
514
|
+
],
|
|
515
|
+
"EventOutputs": [
|
|
516
|
+
{ "Name": "Complete" },
|
|
517
|
+
{ "Name": "Error", "IsError": true }
|
|
518
|
+
],
|
|
519
|
+
"SettingsInputs": [
|
|
520
|
+
{ "Name": "File", "DataType": "String", "Required": true },
|
|
521
|
+
{ "Name": "Destination", "DataType": "String", "Required": false }
|
|
522
|
+
],
|
|
523
|
+
"StateOutputs": [
|
|
524
|
+
{ "Name": "Data", "DataType": "Object" }
|
|
525
|
+
],
|
|
526
|
+
"Recommendations": [
|
|
527
|
+
{
|
|
528
|
+
"Type": "Inconsistency",
|
|
529
|
+
"Rationale": "Setting is named 'File' but read-file and write-file use 'FilePath'. Should be consistent across the file-io category."
|
|
530
|
+
}
|
|
531
|
+
]
|
|
532
|
+
},
|
|
533
|
+
{
|
|
534
|
+
"Hash": "write-json",
|
|
535
|
+
"Name": "Write JSON",
|
|
536
|
+
"Category": "file-io",
|
|
537
|
+
"Capability": "File System",
|
|
538
|
+
"Tier": "Platform",
|
|
539
|
+
"EventInputs": [
|
|
540
|
+
{ "Name": "Trigger" }
|
|
541
|
+
],
|
|
542
|
+
"EventOutputs": [
|
|
543
|
+
{ "Name": "Done" },
|
|
544
|
+
{ "Name": "Error", "IsError": true }
|
|
545
|
+
],
|
|
546
|
+
"SettingsInputs": [
|
|
547
|
+
{ "Name": "File", "DataType": "String", "Required": true },
|
|
548
|
+
{ "Name": "Address", "DataType": "String", "Required": false }
|
|
549
|
+
],
|
|
550
|
+
"StateOutputs": [
|
|
551
|
+
{ "Name": "FileLocation", "DataType": "String" },
|
|
552
|
+
{ "Name": "FileName", "DataType": "String" },
|
|
553
|
+
{ "Name": "FilePath", "DataType": "String" },
|
|
554
|
+
{ "Name": "BytesWritten", "DataType": "Number" }
|
|
555
|
+
],
|
|
556
|
+
"Recommendations": [
|
|
557
|
+
{
|
|
558
|
+
"Type": "MissingSetting",
|
|
559
|
+
"Name": "PrettyFormat",
|
|
560
|
+
"DataType": "Boolean",
|
|
561
|
+
"Rationale": "Currently always pretty-prints with tabs. A PrettyFormat=false option would output minified JSON for smaller files."
|
|
562
|
+
},
|
|
563
|
+
{
|
|
564
|
+
"Type": "MissingSetting",
|
|
565
|
+
"Name": "IndentType",
|
|
566
|
+
"DataType": "String",
|
|
567
|
+
"Rationale": "Hardcoded to tab indentation. Should support 'tab' or 'spaces' to match project conventions."
|
|
568
|
+
},
|
|
569
|
+
{
|
|
570
|
+
"Type": "MissingSetting",
|
|
571
|
+
"Name": "IndentCount",
|
|
572
|
+
"DataType": "Number",
|
|
573
|
+
"Rationale": "When IndentType is 'spaces', how many? Common values: 2 or 4."
|
|
574
|
+
},
|
|
575
|
+
{
|
|
576
|
+
"Type": "MissingSetting",
|
|
577
|
+
"Name": "SortKeys",
|
|
578
|
+
"DataType": "Boolean",
|
|
579
|
+
"Rationale": "Alphabetically sort object keys in output. Useful for deterministic/diff-friendly JSON."
|
|
580
|
+
},
|
|
581
|
+
{
|
|
582
|
+
"Type": "Inconsistency",
|
|
583
|
+
"Rationale": "Setting is named 'File' (not 'FilePath') and 'Address' (not 'DataAddress'). Inconsistent with other file-io and meadow cards."
|
|
584
|
+
},
|
|
585
|
+
{
|
|
586
|
+
"Type": "Inconsistency",
|
|
587
|
+
"Rationale": "Event output is 'Done' but most cards use 'Complete' or 'WriteComplete'. Inconsistent."
|
|
588
|
+
}
|
|
589
|
+
]
|
|
590
|
+
},
|
|
591
|
+
{
|
|
592
|
+
"Hash": "list-files",
|
|
593
|
+
"Name": "List Files",
|
|
594
|
+
"Category": "file-io",
|
|
595
|
+
"Capability": "File System",
|
|
596
|
+
"Tier": "Platform",
|
|
597
|
+
"EventInputs": [
|
|
598
|
+
{ "Name": "Trigger" }
|
|
599
|
+
],
|
|
600
|
+
"EventOutputs": [
|
|
601
|
+
{ "Name": "Complete" },
|
|
602
|
+
{ "Name": "Error", "IsError": true }
|
|
603
|
+
],
|
|
604
|
+
"SettingsInputs": [
|
|
605
|
+
{ "Name": "Folder", "DataType": "String", "Required": true },
|
|
606
|
+
{ "Name": "Pattern", "DataType": "String", "Required": false },
|
|
607
|
+
{ "Name": "Destination", "DataType": "String", "Required": false }
|
|
608
|
+
],
|
|
609
|
+
"StateOutputs": [
|
|
610
|
+
{ "Name": "Files", "DataType": "Array" }
|
|
611
|
+
],
|
|
612
|
+
"Recommendations": [
|
|
613
|
+
{
|
|
614
|
+
"Type": "MissingSetting",
|
|
615
|
+
"Name": "Recursive",
|
|
616
|
+
"DataType": "Boolean",
|
|
617
|
+
"Rationale": "Currently only lists the immediate directory. Recursive listing is a common need for tree-walking workflows."
|
|
618
|
+
},
|
|
619
|
+
{
|
|
620
|
+
"Type": "MissingSetting",
|
|
621
|
+
"Name": "IncludeDirectories",
|
|
622
|
+
"DataType": "Boolean",
|
|
623
|
+
"Rationale": "readdirSync returns both files and directories. A flag to control whether dirs appear in the output."
|
|
624
|
+
},
|
|
625
|
+
{
|
|
626
|
+
"Type": "MissingOutput",
|
|
627
|
+
"Name": "FileCount",
|
|
628
|
+
"DataType": "Number",
|
|
629
|
+
"Rationale": "Expose the count as a typed output for easy conditional branching."
|
|
630
|
+
}
|
|
631
|
+
]
|
|
632
|
+
},
|
|
633
|
+
{
|
|
634
|
+
"Hash": "copy-file",
|
|
635
|
+
"Name": "Copy File",
|
|
636
|
+
"Category": "file-io",
|
|
637
|
+
"Capability": "File System",
|
|
638
|
+
"Tier": "Platform",
|
|
639
|
+
"EventInputs": [
|
|
640
|
+
{ "Name": "Trigger" }
|
|
641
|
+
],
|
|
642
|
+
"EventOutputs": [
|
|
643
|
+
{ "Name": "Done" },
|
|
644
|
+
{ "Name": "Error", "IsError": true }
|
|
645
|
+
],
|
|
646
|
+
"SettingsInputs": [
|
|
647
|
+
{ "Name": "Source", "DataType": "String", "Required": true },
|
|
648
|
+
{ "Name": "TargetFile", "DataType": "String", "Required": true }
|
|
649
|
+
],
|
|
650
|
+
"StateOutputs": [
|
|
651
|
+
{ "Name": "FileLocation", "DataType": "String" },
|
|
652
|
+
{ "Name": "FileName", "DataType": "String" },
|
|
653
|
+
{ "Name": "FilePath", "DataType": "String" }
|
|
654
|
+
],
|
|
655
|
+
"Recommendations": [
|
|
656
|
+
{
|
|
657
|
+
"Type": "MissingSetting",
|
|
658
|
+
"Name": "Overwrite",
|
|
659
|
+
"DataType": "Boolean",
|
|
660
|
+
"Rationale": "Currently always overwrites. A guard against accidental overwrites of important files."
|
|
661
|
+
},
|
|
662
|
+
{
|
|
663
|
+
"Type": "MissingOutput",
|
|
664
|
+
"Name": "BytesCopied",
|
|
665
|
+
"DataType": "Number",
|
|
666
|
+
"Rationale": "write-file and read-file report byte counts. copy-file should too."
|
|
667
|
+
},
|
|
668
|
+
{
|
|
669
|
+
"Type": "Inconsistency",
|
|
670
|
+
"Rationale": "Event output is 'Done' — inconsistent with write-file's 'WriteComplete'."
|
|
671
|
+
}
|
|
672
|
+
]
|
|
673
|
+
},
|
|
674
|
+
{
|
|
675
|
+
"Hash": "get-json",
|
|
676
|
+
"Name": "Get JSON",
|
|
677
|
+
"Category": "rest",
|
|
678
|
+
"Capability": "HTTP Client",
|
|
679
|
+
"Tier": "Platform",
|
|
680
|
+
"EventInputs": [
|
|
681
|
+
{ "Name": "Trigger" }
|
|
682
|
+
],
|
|
683
|
+
"EventOutputs": [
|
|
684
|
+
{ "Name": "Complete" },
|
|
685
|
+
{ "Name": "Error", "IsError": true }
|
|
686
|
+
],
|
|
687
|
+
"SettingsInputs": [
|
|
688
|
+
{ "Name": "URL", "DataType": "String", "Required": true },
|
|
689
|
+
{ "Name": "Headers", "DataType": "String", "Required": false },
|
|
690
|
+
{ "Name": "Destination", "DataType": "String", "Required": false }
|
|
691
|
+
],
|
|
692
|
+
"StateOutputs": [
|
|
693
|
+
{ "Name": "Data", "DataType": "Object" }
|
|
694
|
+
],
|
|
695
|
+
"Recommendations": [
|
|
696
|
+
{
|
|
697
|
+
"Type": "MissingSetting",
|
|
698
|
+
"Name": "TimeoutMs",
|
|
699
|
+
"DataType": "Number",
|
|
700
|
+
"Rationale": "No request timeout. A hung remote server blocks the flow indefinitely."
|
|
701
|
+
},
|
|
702
|
+
{
|
|
703
|
+
"Type": "MissingOutput",
|
|
704
|
+
"Name": "StatusCode",
|
|
705
|
+
"DataType": "Number",
|
|
706
|
+
"Rationale": "The HTTP status code is available but not exposed. Needed for conditional logic on 404s, 401s, etc."
|
|
707
|
+
}
|
|
708
|
+
]
|
|
709
|
+
},
|
|
710
|
+
{
|
|
711
|
+
"Hash": "get-text",
|
|
712
|
+
"Name": "Get Text",
|
|
713
|
+
"Category": "rest",
|
|
714
|
+
"Capability": "HTTP Client",
|
|
715
|
+
"Tier": "Platform",
|
|
716
|
+
"EventInputs": [
|
|
717
|
+
{ "Name": "Trigger" }
|
|
718
|
+
],
|
|
719
|
+
"EventOutputs": [
|
|
720
|
+
{ "Name": "Complete" },
|
|
721
|
+
{ "Name": "Error", "IsError": true }
|
|
722
|
+
],
|
|
723
|
+
"SettingsInputs": [
|
|
724
|
+
{ "Name": "URL", "DataType": "String", "Required": true },
|
|
725
|
+
{ "Name": "Destination", "DataType": "String", "Required": false }
|
|
726
|
+
],
|
|
727
|
+
"StateOutputs": [
|
|
728
|
+
{ "Name": "Data", "DataType": "String" }
|
|
729
|
+
],
|
|
730
|
+
"Recommendations": [
|
|
731
|
+
{
|
|
732
|
+
"Type": "MissingSetting",
|
|
733
|
+
"Name": "Headers",
|
|
734
|
+
"DataType": "String",
|
|
735
|
+
"Priority": "HIGH",
|
|
736
|
+
"Rationale": "get-json has Headers but get-text does not. This is a clear omission — many text endpoints require auth headers or Accept headers."
|
|
737
|
+
},
|
|
738
|
+
{
|
|
739
|
+
"Type": "MissingSetting",
|
|
740
|
+
"Name": "TimeoutMs",
|
|
741
|
+
"DataType": "Number",
|
|
742
|
+
"Rationale": "Same as get-json — no timeout guard."
|
|
743
|
+
},
|
|
744
|
+
{
|
|
745
|
+
"Type": "MissingOutput",
|
|
746
|
+
"Name": "StatusCode",
|
|
747
|
+
"DataType": "Number",
|
|
748
|
+
"Rationale": "Same as get-json."
|
|
749
|
+
}
|
|
750
|
+
]
|
|
751
|
+
},
|
|
752
|
+
{
|
|
753
|
+
"Hash": "send-json",
|
|
754
|
+
"Name": "Send JSON",
|
|
755
|
+
"Category": "rest",
|
|
756
|
+
"Capability": "HTTP Client",
|
|
757
|
+
"Tier": "Platform",
|
|
758
|
+
"EventInputs": [
|
|
759
|
+
{ "Name": "Trigger" }
|
|
760
|
+
],
|
|
761
|
+
"EventOutputs": [
|
|
762
|
+
{ "Name": "Complete" },
|
|
763
|
+
{ "Name": "Error", "IsError": true }
|
|
764
|
+
],
|
|
765
|
+
"SettingsInputs": [
|
|
766
|
+
{ "Name": "URL", "DataType": "String", "Required": true },
|
|
767
|
+
{ "Name": "Method", "DataType": "String", "Required": false },
|
|
768
|
+
{ "Name": "Address", "DataType": "String", "Required": false },
|
|
769
|
+
{ "Name": "Headers", "DataType": "String", "Required": false },
|
|
770
|
+
{ "Name": "Destination", "DataType": "String", "Required": false }
|
|
771
|
+
],
|
|
772
|
+
"StateOutputs": [
|
|
773
|
+
{ "Name": "Response", "DataType": "Object" }
|
|
774
|
+
],
|
|
775
|
+
"Recommendations": [
|
|
776
|
+
{
|
|
777
|
+
"Type": "MissingSetting",
|
|
778
|
+
"Name": "TimeoutMs",
|
|
779
|
+
"DataType": "Number",
|
|
780
|
+
"Rationale": "No request timeout."
|
|
781
|
+
},
|
|
782
|
+
{
|
|
783
|
+
"Type": "MissingOutput",
|
|
784
|
+
"Name": "StatusCode",
|
|
785
|
+
"DataType": "Number",
|
|
786
|
+
"Rationale": "HTTP status code not exposed."
|
|
787
|
+
},
|
|
788
|
+
{
|
|
789
|
+
"Type": "Inconsistency",
|
|
790
|
+
"Rationale": "Uses 'Address' for the data source but meadow cards use 'DataAddress'. Should be consistent."
|
|
791
|
+
}
|
|
792
|
+
]
|
|
793
|
+
},
|
|
794
|
+
{
|
|
795
|
+
"Hash": "rest-request",
|
|
796
|
+
"Name": "REST Request",
|
|
797
|
+
"Category": "rest",
|
|
798
|
+
"Capability": "HTTP Client",
|
|
799
|
+
"Tier": "Platform",
|
|
800
|
+
"EventInputs": [
|
|
801
|
+
{ "Name": "In" }
|
|
802
|
+
],
|
|
803
|
+
"EventOutputs": [
|
|
804
|
+
{ "Name": "Complete" },
|
|
805
|
+
{ "Name": "Error", "IsError": true }
|
|
806
|
+
],
|
|
807
|
+
"SettingsInputs": [
|
|
808
|
+
{ "Name": "URL", "DataType": "String", "Required": true },
|
|
809
|
+
{ "Name": "Method", "DataType": "String", "Required": false },
|
|
810
|
+
{ "Name": "ContentType", "DataType": "String", "Required": false },
|
|
811
|
+
{ "Name": "Headers", "DataType": "String", "Required": false },
|
|
812
|
+
{ "Name": "Body", "DataType": "String", "Required": false },
|
|
813
|
+
{ "Name": "Destination", "DataType": "String", "Required": false },
|
|
814
|
+
{ "Name": "Retries", "DataType": "Number", "Required": false }
|
|
815
|
+
],
|
|
816
|
+
"StateOutputs": [
|
|
817
|
+
{ "Name": "Response", "DataType": "Object" }
|
|
818
|
+
],
|
|
819
|
+
"Recommendations": [
|
|
820
|
+
{
|
|
821
|
+
"Type": "MissingSetting",
|
|
822
|
+
"Name": "TimeoutMs",
|
|
823
|
+
"DataType": "Number",
|
|
824
|
+
"Rationale": "The most configurable HTTP card and it still has no timeout setting."
|
|
825
|
+
},
|
|
826
|
+
{
|
|
827
|
+
"Type": "MissingSetting",
|
|
828
|
+
"Name": "RetryDelayMs",
|
|
829
|
+
"DataType": "Number",
|
|
830
|
+
"Rationale": "Retries setting exists but no delay between retries. Without delay, retries against rate-limited APIs will all fail."
|
|
831
|
+
},
|
|
832
|
+
{
|
|
833
|
+
"Type": "MissingOutput",
|
|
834
|
+
"Name": "StatusCode",
|
|
835
|
+
"DataType": "Number",
|
|
836
|
+
"Rationale": "The response object is available but the status code isn't broken out as a discrete output."
|
|
837
|
+
},
|
|
838
|
+
{
|
|
839
|
+
"Type": "MissingOutput",
|
|
840
|
+
"Name": "ResponseHeaders",
|
|
841
|
+
"DataType": "String",
|
|
842
|
+
"Rationale": "Response headers (especially pagination, rate-limit, location) are not exposed."
|
|
843
|
+
},
|
|
844
|
+
{
|
|
845
|
+
"Type": "Observation",
|
|
846
|
+
"Rationale": "Retries setting is defined but the Execute function never implements retry logic. It makes a single request."
|
|
847
|
+
}
|
|
848
|
+
]
|
|
849
|
+
},
|
|
850
|
+
{
|
|
851
|
+
"Hash": "command",
|
|
852
|
+
"Name": "Command",
|
|
853
|
+
"Category": "control",
|
|
854
|
+
"Capability": "Shell",
|
|
855
|
+
"Tier": "Platform",
|
|
856
|
+
"EventInputs": [
|
|
857
|
+
{ "Name": "Trigger" }
|
|
858
|
+
],
|
|
859
|
+
"EventOutputs": [
|
|
860
|
+
{ "Name": "Complete" },
|
|
861
|
+
{ "Name": "Error", "IsError": true }
|
|
862
|
+
],
|
|
863
|
+
"SettingsInputs": [
|
|
864
|
+
{ "Name": "Command", "DataType": "String", "Required": true },
|
|
865
|
+
{ "Name": "Parameters", "DataType": "String", "Required": false },
|
|
866
|
+
{ "Name": "Description", "DataType": "String", "Required": false }
|
|
867
|
+
],
|
|
868
|
+
"StateOutputs": [
|
|
869
|
+
{ "Name": "StdOut", "DataType": "String" },
|
|
870
|
+
{ "Name": "ExitCode", "DataType": "Number" }
|
|
871
|
+
],
|
|
872
|
+
"Recommendations": [
|
|
873
|
+
{
|
|
874
|
+
"Type": "MissingSetting",
|
|
875
|
+
"Name": "WorkingDirectory",
|
|
876
|
+
"DataType": "String",
|
|
877
|
+
"Rationale": "Currently uses StagingPath or cwd. A WorkingDirectory override would let commands run in arbitrary locations."
|
|
878
|
+
},
|
|
879
|
+
{
|
|
880
|
+
"Type": "MissingSetting",
|
|
881
|
+
"Name": "TimeoutMs",
|
|
882
|
+
"DataType": "Number",
|
|
883
|
+
"Rationale": "Hardcoded to 300000ms (5 min). Should be configurable per command — some are quick, some are long."
|
|
884
|
+
},
|
|
885
|
+
{
|
|
886
|
+
"Type": "MissingSetting",
|
|
887
|
+
"Name": "Environment",
|
|
888
|
+
"DataType": "String",
|
|
889
|
+
"Rationale": "JSON object of environment variables to set. Needed for passing API keys, config paths, etc."
|
|
890
|
+
},
|
|
891
|
+
{
|
|
892
|
+
"Type": "MissingOutput",
|
|
893
|
+
"Name": "StdErr",
|
|
894
|
+
"DataType": "String",
|
|
895
|
+
"Rationale": "StdErr is currently concatenated into StdOut on error. It should be a separate output for proper error handling."
|
|
896
|
+
}
|
|
897
|
+
]
|
|
898
|
+
},
|
|
899
|
+
{
|
|
900
|
+
"Hash": "error-message",
|
|
901
|
+
"Name": "Error Message",
|
|
902
|
+
"Category": "interaction",
|
|
903
|
+
"Capability": "User Interaction",
|
|
904
|
+
"Tier": "Platform",
|
|
905
|
+
"EventInputs": [
|
|
906
|
+
{ "Name": "Trigger" }
|
|
907
|
+
],
|
|
908
|
+
"EventOutputs": [
|
|
909
|
+
{ "Name": "Complete" }
|
|
910
|
+
],
|
|
911
|
+
"SettingsInputs": [
|
|
912
|
+
{ "Name": "MessageTemplate", "DataType": "String", "Required": true }
|
|
913
|
+
],
|
|
914
|
+
"StateOutputs": [],
|
|
915
|
+
"Recommendations": [
|
|
916
|
+
{
|
|
917
|
+
"Type": "MissingSetting",
|
|
918
|
+
"Name": "Level",
|
|
919
|
+
"DataType": "String",
|
|
920
|
+
"Rationale": "Always logs as error. A Level setting ('error', 'warning', 'info', 'debug') would make this a general-purpose logging card."
|
|
921
|
+
}
|
|
922
|
+
]
|
|
923
|
+
},
|
|
924
|
+
{
|
|
925
|
+
"Hash": "value-input",
|
|
926
|
+
"Name": "Value Input",
|
|
927
|
+
"Category": "interaction",
|
|
928
|
+
"Capability": "User Interaction",
|
|
929
|
+
"Tier": "Platform",
|
|
930
|
+
"EventInputs": [
|
|
931
|
+
{ "Name": "RequestInput" }
|
|
932
|
+
],
|
|
933
|
+
"EventOutputs": [
|
|
934
|
+
{ "Name": "ValueInputComplete" }
|
|
935
|
+
],
|
|
936
|
+
"SettingsInputs": [
|
|
937
|
+
{ "Name": "PromptMessage", "DataType": "String", "Required": false },
|
|
938
|
+
{ "Name": "OutputAddress", "DataType": "String", "Required": true }
|
|
939
|
+
],
|
|
940
|
+
"StateOutputs": [
|
|
941
|
+
{ "Name": "InputValue", "DataType": "String" }
|
|
942
|
+
],
|
|
943
|
+
"Recommendations": [
|
|
944
|
+
{
|
|
945
|
+
"Type": "MissingSetting",
|
|
946
|
+
"Name": "InputType",
|
|
947
|
+
"DataType": "String",
|
|
948
|
+
"Rationale": "Support 'text', 'number', 'boolean', 'select' to provide appropriate UI input controls."
|
|
949
|
+
},
|
|
950
|
+
{
|
|
951
|
+
"Type": "MissingSetting",
|
|
952
|
+
"Name": "DefaultValue",
|
|
953
|
+
"DataType": "String",
|
|
954
|
+
"Rationale": "Pre-fill the input field so users can just confirm common values."
|
|
955
|
+
},
|
|
956
|
+
{
|
|
957
|
+
"Type": "MissingSetting",
|
|
958
|
+
"Name": "Options",
|
|
959
|
+
"DataType": "String",
|
|
960
|
+
"Rationale": "JSON array of allowed values when InputType is 'select'. Renders as a dropdown."
|
|
961
|
+
},
|
|
962
|
+
{
|
|
963
|
+
"Type": "MissingPort",
|
|
964
|
+
"Port": "EventOutput",
|
|
965
|
+
"Name": "Cancelled",
|
|
966
|
+
"Rationale": "No way for the user to cancel/abort the input. A Cancel event output would let flows handle user abandonment."
|
|
967
|
+
}
|
|
968
|
+
]
|
|
969
|
+
},
|
|
970
|
+
{
|
|
971
|
+
"Hash": "meadow-read",
|
|
972
|
+
"Name": "Meadow Read",
|
|
973
|
+
"Category": "meadow",
|
|
974
|
+
"Capability": "Meadow API",
|
|
975
|
+
"Tier": "Service",
|
|
976
|
+
"EventInputs": [
|
|
977
|
+
{ "Name": "Trigger" }
|
|
978
|
+
],
|
|
979
|
+
"EventOutputs": [
|
|
980
|
+
{ "Name": "Complete" },
|
|
981
|
+
{ "Name": "Error", "IsError": true }
|
|
982
|
+
],
|
|
983
|
+
"SettingsInputs": [
|
|
984
|
+
{ "Name": "Entity", "DataType": "String", "Required": true },
|
|
985
|
+
{ "Name": "Endpoint", "DataType": "String", "Required": true },
|
|
986
|
+
{ "Name": "RecordID", "DataType": "String", "Required": true },
|
|
987
|
+
{ "Name": "Destination", "DataType": "String", "Required": false }
|
|
988
|
+
],
|
|
989
|
+
"StateOutputs": [
|
|
990
|
+
{ "Name": "Record", "DataType": "Object" }
|
|
991
|
+
],
|
|
992
|
+
"Recommendations": [
|
|
993
|
+
{
|
|
994
|
+
"Type": "MissingSetting",
|
|
995
|
+
"Name": "Headers",
|
|
996
|
+
"DataType": "String",
|
|
997
|
+
"Rationale": "No way to send auth tokens or custom headers to the Meadow API."
|
|
998
|
+
}
|
|
999
|
+
]
|
|
1000
|
+
},
|
|
1001
|
+
{
|
|
1002
|
+
"Hash": "meadow-reads",
|
|
1003
|
+
"Name": "Meadow Reads",
|
|
1004
|
+
"Category": "meadow",
|
|
1005
|
+
"Capability": "Meadow API",
|
|
1006
|
+
"Tier": "Service",
|
|
1007
|
+
"EventInputs": [
|
|
1008
|
+
{ "Name": "Trigger" }
|
|
1009
|
+
],
|
|
1010
|
+
"EventOutputs": [
|
|
1011
|
+
{ "Name": "Complete" },
|
|
1012
|
+
{ "Name": "Error", "IsError": true }
|
|
1013
|
+
],
|
|
1014
|
+
"SettingsInputs": [
|
|
1015
|
+
{ "Name": "Entity", "DataType": "String", "Required": true },
|
|
1016
|
+
{ "Name": "Endpoint", "DataType": "String", "Required": true },
|
|
1017
|
+
{ "Name": "Filter", "DataType": "String", "Required": false },
|
|
1018
|
+
{ "Name": "Destination", "DataType": "String", "Required": false }
|
|
1019
|
+
],
|
|
1020
|
+
"StateOutputs": [
|
|
1021
|
+
{ "Name": "Records", "DataType": "Array" }
|
|
1022
|
+
],
|
|
1023
|
+
"Recommendations": [
|
|
1024
|
+
{
|
|
1025
|
+
"Type": "MissingSetting",
|
|
1026
|
+
"Name": "Headers",
|
|
1027
|
+
"DataType": "String",
|
|
1028
|
+
"Rationale": "No auth header support."
|
|
1029
|
+
},
|
|
1030
|
+
{
|
|
1031
|
+
"Type": "MissingSetting",
|
|
1032
|
+
"Name": "PageSize",
|
|
1033
|
+
"DataType": "Number",
|
|
1034
|
+
"Rationale": "Hardcoded to 100 records. Should be configurable."
|
|
1035
|
+
},
|
|
1036
|
+
{
|
|
1037
|
+
"Type": "MissingSetting",
|
|
1038
|
+
"Name": "PageNumber",
|
|
1039
|
+
"DataType": "Number",
|
|
1040
|
+
"Rationale": "Always fetches page 0. Can't paginate through large datasets."
|
|
1041
|
+
},
|
|
1042
|
+
{
|
|
1043
|
+
"Type": "MissingOutput",
|
|
1044
|
+
"Name": "RecordCount",
|
|
1045
|
+
"DataType": "Number",
|
|
1046
|
+
"Rationale": "Expose the count for downstream branching (e.g., 'if no records found')."
|
|
1047
|
+
}
|
|
1048
|
+
]
|
|
1049
|
+
},
|
|
1050
|
+
{
|
|
1051
|
+
"Hash": "meadow-create",
|
|
1052
|
+
"Name": "Meadow Create",
|
|
1053
|
+
"Category": "meadow",
|
|
1054
|
+
"Capability": "Meadow API",
|
|
1055
|
+
"Tier": "Service",
|
|
1056
|
+
"EventInputs": [
|
|
1057
|
+
{ "Name": "Trigger" }
|
|
1058
|
+
],
|
|
1059
|
+
"EventOutputs": [
|
|
1060
|
+
{ "Name": "Complete" },
|
|
1061
|
+
{ "Name": "Error", "IsError": true }
|
|
1062
|
+
],
|
|
1063
|
+
"SettingsInputs": [
|
|
1064
|
+
{ "Name": "Entity", "DataType": "String", "Required": true },
|
|
1065
|
+
{ "Name": "Endpoint", "DataType": "String", "Required": true },
|
|
1066
|
+
{ "Name": "DataAddress", "DataType": "String", "Required": false }
|
|
1067
|
+
],
|
|
1068
|
+
"StateOutputs": [
|
|
1069
|
+
{ "Name": "Created", "DataType": "Object" }
|
|
1070
|
+
],
|
|
1071
|
+
"Recommendations": [
|
|
1072
|
+
{
|
|
1073
|
+
"Type": "MissingSetting",
|
|
1074
|
+
"Name": "Destination",
|
|
1075
|
+
"DataType": "String",
|
|
1076
|
+
"Priority": "HIGH",
|
|
1077
|
+
"Rationale": "No way to write the created record to a state address. Every other card that returns data has a Destination setting. This is a clear omission."
|
|
1078
|
+
},
|
|
1079
|
+
{
|
|
1080
|
+
"Type": "MissingSetting",
|
|
1081
|
+
"Name": "Headers",
|
|
1082
|
+
"DataType": "String",
|
|
1083
|
+
"Rationale": "No auth header support."
|
|
1084
|
+
}
|
|
1085
|
+
]
|
|
1086
|
+
},
|
|
1087
|
+
{
|
|
1088
|
+
"Hash": "meadow-update",
|
|
1089
|
+
"Name": "Meadow Update",
|
|
1090
|
+
"Category": "meadow",
|
|
1091
|
+
"Capability": "Meadow API",
|
|
1092
|
+
"Tier": "Service",
|
|
1093
|
+
"EventInputs": [
|
|
1094
|
+
{ "Name": "Trigger" }
|
|
1095
|
+
],
|
|
1096
|
+
"EventOutputs": [
|
|
1097
|
+
{ "Name": "Complete" },
|
|
1098
|
+
{ "Name": "Error", "IsError": true }
|
|
1099
|
+
],
|
|
1100
|
+
"SettingsInputs": [
|
|
1101
|
+
{ "Name": "Entity", "DataType": "String", "Required": true },
|
|
1102
|
+
{ "Name": "Endpoint", "DataType": "String", "Required": true },
|
|
1103
|
+
{ "Name": "DataAddress", "DataType": "String", "Required": false }
|
|
1104
|
+
],
|
|
1105
|
+
"StateOutputs": [
|
|
1106
|
+
{ "Name": "Updated", "DataType": "Object" }
|
|
1107
|
+
],
|
|
1108
|
+
"Recommendations": [
|
|
1109
|
+
{
|
|
1110
|
+
"Type": "MissingSetting",
|
|
1111
|
+
"Name": "Destination",
|
|
1112
|
+
"DataType": "String",
|
|
1113
|
+
"Priority": "HIGH",
|
|
1114
|
+
"Rationale": "Same as meadow-create: no way to store the updated record to a state address."
|
|
1115
|
+
},
|
|
1116
|
+
{
|
|
1117
|
+
"Type": "MissingSetting",
|
|
1118
|
+
"Name": "Headers",
|
|
1119
|
+
"DataType": "String",
|
|
1120
|
+
"Rationale": "No auth header support."
|
|
1121
|
+
}
|
|
1122
|
+
]
|
|
1123
|
+
},
|
|
1124
|
+
{
|
|
1125
|
+
"Hash": "meadow-delete",
|
|
1126
|
+
"Name": "Meadow Delete",
|
|
1127
|
+
"Category": "meadow",
|
|
1128
|
+
"Capability": "Meadow API",
|
|
1129
|
+
"Tier": "Service",
|
|
1130
|
+
"EventInputs": [
|
|
1131
|
+
{ "Name": "Trigger" }
|
|
1132
|
+
],
|
|
1133
|
+
"EventOutputs": [
|
|
1134
|
+
{ "Name": "Done" },
|
|
1135
|
+
{ "Name": "Error", "IsError": true }
|
|
1136
|
+
],
|
|
1137
|
+
"SettingsInputs": [
|
|
1138
|
+
{ "Name": "Entity", "DataType": "String", "Required": true },
|
|
1139
|
+
{ "Name": "Endpoint", "DataType": "String", "Required": true },
|
|
1140
|
+
{ "Name": "RecordID", "DataType": "String", "Required": true }
|
|
1141
|
+
],
|
|
1142
|
+
"StateOutputs": [],
|
|
1143
|
+
"Recommendations": [
|
|
1144
|
+
{
|
|
1145
|
+
"Type": "MissingSetting",
|
|
1146
|
+
"Name": "Headers",
|
|
1147
|
+
"DataType": "String",
|
|
1148
|
+
"Rationale": "No auth header support."
|
|
1149
|
+
},
|
|
1150
|
+
{
|
|
1151
|
+
"Type": "Inconsistency",
|
|
1152
|
+
"Rationale": "Event output is 'Done' while most meadow cards use 'Complete'."
|
|
1153
|
+
}
|
|
1154
|
+
]
|
|
1155
|
+
},
|
|
1156
|
+
{
|
|
1157
|
+
"Hash": "meadow-count",
|
|
1158
|
+
"Name": "Meadow Count",
|
|
1159
|
+
"Category": "meadow",
|
|
1160
|
+
"Capability": "Meadow API",
|
|
1161
|
+
"Tier": "Service",
|
|
1162
|
+
"EventInputs": [
|
|
1163
|
+
{ "Name": "Trigger" }
|
|
1164
|
+
],
|
|
1165
|
+
"EventOutputs": [
|
|
1166
|
+
{ "Name": "Complete" },
|
|
1167
|
+
{ "Name": "Error", "IsError": true }
|
|
1168
|
+
],
|
|
1169
|
+
"SettingsInputs": [
|
|
1170
|
+
{ "Name": "Entity", "DataType": "String", "Required": true },
|
|
1171
|
+
{ "Name": "Endpoint", "DataType": "String", "Required": true },
|
|
1172
|
+
{ "Name": "Destination", "DataType": "String", "Required": false }
|
|
1173
|
+
],
|
|
1174
|
+
"StateOutputs": [
|
|
1175
|
+
{ "Name": "Count", "DataType": "Number" }
|
|
1176
|
+
],
|
|
1177
|
+
"Recommendations": [
|
|
1178
|
+
{
|
|
1179
|
+
"Type": "MissingSetting",
|
|
1180
|
+
"Name": "Filter",
|
|
1181
|
+
"DataType": "String",
|
|
1182
|
+
"Priority": "HIGH",
|
|
1183
|
+
"Rationale": "meadow-reads has a Filter setting but meadow-count does not. You can't count a filtered subset, only the total. This defeats the purpose for most use cases."
|
|
1184
|
+
},
|
|
1185
|
+
{
|
|
1186
|
+
"Type": "MissingSetting",
|
|
1187
|
+
"Name": "Headers",
|
|
1188
|
+
"DataType": "String",
|
|
1189
|
+
"Rationale": "No auth header support."
|
|
1190
|
+
}
|
|
1191
|
+
]
|
|
1192
|
+
},
|
|
1193
|
+
{
|
|
1194
|
+
"Hash": "llm-chat-completion",
|
|
1195
|
+
"Name": "LLM Chat Completion",
|
|
1196
|
+
"Category": "llm",
|
|
1197
|
+
"Capability": "LLM",
|
|
1198
|
+
"Tier": "Extension",
|
|
1199
|
+
"EventInputs": [
|
|
1200
|
+
{ "Name": "Trigger" }
|
|
1201
|
+
],
|
|
1202
|
+
"EventOutputs": [
|
|
1203
|
+
{ "Name": "Complete" },
|
|
1204
|
+
{ "Name": "Error", "IsError": true }
|
|
1205
|
+
],
|
|
1206
|
+
"SettingsInputs": [
|
|
1207
|
+
{ "Name": "SystemPrompt", "DataType": "String", "Required": false },
|
|
1208
|
+
{ "Name": "UserPrompt", "DataType": "String", "Required": false },
|
|
1209
|
+
{ "Name": "Messages", "DataType": "String", "Required": false },
|
|
1210
|
+
{ "Name": "Model", "DataType": "String", "Required": false },
|
|
1211
|
+
{ "Name": "Temperature", "DataType": "Number", "Required": false },
|
|
1212
|
+
{ "Name": "MaxTokens", "DataType": "Number", "Required": false },
|
|
1213
|
+
{ "Name": "TopP", "DataType": "Number", "Required": false },
|
|
1214
|
+
{ "Name": "StopSequences", "DataType": "String", "Required": false },
|
|
1215
|
+
{ "Name": "ResponseFormat", "DataType": "String", "Required": false },
|
|
1216
|
+
{ "Name": "ConversationAddress", "DataType": "String", "Required": false },
|
|
1217
|
+
{ "Name": "AppendToConversation", "DataType": "String", "Required": false },
|
|
1218
|
+
{ "Name": "ConversationMaxMessages", "DataType": "Number", "Required": false },
|
|
1219
|
+
{ "Name": "ConversationMaxTokens", "DataType": "Number", "Required": false },
|
|
1220
|
+
{ "Name": "PersistConversation", "DataType": "String", "Required": false },
|
|
1221
|
+
{ "Name": "ConversationPersistAddress", "DataType": "String", "Required": false },
|
|
1222
|
+
{ "Name": "InputAddress", "DataType": "String", "Required": false },
|
|
1223
|
+
{ "Name": "Destination", "DataType": "String", "Required": false },
|
|
1224
|
+
{ "Name": "AffinityKey", "DataType": "String", "Required": false },
|
|
1225
|
+
{ "Name": "TimeoutMs", "DataType": "Number", "Required": false }
|
|
1226
|
+
],
|
|
1227
|
+
"StateOutputs": [
|
|
1228
|
+
{ "Name": "Content", "DataType": "String" },
|
|
1229
|
+
{ "Name": "Model", "DataType": "String" },
|
|
1230
|
+
{ "Name": "PromptTokens", "DataType": "Number" },
|
|
1231
|
+
{ "Name": "CompletionTokens", "DataType": "Number" },
|
|
1232
|
+
{ "Name": "FinishReason", "DataType": "String" },
|
|
1233
|
+
{ "Name": "BeaconID", "DataType": "String" }
|
|
1234
|
+
],
|
|
1235
|
+
"Recommendations": [
|
|
1236
|
+
{
|
|
1237
|
+
"Type": "MissingOutput",
|
|
1238
|
+
"Name": "TotalTokens",
|
|
1239
|
+
"DataType": "Number",
|
|
1240
|
+
"Rationale": "Convenience output: PromptTokens + CompletionTokens. Useful for cost tracking without needing an expression-solver."
|
|
1241
|
+
}
|
|
1242
|
+
]
|
|
1243
|
+
},
|
|
1244
|
+
{
|
|
1245
|
+
"Hash": "llm-embedding",
|
|
1246
|
+
"Name": "LLM Embedding",
|
|
1247
|
+
"Category": "llm",
|
|
1248
|
+
"Capability": "LLM",
|
|
1249
|
+
"Tier": "Extension",
|
|
1250
|
+
"EventInputs": [
|
|
1251
|
+
{ "Name": "Trigger" }
|
|
1252
|
+
],
|
|
1253
|
+
"EventOutputs": [
|
|
1254
|
+
{ "Name": "Complete" },
|
|
1255
|
+
{ "Name": "Error", "IsError": true }
|
|
1256
|
+
],
|
|
1257
|
+
"SettingsInputs": [
|
|
1258
|
+
{ "Name": "Text", "DataType": "String", "Required": false },
|
|
1259
|
+
{ "Name": "Model", "DataType": "String", "Required": false },
|
|
1260
|
+
{ "Name": "InputAddress", "DataType": "String", "Required": false },
|
|
1261
|
+
{ "Name": "Destination", "DataType": "String", "Required": false },
|
|
1262
|
+
{ "Name": "AffinityKey", "DataType": "String", "Required": false },
|
|
1263
|
+
{ "Name": "TimeoutMs", "DataType": "Number", "Required": false }
|
|
1264
|
+
],
|
|
1265
|
+
"StateOutputs": [
|
|
1266
|
+
{ "Name": "Embedding", "DataType": "String" },
|
|
1267
|
+
{ "Name": "Dimensions", "DataType": "Number" },
|
|
1268
|
+
{ "Name": "Model", "DataType": "String" },
|
|
1269
|
+
{ "Name": "BeaconID", "DataType": "String" }
|
|
1270
|
+
],
|
|
1271
|
+
"Recommendations": [
|
|
1272
|
+
{
|
|
1273
|
+
"Type": "MissingSetting",
|
|
1274
|
+
"Name": "Dimensions",
|
|
1275
|
+
"DataType": "Number",
|
|
1276
|
+
"Rationale": "Some embedding models (e.g., text-embedding-3-small) support dimension reduction. A Dimensions setting lets users choose the vector size."
|
|
1277
|
+
}
|
|
1278
|
+
]
|
|
1279
|
+
},
|
|
1280
|
+
{
|
|
1281
|
+
"Hash": "llm-tool-use",
|
|
1282
|
+
"Name": "LLM Tool Use",
|
|
1283
|
+
"Category": "llm",
|
|
1284
|
+
"Capability": "LLM",
|
|
1285
|
+
"Tier": "Extension",
|
|
1286
|
+
"EventInputs": [
|
|
1287
|
+
{ "Name": "Trigger" }
|
|
1288
|
+
],
|
|
1289
|
+
"EventOutputs": [
|
|
1290
|
+
{ "Name": "Complete" },
|
|
1291
|
+
{ "Name": "ToolCall" },
|
|
1292
|
+
{ "Name": "Error", "IsError": true }
|
|
1293
|
+
],
|
|
1294
|
+
"SettingsInputs": [
|
|
1295
|
+
{ "Name": "SystemPrompt", "DataType": "String", "Required": false },
|
|
1296
|
+
{ "Name": "UserPrompt", "DataType": "String", "Required": false },
|
|
1297
|
+
{ "Name": "Messages", "DataType": "String", "Required": false },
|
|
1298
|
+
{ "Name": "Tools", "DataType": "String", "Required": true },
|
|
1299
|
+
{ "Name": "Model", "DataType": "String", "Required": false },
|
|
1300
|
+
{ "Name": "ToolChoice", "DataType": "String", "Required": false },
|
|
1301
|
+
{ "Name": "Temperature", "DataType": "Number", "Required": false },
|
|
1302
|
+
{ "Name": "MaxTokens", "DataType": "Number", "Required": false },
|
|
1303
|
+
{ "Name": "ConversationAddress", "DataType": "String", "Required": false },
|
|
1304
|
+
{ "Name": "AppendToConversation", "DataType": "String", "Required": false },
|
|
1305
|
+
{ "Name": "InputAddress", "DataType": "String", "Required": false },
|
|
1306
|
+
{ "Name": "Destination", "DataType": "String", "Required": false },
|
|
1307
|
+
{ "Name": "AffinityKey", "DataType": "String", "Required": false },
|
|
1308
|
+
{ "Name": "TimeoutMs", "DataType": "Number", "Required": false }
|
|
1309
|
+
],
|
|
1310
|
+
"StateOutputs": [
|
|
1311
|
+
{ "Name": "Content", "DataType": "String" },
|
|
1312
|
+
{ "Name": "ToolCalls", "DataType": "String" },
|
|
1313
|
+
{ "Name": "Model", "DataType": "String" },
|
|
1314
|
+
{ "Name": "FinishReason", "DataType": "String" },
|
|
1315
|
+
{ "Name": "PromptTokens", "DataType": "Number" },
|
|
1316
|
+
{ "Name": "CompletionTokens", "DataType": "Number" },
|
|
1317
|
+
{ "Name": "BeaconID", "DataType": "String" }
|
|
1318
|
+
],
|
|
1319
|
+
"Recommendations": []
|
|
1320
|
+
},
|
|
1321
|
+
{
|
|
1322
|
+
"Hash": "beacon-dispatch",
|
|
1323
|
+
"Name": "Beacon Dispatch",
|
|
1324
|
+
"Category": "extension",
|
|
1325
|
+
"Capability": "Extension",
|
|
1326
|
+
"Tier": "Extension",
|
|
1327
|
+
"EventInputs": [
|
|
1328
|
+
{ "Name": "Trigger" }
|
|
1329
|
+
],
|
|
1330
|
+
"EventOutputs": [
|
|
1331
|
+
{ "Name": "Complete" },
|
|
1332
|
+
{ "Name": "Error", "IsError": true }
|
|
1333
|
+
],
|
|
1334
|
+
"SettingsInputs": [
|
|
1335
|
+
{ "Name": "RemoteCapability", "DataType": "String", "Required": true },
|
|
1336
|
+
{ "Name": "RemoteAction", "DataType": "String", "Required": false },
|
|
1337
|
+
{ "Name": "Command", "DataType": "String", "Required": false },
|
|
1338
|
+
{ "Name": "Parameters", "DataType": "String", "Required": false },
|
|
1339
|
+
{ "Name": "AffinityKey", "DataType": "String", "Required": false },
|
|
1340
|
+
{ "Name": "TimeoutMs", "DataType": "Number", "Required": false },
|
|
1341
|
+
{ "Name": "InputData", "DataType": "String", "Required": false }
|
|
1342
|
+
],
|
|
1343
|
+
"StateOutputs": [
|
|
1344
|
+
{ "Name": "StdOut", "DataType": "String" },
|
|
1345
|
+
{ "Name": "Result", "DataType": "String" },
|
|
1346
|
+
{ "Name": "ExitCode", "DataType": "Number" },
|
|
1347
|
+
{ "Name": "BeaconID", "DataType": "String" }
|
|
1348
|
+
],
|
|
1349
|
+
"Recommendations": [
|
|
1350
|
+
{
|
|
1351
|
+
"Type": "MissingSetting",
|
|
1352
|
+
"Name": "Destination",
|
|
1353
|
+
"DataType": "String",
|
|
1354
|
+
"Rationale": "No way to write results to a state address. Every other I/O card has this."
|
|
1355
|
+
}
|
|
1356
|
+
]
|
|
1357
|
+
},
|
|
1358
|
+
{
|
|
1359
|
+
"Hash": "content-read-file",
|
|
1360
|
+
"Name": "Content Read File",
|
|
1361
|
+
"Category": "content-system",
|
|
1362
|
+
"Capability": "ContentSystem",
|
|
1363
|
+
"Tier": "Service",
|
|
1364
|
+
"EventInputs": [
|
|
1365
|
+
{ "Name": "Trigger" }
|
|
1366
|
+
],
|
|
1367
|
+
"EventOutputs": [
|
|
1368
|
+
{ "Name": "Complete" },
|
|
1369
|
+
{ "Name": "Error", "IsError": true }
|
|
1370
|
+
],
|
|
1371
|
+
"SettingsInputs": [
|
|
1372
|
+
{ "Name": "FilePath", "DataType": "String", "Required": true },
|
|
1373
|
+
{ "Name": "AffinityKey", "DataType": "String", "Required": false },
|
|
1374
|
+
{ "Name": "TimeoutMs", "DataType": "Number", "Required": false }
|
|
1375
|
+
],
|
|
1376
|
+
"StateOutputs": [
|
|
1377
|
+
{ "Name": "Content", "DataType": "String" },
|
|
1378
|
+
{ "Name": "StdOut", "DataType": "String" }
|
|
1379
|
+
],
|
|
1380
|
+
"Recommendations": [
|
|
1381
|
+
{
|
|
1382
|
+
"Type": "MissingSetting",
|
|
1383
|
+
"Name": "Destination",
|
|
1384
|
+
"DataType": "String",
|
|
1385
|
+
"Rationale": "No Destination setting to write content to a state address. Must use the Content output port and wire it manually."
|
|
1386
|
+
}
|
|
1387
|
+
]
|
|
1388
|
+
},
|
|
1389
|
+
{
|
|
1390
|
+
"Hash": "content-save-file",
|
|
1391
|
+
"Name": "Content Save File",
|
|
1392
|
+
"Category": "content-system",
|
|
1393
|
+
"Capability": "ContentSystem",
|
|
1394
|
+
"Tier": "Service",
|
|
1395
|
+
"EventInputs": [
|
|
1396
|
+
{ "Name": "Trigger" }
|
|
1397
|
+
],
|
|
1398
|
+
"EventOutputs": [
|
|
1399
|
+
{ "Name": "Complete" },
|
|
1400
|
+
{ "Name": "Error", "IsError": true }
|
|
1401
|
+
],
|
|
1402
|
+
"SettingsInputs": [
|
|
1403
|
+
{ "Name": "FilePath", "DataType": "String", "Required": true },
|
|
1404
|
+
{ "Name": "Content", "DataType": "String", "Required": true },
|
|
1405
|
+
{ "Name": "AffinityKey", "DataType": "String", "Required": false },
|
|
1406
|
+
{ "Name": "TimeoutMs", "DataType": "Number", "Required": false }
|
|
1407
|
+
],
|
|
1408
|
+
"StateOutputs": [
|
|
1409
|
+
{ "Name": "FilePath", "DataType": "String" },
|
|
1410
|
+
{ "Name": "StdOut", "DataType": "String" }
|
|
1411
|
+
],
|
|
1412
|
+
"Recommendations": []
|
|
1413
|
+
},
|
|
1414
|
+
{
|
|
1415
|
+
"Hash": "content-list-files",
|
|
1416
|
+
"Name": "Content List Files",
|
|
1417
|
+
"Category": "content-system",
|
|
1418
|
+
"Capability": "ContentSystem",
|
|
1419
|
+
"Tier": "Service",
|
|
1420
|
+
"EventInputs": [
|
|
1421
|
+
{ "Name": "Trigger" }
|
|
1422
|
+
],
|
|
1423
|
+
"EventOutputs": [
|
|
1424
|
+
{ "Name": "Complete" },
|
|
1425
|
+
{ "Name": "Error", "IsError": true }
|
|
1426
|
+
],
|
|
1427
|
+
"SettingsInputs": [
|
|
1428
|
+
{ "Name": "Path", "DataType": "String", "Required": false },
|
|
1429
|
+
{ "Name": "AffinityKey", "DataType": "String", "Required": false },
|
|
1430
|
+
{ "Name": "TimeoutMs", "DataType": "Number", "Required": false }
|
|
1431
|
+
],
|
|
1432
|
+
"StateOutputs": [
|
|
1433
|
+
{ "Name": "Files", "DataType": "String" },
|
|
1434
|
+
{ "Name": "StdOut", "DataType": "String" }
|
|
1435
|
+
],
|
|
1436
|
+
"Recommendations": [
|
|
1437
|
+
{
|
|
1438
|
+
"Type": "MissingSetting",
|
|
1439
|
+
"Name": "Pattern",
|
|
1440
|
+
"DataType": "String",
|
|
1441
|
+
"Rationale": "Local list-files has a Pattern setting for glob filtering. The content-system equivalent should too."
|
|
1442
|
+
},
|
|
1443
|
+
{
|
|
1444
|
+
"Type": "MissingSetting",
|
|
1445
|
+
"Name": "Recursive",
|
|
1446
|
+
"DataType": "Boolean",
|
|
1447
|
+
"Rationale": "No way to list files recursively through subdirectories."
|
|
1448
|
+
}
|
|
1449
|
+
]
|
|
1450
|
+
},
|
|
1451
|
+
{
|
|
1452
|
+
"Hash": "content-create-folder",
|
|
1453
|
+
"Name": "Content Create Folder",
|
|
1454
|
+
"Category": "content-system",
|
|
1455
|
+
"Capability": "ContentSystem",
|
|
1456
|
+
"Tier": "Service",
|
|
1457
|
+
"EventInputs": [
|
|
1458
|
+
{ "Name": "Trigger" }
|
|
1459
|
+
],
|
|
1460
|
+
"EventOutputs": [
|
|
1461
|
+
{ "Name": "Complete" },
|
|
1462
|
+
{ "Name": "Error", "IsError": true }
|
|
1463
|
+
],
|
|
1464
|
+
"SettingsInputs": [
|
|
1465
|
+
{ "Name": "Path", "DataType": "String", "Required": true },
|
|
1466
|
+
{ "Name": "AffinityKey", "DataType": "String", "Required": false },
|
|
1467
|
+
{ "Name": "TimeoutMs", "DataType": "Number", "Required": false }
|
|
1468
|
+
],
|
|
1469
|
+
"StateOutputs": [
|
|
1470
|
+
{ "Name": "StdOut", "DataType": "String" }
|
|
1471
|
+
],
|
|
1472
|
+
"Recommendations": []
|
|
1473
|
+
}
|
|
1474
|
+
],
|
|
1475
|
+
|
|
1476
|
+
"CrossCuttingIssues": [
|
|
1477
|
+
{
|
|
1478
|
+
"Issue": "Inconsistent Event Naming",
|
|
1479
|
+
"Severity": "Medium",
|
|
1480
|
+
"Details": "Success events vary wildly: 'Complete', 'Done', 'ReadComplete', 'WriteComplete', 'ReplaceComplete', 'ValueInputComplete', 'Completed'. Input events vary too: 'Trigger', 'In', 'Execute', 'BeginRead', 'BeginWrite', 'Replace', 'Append', 'RequestInput', 'Evaluate', 'Launch'. Consider standardizing on 'Trigger'/'Complete'/'Error' for consistency, or at least within each category."
|
|
1481
|
+
},
|
|
1482
|
+
{
|
|
1483
|
+
"Issue": "Inconsistent Setting Names for Same Concept",
|
|
1484
|
+
"Severity": "Medium",
|
|
1485
|
+
"Details": "File path setting is named 'FilePath' (read-file, write-file, content-*), 'File' (read-json, write-json), 'Folder' (list-files), or 'Source'/'TargetFile' (copy-file). Data source is 'Address' (send-json, write-json), 'DataAddress' (meadow-create/update, if-conditional), 'SourceAddress' (parse-csv, csv-transform, histogram), or 'InputAddress' (llm-*). These should converge."
|
|
1486
|
+
},
|
|
1487
|
+
{
|
|
1488
|
+
"Issue": "Missing Destination Setting on Several Cards",
|
|
1489
|
+
"Severity": "High",
|
|
1490
|
+
"Details": "meadow-create, meadow-update, beacon-dispatch, and all content-system cards lack a 'Destination' setting to write outputs to a state address. This forces downstream tasks to use template expressions to read from TaskOutput, rather than having a clean state-address write."
|
|
1491
|
+
},
|
|
1492
|
+
{
|
|
1493
|
+
"Issue": "No HTTP Status Code Outputs",
|
|
1494
|
+
"Severity": "Medium",
|
|
1495
|
+
"Details": "None of the 4 HTTP client cards expose the response status code. This makes it impossible to branch on 404 vs 500 vs 200 without inspecting the response body."
|
|
1496
|
+
},
|
|
1497
|
+
{
|
|
1498
|
+
"Issue": "No Timeout Settings on HTTP Cards",
|
|
1499
|
+
"Severity": "Medium",
|
|
1500
|
+
"Details": "get-json, get-text, send-json, and rest-request have no TimeoutMs setting. A hung remote server blocks the entire flow."
|
|
1501
|
+
},
|
|
1502
|
+
{
|
|
1503
|
+
"Issue": "All Meadow Cards Missing Headers",
|
|
1504
|
+
"Severity": "Medium",
|
|
1505
|
+
"Details": "None of the 6 meadow cards accept a Headers setting. Authenticated Meadow APIs are unusable from flows."
|
|
1506
|
+
},
|
|
1507
|
+
{
|
|
1508
|
+
"Issue": "rest-request Retries Not Implemented",
|
|
1509
|
+
"Severity": "Low",
|
|
1510
|
+
"Details": "The Retries setting is defined and accepted but the Execute function makes exactly one request. Dead code."
|
|
1511
|
+
},
|
|
1512
|
+
{
|
|
1513
|
+
"Issue": "csv-transform Is a No-Op Stub",
|
|
1514
|
+
"Severity": "Low",
|
|
1515
|
+
"Details": "The Execute function passes records through unchanged. The card exists in the palette but does nothing."
|
|
1516
|
+
},
|
|
1517
|
+
{
|
|
1518
|
+
"Issue": "histogram Bins Setting Unused",
|
|
1519
|
+
"Severity": "Low",
|
|
1520
|
+
"Details": "The Bins setting is defined but the Execute function ignores it. It only does frequency counting, not binned histograms."
|
|
1521
|
+
}
|
|
1522
|
+
],
|
|
1523
|
+
|
|
1524
|
+
"RecommendationSummary": {
|
|
1525
|
+
"TotalRecommendations": 62,
|
|
1526
|
+
"ByType": {
|
|
1527
|
+
"MissingSetting": 35,
|
|
1528
|
+
"MissingOutput": 10,
|
|
1529
|
+
"MissingPort": 4,
|
|
1530
|
+
"Inconsistency": 7,
|
|
1531
|
+
"Observation": 4,
|
|
1532
|
+
"BugOrStub": 2
|
|
1533
|
+
},
|
|
1534
|
+
"HighPriority": [
|
|
1535
|
+
"write-json: Add PrettyFormat, IndentType, IndentCount settings (hardcoded to tab, no config)",
|
|
1536
|
+
"get-text: Add Headers setting (get-json has it, get-text doesn't)",
|
|
1537
|
+
"meadow-create: Add Destination setting (can't store created record to state)",
|
|
1538
|
+
"meadow-update: Add Destination setting (can't store updated record to state)",
|
|
1539
|
+
"meadow-count: Add Filter setting (can only count ALL records, not filtered subsets)",
|
|
1540
|
+
"All HTTP cards: Add TimeoutMs setting (hung servers block flows)",
|
|
1541
|
+
"All HTTP cards: Add StatusCode output (can't branch on HTTP status)",
|
|
1542
|
+
"All Meadow cards: Add Headers setting (can't auth to Meadow APIs)"
|
|
1543
|
+
]
|
|
1544
|
+
}
|
|
1545
|
+
}
|