ultravisor 1.0.3 → 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.
Files changed (248) hide show
  1. package/.claude/launch.json +11 -0
  2. package/.claude/ultravisor-dev-config.json +3 -0
  3. package/card-audit.json +1545 -0
  4. package/docs/_sidebar.md +17 -0
  5. package/docs/css/docuserve.css +73 -0
  6. package/docs/features/beacon-authentication.md +209 -0
  7. package/docs/features/beacon-providers.md +1299 -0
  8. package/docs/features/beacons.md +530 -0
  9. package/docs/features/capabilities.md +193 -0
  10. package/docs/features/llm-model-setup.md +505 -0
  11. package/docs/features/llm.md +262 -0
  12. package/docs/features/tasks-content-system.md +110 -0
  13. package/docs/features/tasks-data-transform.md +233 -0
  14. package/docs/features/tasks-extension.md +36 -0
  15. package/docs/features/tasks-file-system.md +203 -0
  16. package/docs/features/tasks-flow-control.md +125 -0
  17. package/docs/features/tasks-http-client.md +119 -0
  18. package/docs/features/tasks-llm.md +118 -0
  19. package/docs/features/tasks-meadow-api.md +163 -0
  20. package/docs/features/tasks-user-interaction.md +49 -0
  21. package/docs/features/tasks.md +14 -0
  22. package/docs/index.html +1 -1
  23. package/docs/retold-catalog.json +1 -1
  24. package/docs/retold-keyword-index.json +17374 -5
  25. package/operation-library/api-data-pipeline.json +143 -0
  26. package/operation-library/beacon-remote-command.json +72 -0
  27. package/operation-library/conditional-file-backup.json +143 -0
  28. package/operation-library/config-processor.json +136 -0
  29. package/operation-library/csv-data-analysis.json +228 -0
  30. package/operation-library/csv-to-json.json +160 -0
  31. package/operation-library/directory-inventory.json +128 -0
  32. package/operation-library/expression-calculator.json +114 -0
  33. package/operation-library/file-search-replace.json +175 -0
  34. package/operation-library/git-status-report.json +368 -0
  35. package/operation-library/health-check-ping.json +329 -0
  36. package/operation-library/json-config-merge.json +313 -0
  37. package/operation-library/llm-embedding-tool-use.json +314 -0
  38. package/operation-library/llm-multi-turn-analysis.json +322 -0
  39. package/operation-library/llm-summarize.json +264 -0
  40. package/operation-library/log-line-counter.json +185 -0
  41. package/operation-library/meadow-crud-lifecycle.json +264 -0
  42. package/operation-library/npm-project-validator.json +193 -0
  43. package/operation-library/rest-api-orchestrator.json +218 -0
  44. package/operation-library/shell-system-info.json +137 -0
  45. package/operation-library/simple-echo.json +95 -0
  46. package/operation-library/template-processor.json +299 -0
  47. package/operation-library/text-sanitizer.json +176 -0
  48. package/package.json +12 -8
  49. package/source/Ultravisor.cjs +30 -3
  50. package/source/beacon/Ultravisor-Beacon-CLI.cjs +143 -0
  51. package/source/beacon/Ultravisor-Beacon-CapabilityProvider.cjs +129 -0
  52. package/source/beacon/Ultravisor-Beacon-Client.cjs +568 -0
  53. package/source/beacon/Ultravisor-Beacon-Executor.cjs +500 -0
  54. package/source/beacon/Ultravisor-Beacon-ProviderRegistry.cjs +330 -0
  55. package/source/beacon/providers/Ultravisor-Beacon-Provider-FileSystem.cjs +331 -0
  56. package/source/beacon/providers/Ultravisor-Beacon-Provider-LLM.cjs +966 -0
  57. package/source/beacon/providers/Ultravisor-Beacon-Provider-Shell.cjs +95 -0
  58. package/source/cli/Ultravisor-CLIProgram.cjs +44 -22
  59. package/source/cli/commands/Ultravisor-Command-SingleOperation.cjs +29 -18
  60. package/source/cli/commands/Ultravisor-Command-SingleTask.cjs +62 -19
  61. package/source/cli/commands/Ultravisor-Command-UpdateTask.cjs +27 -15
  62. package/source/config/Ultravisor-Default-Command-Configuration.cjs +12 -3
  63. package/source/services/Ultravisor-Beacon-Coordinator.cjs +966 -0
  64. package/source/services/Ultravisor-ExecutionEngine.cjs +1093 -0
  65. package/source/services/Ultravisor-ExecutionManifest.cjs +629 -0
  66. package/source/services/Ultravisor-Hypervisor-State.cjs +270 -97
  67. package/source/services/Ultravisor-Hypervisor.cjs +185 -75
  68. package/source/services/Ultravisor-Schedule-Persistence-Base.cjs +45 -0
  69. package/source/services/Ultravisor-StateManager.cjs +253 -0
  70. package/source/services/Ultravisor-TaskTypeRegistry.cjs +213 -0
  71. package/source/services/persistence/Ultravisor-Schedule-Persistence-JSONFile.cjs +140 -0
  72. package/source/services/tasks/Ultravisor-BuiltIn-TaskConfigs.cjs +19 -0
  73. package/source/services/tasks/Ultravisor-TaskHelper-BeaconDispatch.cjs +107 -0
  74. package/source/services/tasks/Ultravisor-TaskType-Base.cjs +125 -0
  75. package/source/services/tasks/content-system/Ultravisor-TaskConfigs-ContentSystem.cjs +90 -0
  76. package/source/services/tasks/content-system/definitions/content-create-folder.json +24 -0
  77. package/source/services/tasks/content-system/definitions/content-list-files.json +27 -0
  78. package/source/services/tasks/content-system/definitions/content-read-file.json +26 -0
  79. package/source/services/tasks/content-system/definitions/content-save-file.json +26 -0
  80. package/source/services/tasks/data-transform/Ultravisor-TaskConfigs-DataTransform.cjs +577 -0
  81. package/source/services/tasks/data-transform/Ultravisor-TaskType-ReplaceString.cjs +80 -0
  82. package/source/services/tasks/data-transform/Ultravisor-TaskType-SetValues.cjs +74 -0
  83. package/source/services/tasks/data-transform/Ultravisor-TaskType-StringAppender.cjs +90 -0
  84. package/source/services/tasks/data-transform/definitions/comprehension-intersect.json +24 -0
  85. package/source/services/tasks/data-transform/definitions/csv-transform.json +24 -0
  86. package/source/services/tasks/data-transform/definitions/expression-solver.json +20 -0
  87. package/source/services/tasks/data-transform/definitions/histogram.json +23 -0
  88. package/source/services/tasks/data-transform/definitions/parse-csv.json +27 -0
  89. package/source/services/tasks/data-transform/definitions/replace-string.json +27 -0
  90. package/source/services/tasks/data-transform/definitions/set-values.json +17 -0
  91. package/source/services/tasks/data-transform/definitions/string-appender.json +22 -0
  92. package/source/services/tasks/data-transform/definitions/template-string.json +20 -0
  93. package/source/services/tasks/extension/Ultravisor-TaskConfigs-Extension.cjs +87 -0
  94. package/source/services/tasks/extension/definitions/beacon-dispatch.json +32 -0
  95. package/source/services/tasks/file-system/Ultravisor-TaskConfigs-FileSystem.cjs +509 -0
  96. package/source/services/tasks/file-system/Ultravisor-TaskType-ReadFile.cjs +96 -0
  97. package/source/services/tasks/file-system/Ultravisor-TaskType-ReadFileBuffered.cjs +123 -0
  98. package/source/services/tasks/file-system/Ultravisor-TaskType-WriteFile.cjs +106 -0
  99. package/source/services/tasks/file-system/definitions/copy-file.json +27 -0
  100. package/source/services/tasks/file-system/definitions/list-files.json +27 -0
  101. package/source/services/tasks/file-system/definitions/read-file-buffered.json +31 -0
  102. package/source/services/tasks/file-system/definitions/read-file.json +26 -0
  103. package/source/services/tasks/file-system/definitions/read-json.json +23 -0
  104. package/source/services/tasks/file-system/definitions/write-file.json +29 -0
  105. package/source/services/tasks/file-system/definitions/write-json.json +30 -0
  106. package/source/services/tasks/flow-control/Ultravisor-TaskConfigs-FlowControl.cjs +353 -0
  107. package/source/services/tasks/flow-control/Ultravisor-TaskType-IfConditional.cjs +125 -0
  108. package/source/services/tasks/flow-control/Ultravisor-TaskType-LaunchOperation.cjs +186 -0
  109. package/source/services/tasks/flow-control/Ultravisor-TaskType-SplitExecute.cjs +164 -0
  110. package/source/services/tasks/flow-control/definitions/if-conditional.json +25 -0
  111. package/source/services/tasks/flow-control/definitions/launch-operation.json +27 -0
  112. package/source/services/tasks/flow-control/definitions/split-execute.json +32 -0
  113. package/source/services/tasks/http-client/Ultravisor-TaskConfigs-HttpClient.cjs +281 -0
  114. package/source/services/tasks/http-client/definitions/get-json.json +26 -0
  115. package/source/services/tasks/http-client/definitions/get-text.json +26 -0
  116. package/source/services/tasks/http-client/definitions/rest-request.json +32 -0
  117. package/source/services/tasks/http-client/definitions/send-json.json +28 -0
  118. package/source/services/tasks/llm/Ultravisor-TaskConfigs-LLM.cjs +605 -0
  119. package/source/services/tasks/llm/definitions/llm-chat-completion.json +46 -0
  120. package/source/services/tasks/llm/definitions/llm-embedding.json +31 -0
  121. package/source/services/tasks/llm/definitions/llm-tool-use.json +42 -0
  122. package/source/services/tasks/meadow-api/Ultravisor-TaskConfigs-MeadowApi.cjs +341 -0
  123. package/source/services/tasks/meadow-api/definitions/meadow-count.json +26 -0
  124. package/source/services/tasks/meadow-api/definitions/meadow-create.json +26 -0
  125. package/source/services/tasks/meadow-api/definitions/meadow-delete.json +23 -0
  126. package/source/services/tasks/meadow-api/definitions/meadow-read.json +26 -0
  127. package/source/services/tasks/meadow-api/definitions/meadow-reads.json +29 -0
  128. package/source/services/tasks/meadow-api/definitions/meadow-update.json +26 -0
  129. package/source/services/tasks/shell/Ultravisor-TaskConfigs-Shell.cjs +63 -0
  130. package/source/services/tasks/shell/definitions/command.json +29 -0
  131. package/source/services/tasks/user-interaction/Ultravisor-TaskConfigs-UserInteraction.cjs +64 -0
  132. package/source/services/tasks/user-interaction/Ultravisor-TaskType-ErrorMessage.cjs +55 -0
  133. package/source/services/tasks/user-interaction/Ultravisor-TaskType-ValueInput.cjs +47 -0
  134. package/source/services/tasks/user-interaction/definitions/error-message.json +18 -0
  135. package/source/services/tasks/user-interaction/definitions/value-input.json +23 -0
  136. package/source/web_server/Ultravisor-API-Server.cjs +849 -124
  137. package/test/Ultravisor_browser_tests.js +2226 -0
  138. package/test/Ultravisor_operation_library_tests.js +894 -0
  139. package/test/Ultravisor_tests.js +4946 -5044
  140. package/test/workflows/test-content-concatenate-all.json +339 -0
  141. package/test/workflows/test-content-full-pipeline.json +159 -0
  142. package/test/workflows/test-content-list-files.json +76 -0
  143. package/test/workflows/test-content-save-and-read.json +106 -0
  144. package/webinterface/css/ultravisor-themes.css +668 -0
  145. package/webinterface/css/ultravisor.css +37 -14
  146. package/webinterface/docs/card-help/beacon-dispatch.md +30 -0
  147. package/webinterface/docs/card-help/command.md +27 -0
  148. package/webinterface/docs/card-help/comprehension-intersect.md +24 -0
  149. package/webinterface/docs/card-help/content-create-folder.md +22 -0
  150. package/webinterface/docs/card-help/content-list-files.md +25 -0
  151. package/webinterface/docs/card-help/content-read-file.md +24 -0
  152. package/webinterface/docs/card-help/content-save-file.md +24 -0
  153. package/webinterface/docs/card-help/copy-file.md +25 -0
  154. package/webinterface/docs/card-help/csv-transform.md +24 -0
  155. package/webinterface/docs/card-help/end.md +11 -0
  156. package/webinterface/docs/card-help/error-message.md +16 -0
  157. package/webinterface/docs/card-help/expression-solver.md +21 -0
  158. package/webinterface/docs/card-help/get-json.md +24 -0
  159. package/webinterface/docs/card-help/get-text.md +24 -0
  160. package/webinterface/docs/card-help/histogram.md +23 -0
  161. package/webinterface/docs/card-help/if-conditional.md +23 -0
  162. package/webinterface/docs/card-help/launch-operation.md +25 -0
  163. package/webinterface/docs/card-help/list-files.md +25 -0
  164. package/webinterface/docs/card-help/llm-chat-completion.md +43 -0
  165. package/webinterface/docs/card-help/llm-embedding.md +24 -0
  166. package/webinterface/docs/card-help/llm-tool-use.md +39 -0
  167. package/webinterface/docs/card-help/meadow-count.md +24 -0
  168. package/webinterface/docs/card-help/meadow-create.md +24 -0
  169. package/webinterface/docs/card-help/meadow-delete.md +19 -0
  170. package/webinterface/docs/card-help/meadow-read.md +24 -0
  171. package/webinterface/docs/card-help/meadow-reads.md +27 -0
  172. package/webinterface/docs/card-help/meadow-update.md +24 -0
  173. package/webinterface/docs/card-help/parse-csv.md +27 -0
  174. package/webinterface/docs/card-help/read-file-buffered.md +29 -0
  175. package/webinterface/docs/card-help/read-file.md +24 -0
  176. package/webinterface/docs/card-help/read-json.md +21 -0
  177. package/webinterface/docs/card-help/replace-string.md +25 -0
  178. package/webinterface/docs/card-help/rest-request.md +30 -0
  179. package/webinterface/docs/card-help/send-json.md +26 -0
  180. package/webinterface/docs/card-help/set-values.md +16 -0
  181. package/webinterface/docs/card-help/split-execute.md +35 -0
  182. package/webinterface/docs/card-help/start.md +11 -0
  183. package/webinterface/docs/card-help/string-appender.md +22 -0
  184. package/webinterface/docs/card-help/template-string.md +21 -0
  185. package/webinterface/docs/card-help/value-input.md +24 -0
  186. package/webinterface/docs/card-help/write-file.md +27 -0
  187. package/webinterface/docs/card-help/write-json.md +28 -0
  188. package/webinterface/html/index.html +5 -0
  189. package/webinterface/package.json +13 -4
  190. package/webinterface/source/Pict-Application-Ultravisor.js +564 -70
  191. package/webinterface/source/Ultravisor-TimingUtils.js +99 -0
  192. package/webinterface/source/card-help-content.js +46 -0
  193. package/webinterface/source/cards/Ultravisor-BuiltIn-CardConfigs.js +174 -0
  194. package/webinterface/source/cards/Ultravisor-CardConfigGenerator.js +431 -0
  195. package/webinterface/source/data/ExampleFlow-CSVPipeline.js +231 -0
  196. package/webinterface/source/data/ExampleFlow-FileProcessor.js +315 -0
  197. package/webinterface/source/data/ExampleFlow-MeadowPipeline.js +328 -0
  198. package/webinterface/source/panels/Ultravisor-CardSettingsPanel.js +902 -0
  199. package/webinterface/source/providers/PictRouter-Ultravisor-Configuration.json +20 -8
  200. package/webinterface/source/views/PictView-Ultravisor-BeaconList.js +817 -0
  201. package/webinterface/source/views/PictView-Ultravisor-BottomBar.js +5 -5
  202. package/webinterface/source/views/PictView-Ultravisor-Dashboard.js +25 -25
  203. package/webinterface/source/views/PictView-Ultravisor-Documentation.js +856 -0
  204. package/webinterface/source/views/PictView-Ultravisor-FlowEditor.js +777 -0
  205. package/webinterface/source/views/PictView-Ultravisor-ManifestList.js +321 -58
  206. package/webinterface/source/views/PictView-Ultravisor-OperationEdit.js +36 -91
  207. package/webinterface/source/views/PictView-Ultravisor-OperationList.js +388 -16
  208. package/webinterface/source/views/PictView-Ultravisor-PendingInput.js +314 -0
  209. package/webinterface/source/views/PictView-Ultravisor-Schedule.js +521 -65
  210. package/webinterface/source/views/PictView-Ultravisor-TimingView.js +333 -71
  211. package/webinterface/source/views/PictView-Ultravisor-TopBar.js +257 -21
  212. package/webinterface/theme-sampler.html +645 -0
  213. package/debug/Harness.js +0 -6
  214. package/source/services/Ultravisor-Operation-Manifest.cjs +0 -160
  215. package/source/services/Ultravisor-Operation.cjs +0 -200
  216. package/source/services/Ultravisor-Task.cjs +0 -349
  217. package/source/services/events/Ultravisor-Hypervisor-Event-Solver.cjs +0 -11
  218. package/source/services/tasks/Ultravisor-Task-Base.cjs +0 -264
  219. package/source/services/tasks/Ultravisor-Task-CollectValues.cjs +0 -188
  220. package/source/services/tasks/Ultravisor-Task-Command.cjs +0 -65
  221. package/source/services/tasks/Ultravisor-Task-CommandEach.cjs +0 -190
  222. package/source/services/tasks/Ultravisor-Task-Conditional.cjs +0 -104
  223. package/source/services/tasks/Ultravisor-Task-DateWindow.cjs +0 -72
  224. package/source/services/tasks/Ultravisor-Task-GeneratePagedOperation.cjs +0 -336
  225. package/source/services/tasks/Ultravisor-Task-LaunchOperation.cjs +0 -143
  226. package/source/services/tasks/Ultravisor-Task-LaunchTask.cjs +0 -146
  227. package/source/services/tasks/Ultravisor-Task-LineMatch.cjs +0 -158
  228. package/source/services/tasks/Ultravisor-Task-Request.cjs +0 -56
  229. package/source/services/tasks/Ultravisor-Task-Solver.cjs +0 -89
  230. package/source/services/tasks/Ultravisor-Task-TemplateString.cjs +0 -93
  231. package/source/services/tasks/rest/Ultravisor-Task-GetBinary.cjs +0 -127
  232. package/source/services/tasks/rest/Ultravisor-Task-GetJSON.cjs +0 -119
  233. package/source/services/tasks/rest/Ultravisor-Task-GetText.cjs +0 -109
  234. package/source/services/tasks/rest/Ultravisor-Task-GetXML.cjs +0 -112
  235. package/source/services/tasks/rest/Ultravisor-Task-RestRequest.cjs +0 -499
  236. package/source/services/tasks/rest/Ultravisor-Task-SendJSON.cjs +0 -150
  237. package/source/services/tasks/stagingfiles/Ultravisor-Task-CopyFile.cjs +0 -110
  238. package/source/services/tasks/stagingfiles/Ultravisor-Task-ListFiles.cjs +0 -89
  239. package/source/services/tasks/stagingfiles/Ultravisor-Task-ReadBinary.cjs +0 -87
  240. package/source/services/tasks/stagingfiles/Ultravisor-Task-ReadJSON.cjs +0 -67
  241. package/source/services/tasks/stagingfiles/Ultravisor-Task-ReadText.cjs +0 -66
  242. package/source/services/tasks/stagingfiles/Ultravisor-Task-ReadXML.cjs +0 -69
  243. package/source/services/tasks/stagingfiles/Ultravisor-Task-WriteBinary.cjs +0 -95
  244. package/source/services/tasks/stagingfiles/Ultravisor-Task-WriteJSON.cjs +0 -96
  245. package/source/services/tasks/stagingfiles/Ultravisor-Task-WriteText.cjs +0 -99
  246. package/source/services/tasks/stagingfiles/Ultravisor-Task-WriteXML.cjs +0 -102
  247. package/webinterface/source/views/PictView-Ultravisor-TaskEdit.js +0 -220
  248. package/webinterface/source/views/PictView-Ultravisor-TaskList.js +0 -248
@@ -0,0 +1,42 @@
1
+ {
2
+ "Hash": "llm-tool-use",
3
+ "Type": "llm-tool-use",
4
+ "Name": "LLM Tool Use",
5
+ "Description": "Sends messages to an LLM with tool/function definitions. Returns both content and tool call results. Supports conversation history.",
6
+ "Category": "llm",
7
+ "Capability": "LLM",
8
+ "Action": "ToolUse",
9
+ "Tier": "Extension",
10
+ "EventInputs": [{ "Name": "Trigger" }],
11
+ "EventOutputs": [
12
+ { "Name": "Complete" },
13
+ { "Name": "ToolCall" },
14
+ { "Name": "Error", "IsError": true }
15
+ ],
16
+ "SettingsInputs": [
17
+ { "Name": "SystemPrompt", "DataType": "String", "Required": false, "Description": "System prompt text" },
18
+ { "Name": "UserPrompt", "DataType": "String", "Required": false, "Description": "User prompt text" },
19
+ { "Name": "Messages", "DataType": "String", "Required": false, "Description": "JSON array of messages for direct control" },
20
+ { "Name": "Tools", "DataType": "String", "Required": true, "Description": "JSON array of tool definitions" },
21
+ { "Name": "Model", "DataType": "String", "Required": false, "Description": "Override model name" },
22
+ { "Name": "ToolChoice", "DataType": "String", "Required": false, "Description": "\"auto\", \"none\", or specific tool name" },
23
+ { "Name": "Temperature", "DataType": "Number", "Required": false, "Description": "Sampling temperature" },
24
+ { "Name": "MaxTokens", "DataType": "Number", "Required": false, "Description": "Maximum tokens to generate" },
25
+ { "Name": "ConversationAddress", "DataType": "String", "Required": false, "Description": "State address for message history" },
26
+ { "Name": "AppendToConversation", "DataType": "String", "Required": false, "Description": "Append this exchange to history" },
27
+ { "Name": "InputAddress", "DataType": "String", "Required": false, "Description": "State address to read context data from" },
28
+ { "Name": "Destination", "DataType": "String", "Required": false, "Description": "State address to write completion content to" },
29
+ { "Name": "AffinityKey", "DataType": "String", "Required": false, "Description": "Route to a specific Beacon worker" },
30
+ { "Name": "TimeoutMs", "DataType": "Number", "Required": false, "Description": "Work item timeout in milliseconds" }
31
+ ],
32
+ "StateOutputs": [
33
+ { "Name": "Content", "DataType": "String", "Description": "The LLM text response (may be empty if tool calls)" },
34
+ { "Name": "ToolCalls", "DataType": "String", "Description": "JSON array of tool call objects" },
35
+ { "Name": "Model", "DataType": "String", "Description": "Model that generated the response" },
36
+ { "Name": "FinishReason", "DataType": "String", "Description": "Why the completion ended (stop, tool_calls, etc.)" },
37
+ { "Name": "PromptTokens", "DataType": "Number", "Description": "Tokens in the prompt" },
38
+ { "Name": "CompletionTokens", "DataType": "Number", "Description": "Tokens in the completion" },
39
+ { "Name": "BeaconID", "DataType": "String", "Description": "ID of the Beacon that executed the work" }
40
+ ],
41
+ "DefaultSettings": { "Temperature": 0.7, "MaxTokens": 4096, "TimeoutMs": 120000, "ToolChoice": "auto" }
42
+ }
@@ -0,0 +1,341 @@
1
+ /**
2
+ * Task configurations for the "Meadow API" capability.
3
+ *
4
+ * REST calls to a Meadow API server for CRUD operations.
5
+ *
6
+ * Contains:
7
+ * - meadow-read — Reads a single record by ID from a Meadow REST endpoint.
8
+ * - meadow-reads — Reads multiple records with optional filter.
9
+ * - meadow-create — Creates a new record via a Meadow REST endpoint.
10
+ * - meadow-update — Updates a record via a Meadow REST endpoint.
11
+ * - meadow-delete — Deletes a record by ID via a Meadow REST endpoint.
12
+ * - meadow-count — Counts records for an entity via a Meadow REST endpoint.
13
+ */
14
+
15
+
16
+ // ── Module-scoped helpers ───────────────────────────────────────────
17
+
18
+ /**
19
+ * Get a service instance from the fable services map.
20
+ */
21
+ function _getService(pTask, pTypeName)
22
+ {
23
+ if (pTask.fable.servicesMap[pTypeName])
24
+ {
25
+ return Object.values(pTask.fable.servicesMap[pTypeName])[0];
26
+ }
27
+ return null;
28
+ }
29
+
30
+ /**
31
+ * Parse headers from a JSON string or return empty object.
32
+ */
33
+ function _parseHeaders(pHeadersString)
34
+ {
35
+ if (!pHeadersString || typeof(pHeadersString) !== 'string' || pHeadersString.trim().length === 0)
36
+ {
37
+ return {};
38
+ }
39
+
40
+ try
41
+ {
42
+ let tmpHeaders = JSON.parse(pHeadersString);
43
+ if (typeof(tmpHeaders) === 'object' && tmpHeaders !== null)
44
+ {
45
+ return tmpHeaders;
46
+ }
47
+ }
48
+ catch (pError)
49
+ {
50
+ // Not valid JSON — ignore
51
+ }
52
+
53
+ return {};
54
+ }
55
+
56
+
57
+ module.exports =
58
+ [
59
+ // ── meadow-read ────────────────────────────────────────────
60
+ {
61
+ Definition: require('./definitions/meadow-read.json'),
62
+ Execute: function (pTask, pResolvedSettings, pExecutionContext, fCallback)
63
+ {
64
+ let tmpEntity = pResolvedSettings.Entity || '';
65
+ let tmpEndpoint = pResolvedSettings.Endpoint || '';
66
+ let tmpRecordID = pResolvedSettings.RecordID || '';
67
+
68
+ if (!tmpEntity || !tmpEndpoint || !tmpRecordID)
69
+ {
70
+ return fCallback(null, { EventToFire: 'Error', Outputs: {}, Log: ['MeadowRead: Entity, Endpoint, and RecordID are required.'] });
71
+ }
72
+
73
+ let tmpRestClient = _getService(pTask, 'RestClient');
74
+ if (!tmpRestClient)
75
+ {
76
+ return fCallback(null, { EventToFire: 'Error', Outputs: {}, Log: ['MeadowRead: RestClient service not found.'] });
77
+ }
78
+
79
+ let tmpURL = `${tmpEndpoint}/${tmpEntity}/${tmpRecordID}`;
80
+
81
+ tmpRestClient.getJSON({ url: tmpURL, headers: _parseHeaders(pResolvedSettings.Headers) },
82
+ function (pError, pResponse, pData)
83
+ {
84
+ if (pError)
85
+ {
86
+ return fCallback(null, { EventToFire: 'Error', Outputs: {}, Log: [`MeadowRead: GET ${tmpURL} failed: ${pError.message}`] });
87
+ }
88
+
89
+ let tmpStateWrites = {};
90
+ if (pResolvedSettings.Destination)
91
+ {
92
+ tmpStateWrites[pResolvedSettings.Destination] = pData;
93
+ }
94
+
95
+ return fCallback(null, {
96
+ EventToFire: 'Complete',
97
+ Outputs: { Record: pData },
98
+ StateWrites: tmpStateWrites,
99
+ Log: [`MeadowRead: retrieved ${tmpEntity} #${tmpRecordID}`]
100
+ });
101
+ });
102
+ }
103
+ },
104
+
105
+ // ── meadow-reads ───────────────────────────────────────────
106
+ {
107
+ Definition: require('./definitions/meadow-reads.json'),
108
+ Execute: function (pTask, pResolvedSettings, pExecutionContext, fCallback)
109
+ {
110
+ let tmpEntity = pResolvedSettings.Entity || '';
111
+ let tmpEndpoint = pResolvedSettings.Endpoint || '';
112
+
113
+ if (!tmpEntity || !tmpEndpoint)
114
+ {
115
+ return fCallback(null, { EventToFire: 'Error', Outputs: {}, Log: ['MeadowReads: Entity and Endpoint are required.'] });
116
+ }
117
+
118
+ let tmpRestClient = _getService(pTask, 'RestClient');
119
+ if (!tmpRestClient)
120
+ {
121
+ return fCallback(null, { EventToFire: 'Error', Outputs: {}, Log: ['MeadowReads: RestClient service not found.'] });
122
+ }
123
+
124
+ let tmpURL = `${tmpEndpoint}/${tmpEntity}s`;
125
+ if (pResolvedSettings.Filter)
126
+ {
127
+ tmpURL += `/FilteredTo/${pResolvedSettings.Filter}/${pResolvedSettings.PageNumber || 0}/${pResolvedSettings.PageSize || 100}`;
128
+ }
129
+
130
+ tmpRestClient.getJSON({ url: tmpURL, headers: _parseHeaders(pResolvedSettings.Headers) },
131
+ function (pError, pResponse, pData)
132
+ {
133
+ if (pError)
134
+ {
135
+ return fCallback(null, { EventToFire: 'Error', Outputs: {}, Log: [`MeadowReads: GET ${tmpURL} failed: ${pError.message}`] });
136
+ }
137
+
138
+ let tmpRecords = Array.isArray(pData) ? pData : [];
139
+ let tmpStateWrites = {};
140
+ if (pResolvedSettings.Destination)
141
+ {
142
+ tmpStateWrites[pResolvedSettings.Destination] = tmpRecords;
143
+ }
144
+
145
+ return fCallback(null, {
146
+ EventToFire: 'Complete',
147
+ Outputs: { Records: tmpRecords, RecordCount: tmpRecords.length },
148
+ StateWrites: tmpStateWrites,
149
+ Log: [`MeadowReads: retrieved ${tmpRecords.length} ${tmpEntity} records`]
150
+ });
151
+ });
152
+ }
153
+ },
154
+
155
+ // ── meadow-create ──────────────────────────────────────────
156
+ {
157
+ Definition: require('./definitions/meadow-create.json'),
158
+ Execute: function (pTask, pResolvedSettings, pExecutionContext, fCallback)
159
+ {
160
+ let tmpEntity = pResolvedSettings.Entity || '';
161
+ let tmpEndpoint = pResolvedSettings.Endpoint || '';
162
+
163
+ if (!tmpEntity || !tmpEndpoint)
164
+ {
165
+ return fCallback(null, { EventToFire: 'Error', Outputs: {}, Log: ['MeadowCreate: Entity and Endpoint are required.'] });
166
+ }
167
+
168
+ let tmpRestClient = _getService(pTask, 'RestClient');
169
+ if (!tmpRestClient)
170
+ {
171
+ return fCallback(null, { EventToFire: 'Error', Outputs: {}, Log: ['MeadowCreate: RestClient service not found.'] });
172
+ }
173
+
174
+ let tmpBody = {};
175
+ if (pResolvedSettings.DataAddress && pExecutionContext.StateManager)
176
+ {
177
+ let tmpData = pExecutionContext.StateManager.resolveAddress(pResolvedSettings.DataAddress, pExecutionContext, pExecutionContext.NodeHash);
178
+ if (typeof(tmpData) === 'object' && tmpData !== null) { tmpBody = tmpData; }
179
+ }
180
+
181
+ tmpRestClient.postJSON({ url: `${tmpEndpoint}/${tmpEntity}`, body: tmpBody, headers: _parseHeaders(pResolvedSettings.Headers) },
182
+ function (pError, pResponse, pData)
183
+ {
184
+ if (pError)
185
+ {
186
+ return fCallback(null, { EventToFire: 'Error', Outputs: {}, Log: [`MeadowCreate: POST failed: ${pError.message}`] });
187
+ }
188
+
189
+ let tmpStateWrites = {};
190
+ if (pResolvedSettings.Destination)
191
+ {
192
+ tmpStateWrites[pResolvedSettings.Destination] = pData;
193
+ }
194
+
195
+ return fCallback(null, {
196
+ EventToFire: 'Complete',
197
+ Outputs: { Created: pData },
198
+ StateWrites: tmpStateWrites,
199
+ Log: [`MeadowCreate: created ${tmpEntity} record`]
200
+ });
201
+ });
202
+ }
203
+ },
204
+
205
+ // ── meadow-update ──────────────────────────────────────────
206
+ {
207
+ Definition: require('./definitions/meadow-update.json'),
208
+ Execute: function (pTask, pResolvedSettings, pExecutionContext, fCallback)
209
+ {
210
+ let tmpEntity = pResolvedSettings.Entity || '';
211
+ let tmpEndpoint = pResolvedSettings.Endpoint || '';
212
+
213
+ if (!tmpEntity || !tmpEndpoint)
214
+ {
215
+ return fCallback(null, { EventToFire: 'Error', Outputs: {}, Log: ['MeadowUpdate: Entity and Endpoint are required.'] });
216
+ }
217
+
218
+ let tmpRestClient = _getService(pTask, 'RestClient');
219
+ if (!tmpRestClient)
220
+ {
221
+ return fCallback(null, { EventToFire: 'Error', Outputs: {}, Log: ['MeadowUpdate: RestClient service not found.'] });
222
+ }
223
+
224
+ let tmpBody = {};
225
+ if (pResolvedSettings.DataAddress && pExecutionContext.StateManager)
226
+ {
227
+ let tmpData = pExecutionContext.StateManager.resolveAddress(pResolvedSettings.DataAddress, pExecutionContext, pExecutionContext.NodeHash);
228
+ if (typeof(tmpData) === 'object' && tmpData !== null) { tmpBody = tmpData; }
229
+ }
230
+
231
+ tmpRestClient.putJSON({ url: `${tmpEndpoint}/${tmpEntity}`, body: tmpBody, headers: _parseHeaders(pResolvedSettings.Headers) },
232
+ function (pError, pResponse, pData)
233
+ {
234
+ if (pError)
235
+ {
236
+ return fCallback(null, { EventToFire: 'Error', Outputs: {}, Log: [`MeadowUpdate: PUT failed: ${pError.message}`] });
237
+ }
238
+
239
+ let tmpStateWrites = {};
240
+ if (pResolvedSettings.Destination)
241
+ {
242
+ tmpStateWrites[pResolvedSettings.Destination] = pData;
243
+ }
244
+
245
+ return fCallback(null, {
246
+ EventToFire: 'Complete',
247
+ Outputs: { Updated: pData },
248
+ StateWrites: tmpStateWrites,
249
+ Log: [`MeadowUpdate: updated ${tmpEntity} record`]
250
+ });
251
+ });
252
+ }
253
+ },
254
+
255
+ // ── meadow-delete ──────────────────────────────────────────
256
+ {
257
+ Definition: require('./definitions/meadow-delete.json'),
258
+ Execute: function (pTask, pResolvedSettings, pExecutionContext, fCallback)
259
+ {
260
+ let tmpEntity = pResolvedSettings.Entity || '';
261
+ let tmpEndpoint = pResolvedSettings.Endpoint || '';
262
+ let tmpRecordID = pResolvedSettings.RecordID || '';
263
+
264
+ if (!tmpEntity || !tmpEndpoint || !tmpRecordID)
265
+ {
266
+ return fCallback(null, { EventToFire: 'Error', Outputs: {}, Log: ['MeadowDelete: Entity, Endpoint, and RecordID are required.'] });
267
+ }
268
+
269
+ let tmpRestClient = _getService(pTask, 'RestClient');
270
+ if (!tmpRestClient)
271
+ {
272
+ return fCallback(null, { EventToFire: 'Error', Outputs: {}, Log: ['MeadowDelete: RestClient service not found.'] });
273
+ }
274
+
275
+ tmpRestClient.delJSON({ url: `${tmpEndpoint}/${tmpEntity}/${tmpRecordID}`, headers: _parseHeaders(pResolvedSettings.Headers) },
276
+ function (pError, pResponse, pData)
277
+ {
278
+ if (pError)
279
+ {
280
+ return fCallback(null, { EventToFire: 'Error', Outputs: {}, Log: [`MeadowDelete: DELETE failed: ${pError.message}`] });
281
+ }
282
+
283
+ return fCallback(null, {
284
+ EventToFire: 'Done',
285
+ Outputs: {},
286
+ Log: [`MeadowDelete: deleted ${tmpEntity} #${tmpRecordID}`]
287
+ });
288
+ });
289
+ }
290
+ },
291
+
292
+ // ── meadow-count ───────────────────────────────────────────
293
+ {
294
+ Definition: require('./definitions/meadow-count.json'),
295
+ Execute: function (pTask, pResolvedSettings, pExecutionContext, fCallback)
296
+ {
297
+ let tmpEntity = pResolvedSettings.Entity || '';
298
+ let tmpEndpoint = pResolvedSettings.Endpoint || '';
299
+
300
+ if (!tmpEntity || !tmpEndpoint)
301
+ {
302
+ return fCallback(null, { EventToFire: 'Error', Outputs: {}, Log: ['MeadowCount: Entity and Endpoint are required.'] });
303
+ }
304
+
305
+ let tmpRestClient = _getService(pTask, 'RestClient');
306
+ if (!tmpRestClient)
307
+ {
308
+ return fCallback(null, { EventToFire: 'Error', Outputs: {}, Log: ['MeadowCount: RestClient service not found.'] });
309
+ }
310
+
311
+ let tmpURL = `${tmpEndpoint}/${tmpEntity}s/Count`;
312
+ if (pResolvedSettings.Filter)
313
+ {
314
+ tmpURL += '/FilteredTo/' + pResolvedSettings.Filter;
315
+ }
316
+
317
+ tmpRestClient.getJSON({ url: tmpURL, headers: _parseHeaders(pResolvedSettings.Headers) },
318
+ function (pError, pResponse, pData)
319
+ {
320
+ if (pError)
321
+ {
322
+ return fCallback(null, { EventToFire: 'Error', Outputs: {}, Log: [`MeadowCount: GET failed: ${pError.message}`] });
323
+ }
324
+
325
+ let tmpCount = (typeof(pData) === 'object' && pData !== null && 'Count' in pData) ? pData.Count : pData;
326
+ let tmpStateWrites = {};
327
+ if (pResolvedSettings.Destination)
328
+ {
329
+ tmpStateWrites[pResolvedSettings.Destination] = tmpCount;
330
+ }
331
+
332
+ return fCallback(null, {
333
+ EventToFire: 'Complete',
334
+ Outputs: { Count: tmpCount },
335
+ StateWrites: tmpStateWrites,
336
+ Log: [`MeadowCount: ${tmpEntity} count = ${tmpCount}`]
337
+ });
338
+ });
339
+ }
340
+ }
341
+ ];
@@ -0,0 +1,26 @@
1
+ {
2
+ "Hash": "meadow-count",
3
+ "Type": "meadow-count",
4
+ "Name": "Meadow Count",
5
+ "Description": "Counts records for an entity via a Meadow REST endpoint.",
6
+ "Category": "meadow",
7
+ "Capability": "Meadow API",
8
+ "Action": "Count",
9
+ "Tier": "Service",
10
+ "EventInputs": [{ "Name": "Trigger" }],
11
+ "EventOutputs": [
12
+ { "Name": "Complete" },
13
+ { "Name": "Error", "IsError": true }
14
+ ],
15
+ "SettingsInputs": [
16
+ { "Name": "Entity", "DataType": "String", "Required": true, "Description": "Entity/table name" },
17
+ { "Name": "Endpoint", "DataType": "String", "Required": true, "Description": "Base URL of the Meadow API" },
18
+ { "Name": "Destination", "DataType": "String", "Required": false, "Description": "State address to store the count" },
19
+ { "Name": "Headers", "DataType": "String", "Required": false, "Description": "JSON string of request headers" },
20
+ { "Name": "Filter", "DataType": "String", "Required": false, "Description": "Meadow filter expression" }
21
+ ],
22
+ "StateOutputs": [
23
+ { "Name": "Count", "DataType": "Number", "Description": "Number of records" }
24
+ ],
25
+ "DefaultSettings": { "Entity": "", "Endpoint": "", "Destination": "", "Headers": "", "Filter": "" }
26
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "Hash": "meadow-create",
3
+ "Type": "meadow-create",
4
+ "Name": "Meadow Create",
5
+ "Description": "Creates a new record via a Meadow REST endpoint.",
6
+ "Category": "meadow",
7
+ "Capability": "Meadow API",
8
+ "Action": "Create",
9
+ "Tier": "Service",
10
+ "EventInputs": [{ "Name": "Trigger" }],
11
+ "EventOutputs": [
12
+ { "Name": "Complete" },
13
+ { "Name": "Error", "IsError": true }
14
+ ],
15
+ "SettingsInputs": [
16
+ { "Name": "Entity", "DataType": "String", "Required": true, "Description": "Entity/table name" },
17
+ { "Name": "Endpoint", "DataType": "String", "Required": true, "Description": "Base URL of the Meadow API" },
18
+ { "Name": "DataAddress", "DataType": "String", "Required": false, "Description": "State address of the record data to create" },
19
+ { "Name": "Headers", "DataType": "String", "Required": false, "Description": "JSON string of request headers" },
20
+ { "Name": "Destination", "DataType": "String", "Required": false, "Description": "State address to store the created record" }
21
+ ],
22
+ "StateOutputs": [
23
+ { "Name": "Created", "DataType": "Object", "Description": "The created record" }
24
+ ],
25
+ "DefaultSettings": { "Entity": "", "Endpoint": "", "DataAddress": "", "Headers": "", "Destination": "" }
26
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "Hash": "meadow-delete",
3
+ "Type": "meadow-delete",
4
+ "Name": "Meadow Delete",
5
+ "Description": "Deletes a record by ID via a Meadow REST endpoint.",
6
+ "Category": "meadow",
7
+ "Capability": "Meadow API",
8
+ "Action": "Delete",
9
+ "Tier": "Service",
10
+ "EventInputs": [{ "Name": "Trigger" }],
11
+ "EventOutputs": [
12
+ { "Name": "Done" },
13
+ { "Name": "Error", "IsError": true }
14
+ ],
15
+ "SettingsInputs": [
16
+ { "Name": "Entity", "DataType": "String", "Required": true, "Description": "Entity/table name" },
17
+ { "Name": "Endpoint", "DataType": "String", "Required": true, "Description": "Base URL of the Meadow API" },
18
+ { "Name": "RecordID", "DataType": "String", "Required": true, "Description": "ID of the record to delete" },
19
+ { "Name": "Headers", "DataType": "String", "Required": false, "Description": "JSON string of request headers" }
20
+ ],
21
+ "StateOutputs": [],
22
+ "DefaultSettings": { "Entity": "", "Endpoint": "", "RecordID": "", "Headers": "" }
23
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "Hash": "meadow-read",
3
+ "Type": "meadow-read",
4
+ "Name": "Meadow Read",
5
+ "Description": "Reads a single record by ID from a Meadow REST endpoint.",
6
+ "Category": "meadow",
7
+ "Capability": "Meadow API",
8
+ "Action": "Read",
9
+ "Tier": "Service",
10
+ "EventInputs": [{ "Name": "Trigger" }],
11
+ "EventOutputs": [
12
+ { "Name": "Complete" },
13
+ { "Name": "Error", "IsError": true }
14
+ ],
15
+ "SettingsInputs": [
16
+ { "Name": "Entity", "DataType": "String", "Required": true, "Description": "Entity/table name" },
17
+ { "Name": "Endpoint", "DataType": "String", "Required": true, "Description": "Base URL of the Meadow API" },
18
+ { "Name": "RecordID", "DataType": "String", "Required": true, "Description": "ID of the record to read" },
19
+ { "Name": "Destination", "DataType": "String", "Required": false, "Description": "State address to store the record" },
20
+ { "Name": "Headers", "DataType": "String", "Required": false, "Description": "JSON string of request headers" }
21
+ ],
22
+ "StateOutputs": [
23
+ { "Name": "Record", "DataType": "Object", "Description": "The retrieved record" }
24
+ ],
25
+ "DefaultSettings": { "Entity": "", "Endpoint": "", "RecordID": "", "Destination": "", "Headers": "" }
26
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "Hash": "meadow-reads",
3
+ "Type": "meadow-reads",
4
+ "Name": "Meadow Reads",
5
+ "Description": "Reads multiple records from a Meadow REST endpoint with optional filter.",
6
+ "Category": "meadow",
7
+ "Capability": "Meadow API",
8
+ "Action": "ReadMany",
9
+ "Tier": "Service",
10
+ "EventInputs": [{ "Name": "Trigger" }],
11
+ "EventOutputs": [
12
+ { "Name": "Complete" },
13
+ { "Name": "Error", "IsError": true }
14
+ ],
15
+ "SettingsInputs": [
16
+ { "Name": "Entity", "DataType": "String", "Required": true, "Description": "Entity/table name" },
17
+ { "Name": "Endpoint", "DataType": "String", "Required": true, "Description": "Base URL of the Meadow API" },
18
+ { "Name": "Filter", "DataType": "String", "Required": false, "Description": "Meadow filter expression" },
19
+ { "Name": "Destination", "DataType": "String", "Required": false, "Description": "State address to store the records" },
20
+ { "Name": "Headers", "DataType": "String", "Required": false, "Description": "JSON string of request headers" },
21
+ { "Name": "PageSize", "DataType": "Number", "Required": false, "Description": "Number of records per page" },
22
+ { "Name": "PageNumber", "DataType": "Number", "Required": false, "Description": "Page number (0-indexed)" }
23
+ ],
24
+ "StateOutputs": [
25
+ { "Name": "Records", "DataType": "Array", "Description": "Retrieved records" },
26
+ { "Name": "RecordCount", "DataType": "Number", "Description": "Number of records returned" }
27
+ ],
28
+ "DefaultSettings": { "Entity": "", "Endpoint": "", "Filter": "", "Destination": "", "Headers": "", "PageSize": 100, "PageNumber": 0 }
29
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "Hash": "meadow-update",
3
+ "Type": "meadow-update",
4
+ "Name": "Meadow Update",
5
+ "Description": "Updates a record via a Meadow REST endpoint.",
6
+ "Category": "meadow",
7
+ "Capability": "Meadow API",
8
+ "Action": "Update",
9
+ "Tier": "Service",
10
+ "EventInputs": [{ "Name": "Trigger" }],
11
+ "EventOutputs": [
12
+ { "Name": "Complete" },
13
+ { "Name": "Error", "IsError": true }
14
+ ],
15
+ "SettingsInputs": [
16
+ { "Name": "Entity", "DataType": "String", "Required": true, "Description": "Entity/table name" },
17
+ { "Name": "Endpoint", "DataType": "String", "Required": true, "Description": "Base URL of the Meadow API" },
18
+ { "Name": "DataAddress", "DataType": "String", "Required": false, "Description": "State address of the record data to update" },
19
+ { "Name": "Headers", "DataType": "String", "Required": false, "Description": "JSON string of request headers" },
20
+ { "Name": "Destination", "DataType": "String", "Required": false, "Description": "State address to store the updated record" }
21
+ ],
22
+ "StateOutputs": [
23
+ { "Name": "Updated", "DataType": "Object", "Description": "The updated record" }
24
+ ],
25
+ "DefaultSettings": { "Entity": "", "Endpoint": "", "DataAddress": "", "Headers": "", "Destination": "" }
26
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Task configurations for the "Shell" capability.
3
+ *
4
+ * Contains:
5
+ * - command — Executes a shell command on the server.
6
+ */
7
+
8
+ const libChildProcess = require('child_process');
9
+ const libPath = require('path');
10
+
11
+
12
+ module.exports =
13
+ [
14
+ // ── command ─────────────────────────────────────────────────
15
+ {
16
+ Definition: require('./definitions/command.json'),
17
+ Execute: function (pTask, pResolvedSettings, pExecutionContext, fCallback)
18
+ {
19
+ let tmpCommand = pResolvedSettings.Command || '';
20
+ let tmpParameters = pResolvedSettings.Parameters || '';
21
+
22
+ if (!tmpCommand)
23
+ {
24
+ return fCallback(null, { EventToFire: 'Error', Outputs: { StdOut: '', StdErr: '', ExitCode: -1 }, Log: ['Command: no command specified.'] });
25
+ }
26
+
27
+ let tmpFullCommand = tmpParameters ? (tmpCommand + ' ' + tmpParameters) : tmpCommand;
28
+
29
+ let tmpBasePath = pExecutionContext.StagingPath || process.cwd();
30
+ let tmpCwd = pResolvedSettings.WorkingDirectory
31
+ ? libPath.resolve(tmpBasePath, pResolvedSettings.WorkingDirectory)
32
+ : tmpBasePath;
33
+
34
+ let tmpExecOptions = { cwd: tmpCwd, timeout: pResolvedSettings.TimeoutMs || 300000 };
35
+
36
+ if (pResolvedSettings.Environment)
37
+ {
38
+ let tmpEnv = {};
39
+ try { tmpEnv = JSON.parse(pResolvedSettings.Environment); } catch(e) {}
40
+ tmpExecOptions.env = Object.assign({}, process.env, tmpEnv);
41
+ }
42
+
43
+ libChildProcess.exec(tmpFullCommand, tmpExecOptions,
44
+ function (pError, pStdOut, pStdErr)
45
+ {
46
+ if (pError)
47
+ {
48
+ return fCallback(null, {
49
+ EventToFire: 'Error',
50
+ Outputs: { StdOut: pStdOut || '', StdErr: pStdErr || '', ExitCode: pError.code || 1 },
51
+ Log: [`Command failed: ${pError.message}`, pStdErr || '']
52
+ });
53
+ }
54
+
55
+ return fCallback(null, {
56
+ EventToFire: 'Complete',
57
+ Outputs: { StdOut: pStdOut || '', StdErr: pStdErr || '', ExitCode: 0 },
58
+ Log: [`Command executed: ${tmpFullCommand}`]
59
+ });
60
+ });
61
+ }
62
+ }
63
+ ];
@@ -0,0 +1,29 @@
1
+ {
2
+ "Hash": "command",
3
+ "Type": "command",
4
+ "Name": "Command",
5
+ "Description": "Executes a shell command on the server.",
6
+ "Category": "control",
7
+ "Capability": "Shell",
8
+ "Action": "Execute",
9
+ "Tier": "Platform",
10
+ "EventInputs": [{ "Name": "Trigger" }],
11
+ "EventOutputs": [
12
+ { "Name": "Complete" },
13
+ { "Name": "Error", "IsError": true }
14
+ ],
15
+ "SettingsInputs": [
16
+ { "Name": "Command", "DataType": "String", "Required": true, "Description": "Shell command to execute" },
17
+ { "Name": "Parameters", "DataType": "String", "Required": false, "Description": "Command-line parameters" },
18
+ { "Name": "Description", "DataType": "String", "Required": false, "Description": "Human-readable description of this command" },
19
+ { "Name": "WorkingDirectory", "DataType": "String", "Required": false, "Description": "Working directory for the command" },
20
+ { "Name": "TimeoutMs", "DataType": "Number", "Required": false, "Description": "Command timeout in milliseconds (default 300000)" },
21
+ { "Name": "Environment", "DataType": "String", "Required": false, "Description": "JSON object of environment variables to set" }
22
+ ],
23
+ "StateOutputs": [
24
+ { "Name": "StdOut", "DataType": "String", "Description": "Standard output from the command" },
25
+ { "Name": "StdErr", "DataType": "String", "Description": "Standard error from the command" },
26
+ { "Name": "ExitCode", "DataType": "Number", "Description": "Exit code of the command" }
27
+ ],
28
+ "DefaultSettings": { "Command": "", "Parameters": "", "Description": "", "WorkingDirectory": "", "TimeoutMs": 300000, "Environment": "" }
29
+ }