ultravisor 1.0.4 → 1.0.9

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 (258) hide show
  1. package/docs/_sidebar.md +25 -0
  2. package/docs/css/docuserve.css +73 -0
  3. package/docs/features/api.md +142 -0
  4. package/docs/features/beacon-authentication.md +209 -0
  5. package/docs/features/beacon-providers.md +1299 -0
  6. package/docs/features/beacons.md +582 -0
  7. package/docs/features/capabilities.md +193 -0
  8. package/docs/features/case-study-retold-remote.md +223 -0
  9. package/docs/features/llm-model-setup.md +505 -0
  10. package/docs/features/llm.md +262 -0
  11. package/docs/features/platform-cards.md +145 -0
  12. package/docs/features/reachability-matrix.md +145 -0
  13. package/docs/features/tasks-content-system.md +110 -0
  14. package/docs/features/tasks-data-transform.md +233 -0
  15. package/docs/features/tasks-extension.md +36 -0
  16. package/docs/features/tasks-file-system.md +306 -0
  17. package/docs/features/tasks-flow-control.md +125 -0
  18. package/docs/features/tasks-http-client.md +119 -0
  19. package/docs/features/tasks-llm.md +118 -0
  20. package/docs/features/tasks-meadow-api.md +163 -0
  21. package/docs/features/tasks-user-interaction.md +49 -0
  22. package/docs/features/tasks.md +14 -0
  23. package/docs/features/universal-addressing.md +117 -0
  24. package/docs/index.html +1 -1
  25. package/docs/retold-catalog.json +437 -1
  26. package/docs/retold-keyword-index.json +57721 -5
  27. package/operation-library/api-data-pipeline.json +363 -0
  28. package/operation-library/beacon-remote-command.json +72 -0
  29. package/operation-library/conditional-file-backup.json +364 -0
  30. package/operation-library/config-processor.json +136 -0
  31. package/operation-library/csv-data-analysis.json +767 -0
  32. package/operation-library/csv-to-json.json +472 -0
  33. package/operation-library/directory-inventory.json +389 -0
  34. package/operation-library/expression-calculator.json +114 -0
  35. package/operation-library/file-search-replace.json +175 -0
  36. package/operation-library/git-status-report.json +368 -0
  37. package/operation-library/health-check-ping.json +349 -0
  38. package/operation-library/json-config-merge.json +388 -0
  39. package/operation-library/llm-embedding-tool-use.json +314 -0
  40. package/operation-library/llm-multi-turn-analysis.json +322 -0
  41. package/operation-library/llm-summarize.json +264 -0
  42. package/operation-library/log-line-counter.json +571 -0
  43. package/operation-library/meadow-crud-lifecycle.json +726 -0
  44. package/operation-library/npm-project-validator.json +193 -0
  45. package/operation-library/rest-api-orchestrator.json +633 -0
  46. package/operation-library/shell-system-info.json +137 -0
  47. package/operation-library/simple-echo.json +299 -0
  48. package/operation-library/template-processor.json +664 -0
  49. package/operation-library/text-sanitizer.json +176 -0
  50. package/package.json +11 -7
  51. package/source/Ultravisor.cjs +18 -10
  52. package/source/beacon/Ultravisor-Beacon-CLI.cjs +143 -0
  53. package/source/beacon/Ultravisor-Beacon-CapabilityProvider.cjs +129 -0
  54. package/source/beacon/Ultravisor-Beacon-Client.cjs +582 -0
  55. package/source/beacon/Ultravisor-Beacon-Executor.cjs +500 -0
  56. package/source/beacon/Ultravisor-Beacon-ProviderRegistry.cjs +366 -0
  57. package/source/beacon/providers/Ultravisor-Beacon-Provider-FileSystem.cjs +331 -0
  58. package/source/beacon/providers/Ultravisor-Beacon-Provider-LLM.cjs +966 -0
  59. package/source/beacon/providers/Ultravisor-Beacon-Provider-Shell.cjs +95 -0
  60. package/source/cli/Ultravisor-CLIProgram.cjs +74 -3
  61. package/source/config/Ultravisor-Default-Command-Configuration.cjs +9 -1
  62. package/source/services/Ultravisor-Beacon-Coordinator.cjs +1994 -0
  63. package/source/services/Ultravisor-Beacon-Reachability.cjs +403 -0
  64. package/source/services/Ultravisor-ExecutionEngine.cjs +420 -9
  65. package/source/services/Ultravisor-ExecutionManifest.cjs +618 -5
  66. package/source/services/Ultravisor-Hypervisor-State.cjs +50 -0
  67. package/source/services/Ultravisor-Hypervisor.cjs +155 -0
  68. package/source/services/Ultravisor-Schedule-Persistence-Base.cjs +45 -0
  69. package/source/services/Ultravisor-StateManager.cjs +12 -0
  70. package/source/services/Ultravisor-TaskTypeRegistry.cjs +95 -25
  71. package/source/services/persistence/Ultravisor-Beacon-QueueJournal.cjs +474 -0
  72. package/source/services/persistence/Ultravisor-Schedule-Persistence-JSONFile.cjs +140 -0
  73. package/source/services/tasks/Ultravisor-BuiltIn-TaskConfigs.cjs +21 -0
  74. package/source/services/tasks/Ultravisor-TaskHelper-BeaconDispatch.cjs +116 -0
  75. package/source/services/tasks/Ultravisor-TaskType-Base.cjs +20 -0
  76. package/source/services/tasks/content-system/Ultravisor-TaskConfigs-ContentSystem.cjs +90 -0
  77. package/source/services/tasks/content-system/definitions/content-create-folder.json +24 -0
  78. package/source/services/tasks/content-system/definitions/content-list-files.json +27 -0
  79. package/source/services/tasks/content-system/definitions/content-read-file.json +26 -0
  80. package/source/services/tasks/content-system/definitions/content-save-file.json +26 -0
  81. package/source/services/tasks/data-collection/Ultravisor-TaskConfigs-DataCollection.cjs +66 -0
  82. package/source/services/tasks/data-collection/definitions/event-counter.json +26 -0
  83. package/source/services/tasks/data-transform/Ultravisor-TaskConfigs-DataTransform.cjs +749 -0
  84. package/source/services/tasks/{data → data-transform}/Ultravisor-TaskType-ReplaceString.cjs +27 -29
  85. package/source/services/tasks/{data → data-transform}/Ultravisor-TaskType-StringAppender.cjs +13 -24
  86. package/source/services/tasks/data-transform/definitions/add-field-mapping.json +22 -0
  87. package/source/services/tasks/data-transform/definitions/comprehension-intersect.json +24 -0
  88. package/source/services/tasks/data-transform/definitions/csv-transform.json +24 -0
  89. package/source/services/tasks/data-transform/definitions/expression-solver.json +20 -0
  90. package/source/services/tasks/data-transform/definitions/histogram.json +23 -0
  91. package/source/services/tasks/data-transform/definitions/parse-csv.json +27 -0
  92. package/source/services/tasks/data-transform/definitions/replace-string.json +27 -0
  93. package/source/services/tasks/data-transform/definitions/set-value.json +23 -0
  94. package/source/services/tasks/data-transform/definitions/set-values.json +17 -0
  95. package/source/services/tasks/data-transform/definitions/string-appender.json +22 -0
  96. package/source/services/tasks/data-transform/definitions/template-string.json +20 -0
  97. package/source/services/tasks/extension/Ultravisor-TaskConfigs-Extension.cjs +138 -0
  98. package/source/services/tasks/extension/definitions/beacon-dispatch.json +32 -0
  99. package/source/services/tasks/file-system/Ultravisor-TaskConfigs-FileSystem.cjs +509 -0
  100. package/source/services/tasks/{file-io → file-system}/Ultravisor-TaskType-ReadFile.cjs +27 -34
  101. package/source/services/tasks/file-system/Ultravisor-TaskType-ReadFileBuffered.cjs +123 -0
  102. package/source/services/tasks/{file-io → file-system}/Ultravisor-TaskType-WriteFile.cjs +26 -37
  103. package/source/services/tasks/file-system/definitions/copy-file.json +27 -0
  104. package/source/services/tasks/file-system/definitions/list-files.json +27 -0
  105. package/source/services/tasks/file-system/definitions/read-file-buffered.json +31 -0
  106. package/source/services/tasks/file-system/definitions/read-file.json +26 -0
  107. package/source/services/tasks/file-system/definitions/read-json.json +23 -0
  108. package/source/services/tasks/file-system/definitions/write-file.json +29 -0
  109. package/source/services/tasks/file-system/definitions/write-json.json +30 -0
  110. package/source/services/tasks/flow-control/Ultravisor-TaskConfigs-FlowControl.cjs +353 -0
  111. package/source/services/tasks/{control → flow-control}/Ultravisor-TaskType-IfConditional.cjs +1 -24
  112. package/source/services/tasks/{control → flow-control}/Ultravisor-TaskType-LaunchOperation.cjs +27 -28
  113. package/source/services/tasks/{control → flow-control}/Ultravisor-TaskType-SplitExecute.cjs +9 -29
  114. package/source/services/tasks/flow-control/definitions/if-conditional.json +25 -0
  115. package/source/services/tasks/flow-control/definitions/launch-operation.json +27 -0
  116. package/source/services/tasks/flow-control/definitions/split-execute.json +32 -0
  117. package/source/services/tasks/http-client/Ultravisor-TaskConfigs-HttpClient.cjs +366 -0
  118. package/source/services/tasks/http-client/definitions/add-header.json +21 -0
  119. package/source/services/tasks/http-client/definitions/get-json.json +26 -0
  120. package/source/services/tasks/http-client/definitions/get-text.json +26 -0
  121. package/source/services/tasks/http-client/definitions/rest-request.json +32 -0
  122. package/source/services/tasks/http-client/definitions/send-json.json +28 -0
  123. package/source/services/tasks/llm/Ultravisor-TaskConfigs-LLM.cjs +739 -0
  124. package/source/services/tasks/llm/definitions/add-message.json +21 -0
  125. package/source/services/tasks/llm/definitions/add-tool.json +22 -0
  126. package/source/services/tasks/llm/definitions/llm-chat-completion.json +46 -0
  127. package/source/services/tasks/llm/definitions/llm-embedding.json +31 -0
  128. package/source/services/tasks/llm/definitions/llm-tool-use.json +42 -0
  129. package/source/services/tasks/meadow-api/Ultravisor-TaskConfigs-MeadowApi.cjs +341 -0
  130. package/source/services/tasks/meadow-api/definitions/meadow-count.json +26 -0
  131. package/source/services/tasks/meadow-api/definitions/meadow-create.json +26 -0
  132. package/source/services/tasks/meadow-api/definitions/meadow-delete.json +23 -0
  133. package/source/services/tasks/meadow-api/definitions/meadow-read.json +26 -0
  134. package/source/services/tasks/meadow-api/definitions/meadow-reads.json +29 -0
  135. package/source/services/tasks/meadow-api/definitions/meadow-update.json +26 -0
  136. package/source/services/tasks/platform/Ultravisor-TaskConfigs-Platform.cjs +449 -0
  137. package/source/services/tasks/platform/definitions/base64-decode.json +24 -0
  138. package/source/services/tasks/platform/definitions/base64-encode.json +25 -0
  139. package/source/services/tasks/platform/definitions/file-transfer.json +26 -0
  140. package/source/services/tasks/platform/definitions/resolve-address.json +32 -0
  141. package/source/services/tasks/platform/definitions/send-result.json +24 -0
  142. package/source/services/tasks/shell/Ultravisor-TaskConfigs-Shell.cjs +174 -0
  143. package/source/services/tasks/shell/definitions/add-env-var.json +21 -0
  144. package/source/services/tasks/shell/definitions/command.json +29 -0
  145. package/source/services/tasks/user-interaction/Ultravisor-TaskConfigs-UserInteraction.cjs +116 -0
  146. package/source/services/tasks/{interaction → user-interaction}/Ultravisor-TaskType-ErrorMessage.cjs +19 -18
  147. package/source/services/tasks/{interaction → user-interaction}/Ultravisor-TaskType-ValueInput.cjs +4 -19
  148. package/source/services/tasks/user-interaction/definitions/add-option.json +21 -0
  149. package/source/services/tasks/user-interaction/definitions/error-message.json +18 -0
  150. package/source/services/tasks/user-interaction/definitions/value-input.json +23 -0
  151. package/source/web_server/Ultravisor-API-Server.cjs +1583 -54
  152. package/test/Ultravisor_browser_tests.js +27 -20
  153. package/test/Ultravisor_operation_library_tests.js +894 -0
  154. package/test/Ultravisor_tests.js +5170 -25
  155. package/test/workflows/test-content-concatenate-all.json +339 -0
  156. package/test/workflows/test-content-full-pipeline.json +159 -0
  157. package/test/workflows/test-content-list-files.json +76 -0
  158. package/test/workflows/test-content-save-and-read.json +106 -0
  159. package/webinterface/build/build-codemirror-bundle.js +30 -0
  160. package/webinterface/build/codemirror-entry.js +13 -0
  161. package/webinterface/css/ultravisor-themes.css +668 -0
  162. package/webinterface/css/ultravisor.css +15 -15
  163. package/webinterface/docs/card-help/beacon-dispatch.md +30 -0
  164. package/webinterface/docs/card-help/command.md +27 -0
  165. package/webinterface/docs/card-help/comprehension-intersect.md +24 -0
  166. package/webinterface/docs/card-help/content-create-folder.md +22 -0
  167. package/webinterface/docs/card-help/content-list-files.md +25 -0
  168. package/webinterface/docs/card-help/content-read-file.md +24 -0
  169. package/webinterface/docs/card-help/content-save-file.md +24 -0
  170. package/webinterface/docs/card-help/copy-file.md +25 -0
  171. package/webinterface/docs/card-help/csv-transform.md +24 -0
  172. package/webinterface/docs/card-help/end.md +11 -0
  173. package/webinterface/docs/card-help/error-message.md +16 -0
  174. package/webinterface/docs/card-help/expression-solver.md +21 -0
  175. package/webinterface/docs/card-help/get-json.md +24 -0
  176. package/webinterface/docs/card-help/get-text.md +24 -0
  177. package/webinterface/docs/card-help/histogram.md +23 -0
  178. package/webinterface/docs/card-help/if-conditional.md +23 -0
  179. package/webinterface/docs/card-help/launch-operation.md +25 -0
  180. package/webinterface/docs/card-help/list-files.md +25 -0
  181. package/webinterface/docs/card-help/llm-chat-completion.md +43 -0
  182. package/webinterface/docs/card-help/llm-embedding.md +24 -0
  183. package/webinterface/docs/card-help/llm-tool-use.md +39 -0
  184. package/webinterface/docs/card-help/meadow-count.md +24 -0
  185. package/webinterface/docs/card-help/meadow-create.md +24 -0
  186. package/webinterface/docs/card-help/meadow-delete.md +19 -0
  187. package/webinterface/docs/card-help/meadow-read.md +24 -0
  188. package/webinterface/docs/card-help/meadow-reads.md +27 -0
  189. package/webinterface/docs/card-help/meadow-update.md +24 -0
  190. package/webinterface/docs/card-help/parse-csv.md +27 -0
  191. package/webinterface/docs/card-help/read-file-buffered.md +29 -0
  192. package/webinterface/docs/card-help/read-file.md +24 -0
  193. package/webinterface/docs/card-help/read-json.md +21 -0
  194. package/webinterface/docs/card-help/replace-string.md +25 -0
  195. package/webinterface/docs/card-help/rest-request.md +30 -0
  196. package/webinterface/docs/card-help/send-json.md +26 -0
  197. package/webinterface/docs/card-help/set-values.md +16 -0
  198. package/webinterface/docs/card-help/split-execute.md +35 -0
  199. package/webinterface/docs/card-help/start.md +11 -0
  200. package/webinterface/docs/card-help/string-appender.md +22 -0
  201. package/webinterface/docs/card-help/template-string.md +21 -0
  202. package/webinterface/docs/card-help/value-input.md +24 -0
  203. package/webinterface/docs/card-help/write-file.md +27 -0
  204. package/webinterface/docs/card-help/write-json.md +28 -0
  205. package/webinterface/html/index.html +7 -0
  206. package/webinterface/package.json +23 -9
  207. package/webinterface/source/Pict-Application-Ultravisor.js +666 -9
  208. package/webinterface/source/Ultravisor-TimingUtils.js +99 -0
  209. package/webinterface/source/card-help-content.js +46 -0
  210. package/webinterface/source/cards/Ultravisor-BuiltIn-CardConfigs.js +174 -0
  211. package/webinterface/source/cards/Ultravisor-CardConfigGenerator.js +431 -0
  212. package/webinterface/source/panels/Ultravisor-CardSettingsPanel.js +1060 -0
  213. package/webinterface/source/providers/PictRouter-Ultravisor-Configuration.json +21 -1
  214. package/webinterface/source/views/PictView-Ultravisor-BeaconList.js +853 -0
  215. package/webinterface/source/views/PictView-Ultravisor-BottomBar.js +5 -5
  216. package/webinterface/source/views/PictView-Ultravisor-Dashboard.js +37 -20
  217. package/webinterface/source/views/PictView-Ultravisor-Documentation.js +856 -0
  218. package/webinterface/source/views/PictView-Ultravisor-FlowEditor.js +1171 -101
  219. package/webinterface/source/views/PictView-Ultravisor-ManifestDetail.js +733 -0
  220. package/webinterface/source/views/PictView-Ultravisor-ManifestList.js +545 -95
  221. package/webinterface/source/views/PictView-Ultravisor-OperationDescriptionEditor.js +68 -0
  222. package/webinterface/source/views/PictView-Ultravisor-OperationEdit.js +4 -4
  223. package/webinterface/source/views/PictView-Ultravisor-OperationList.js +325 -52
  224. package/webinterface/source/views/PictView-Ultravisor-PendingInput.js +257 -32
  225. package/webinterface/source/views/PictView-Ultravisor-ReachabilityMap.js +399 -0
  226. package/webinterface/source/views/PictView-Ultravisor-Schedule.js +539 -32
  227. package/webinterface/source/views/PictView-Ultravisor-TimingView.js +311 -62
  228. package/webinterface/source/views/PictView-Ultravisor-TopBar.js +255 -23
  229. package/webinterface/theme-sampler.html +645 -0
  230. package/.ultravisor.json +0 -426
  231. package/source/services/tasks/data/Ultravisor-TaskType-SetValues.cjs +0 -81
  232. package/webinterface/source/cards/FlowCard-CSVTransform.js +0 -43
  233. package/webinterface/source/cards/FlowCard-Command.js +0 -86
  234. package/webinterface/source/cards/FlowCard-ComprehensionIntersect.js +0 -40
  235. package/webinterface/source/cards/FlowCard-Conditional.js +0 -87
  236. package/webinterface/source/cards/FlowCard-CopyFile.js +0 -55
  237. package/webinterface/source/cards/FlowCard-End.js +0 -29
  238. package/webinterface/source/cards/FlowCard-GetJSON.js +0 -55
  239. package/webinterface/source/cards/FlowCard-GetText.js +0 -54
  240. package/webinterface/source/cards/FlowCard-Histogram.js +0 -176
  241. package/webinterface/source/cards/FlowCard-LaunchOperation.js +0 -82
  242. package/webinterface/source/cards/FlowCard-ListFiles.js +0 -55
  243. package/webinterface/source/cards/FlowCard-MeadowCount.js +0 -44
  244. package/webinterface/source/cards/FlowCard-MeadowCreate.js +0 -44
  245. package/webinterface/source/cards/FlowCard-MeadowDelete.js +0 -45
  246. package/webinterface/source/cards/FlowCard-MeadowRead.js +0 -46
  247. package/webinterface/source/cards/FlowCard-MeadowReads.js +0 -46
  248. package/webinterface/source/cards/FlowCard-MeadowUpdate.js +0 -44
  249. package/webinterface/source/cards/FlowCard-ParseCSV.js +0 -85
  250. package/webinterface/source/cards/FlowCard-ReadJSON.js +0 -54
  251. package/webinterface/source/cards/FlowCard-ReadText.js +0 -54
  252. package/webinterface/source/cards/FlowCard-RestRequest.js +0 -59
  253. package/webinterface/source/cards/FlowCard-SendJSON.js +0 -57
  254. package/webinterface/source/cards/FlowCard-Solver.js +0 -77
  255. package/webinterface/source/cards/FlowCard-Start.js +0 -29
  256. package/webinterface/source/cards/FlowCard-TemplateString.js +0 -77
  257. package/webinterface/source/cards/FlowCard-WriteJSON.js +0 -54
  258. package/webinterface/source/cards/FlowCard-WriteText.js +0 -54
package/docs/_sidebar.md CHANGED
@@ -7,12 +7,37 @@
7
7
  - Features
8
8
 
9
9
  - [Tasks](features/tasks.md)
10
+ - [Capabilities](features/capabilities.md)
11
+ - [Beacons](features/beacons.md)
12
+ - [Building Beacon Providers](features/beacon-providers.md)
13
+ - [Beacon Authentication](features/beacon-authentication.md)
14
+ - [Universal Addressing](features/universal-addressing.md)
15
+ - [Reachability Matrix](features/reachability-matrix.md)
16
+ - [Platform Cards](features/platform-cards.md)
17
+ - [LLM Integration](features/llm.md)
18
+ - [LLM Model Setup Guide](features/llm-model-setup.md)
10
19
  - [Operations](features/operations.md)
11
20
  - [Scheduling](features/scheduling.md)
12
21
  - [Manifests](features/manifests.md)
13
22
 
23
+ - Task Reference
24
+
25
+ - [Data Transform](features/tasks-data-transform.md)
26
+ - [File System](features/tasks-file-system.md)
27
+ - [Flow Control](features/tasks-flow-control.md)
28
+ - [HTTP Client](features/tasks-http-client.md)
29
+ - [LLM](features/tasks-llm.md)
30
+ - [Meadow API](features/tasks-meadow-api.md)
31
+ - [Content System](features/tasks-content-system.md)
32
+ - [Extension](features/tasks-extension.md)
33
+ - [User Interaction](features/tasks-user-interaction.md)
34
+
14
35
  - Reference
15
36
 
16
37
  - [API Server](features/api.md)
17
38
  - [CLI Commands](features/cli.md)
18
39
  - [Configuration](features/configuration.md)
40
+
41
+ - Case Studies
42
+
43
+ - [retold-remote + orator-conversion](features/case-study-retold-remote.md)
@@ -0,0 +1,73 @@
1
+ /* ============================================================================
2
+ Pict Docuserve - Base Styles
3
+ ============================================================================ */
4
+
5
+ /* Reset and base */
6
+ *, *::before, *::after {
7
+ box-sizing: border-box;
8
+ }
9
+
10
+ html, body {
11
+ margin: 0;
12
+ padding: 0;
13
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
14
+ font-size: 16px;
15
+ line-height: 1.5;
16
+ color: #423D37;
17
+ background-color: #fff;
18
+ -webkit-font-smoothing: antialiased;
19
+ -moz-osx-font-smoothing: grayscale;
20
+ }
21
+
22
+ /* Typography */
23
+ h1, h2, h3, h4, h5, h6 {
24
+ margin-top: 0;
25
+ line-height: 1.3;
26
+ }
27
+
28
+ a {
29
+ color: #2E7D74;
30
+ text-decoration: none;
31
+ }
32
+
33
+ a:hover {
34
+ color: #256861;
35
+ }
36
+
37
+ /* Application container */
38
+ #Docuserve-Application-Container {
39
+ min-height: 100vh;
40
+ }
41
+
42
+ /* Utility: scrollbar styling */
43
+ ::-webkit-scrollbar {
44
+ width: 8px;
45
+ }
46
+
47
+ ::-webkit-scrollbar-track {
48
+ background: #F5F0E8;
49
+ }
50
+
51
+ ::-webkit-scrollbar-thumb {
52
+ background: #D4CCBE;
53
+ border-radius: 4px;
54
+ }
55
+
56
+ ::-webkit-scrollbar-thumb:hover {
57
+ background: #B5AA9A;
58
+ }
59
+
60
+ /* Responsive adjustments */
61
+ @media (max-width: 768px) {
62
+ html {
63
+ font-size: 14px;
64
+ }
65
+
66
+ #Docuserve-Sidebar-Container {
67
+ display: none;
68
+ }
69
+
70
+ .docuserve-body {
71
+ flex-direction: column;
72
+ }
73
+ }
@@ -210,6 +210,148 @@ Returns an array of all operation manifests from the current session.
210
210
  }
211
211
  ```
212
212
 
213
+ ### Beacons
214
+
215
+ | Method | Path | Description |
216
+ |--------|------|-------------|
217
+ | `POST` | `/Beacon/Register` | Register a new Beacon worker |
218
+ | `GET` | `/Beacon` | List all registered Beacons |
219
+ | `GET` | `/Beacon/:BeaconID` | Get a specific Beacon |
220
+ | `DELETE` | `/Beacon/:BeaconID` | Deregister a Beacon |
221
+ | `POST` | `/Beacon/:BeaconID/Heartbeat` | Send a Beacon heartbeat |
222
+ | `POST` | `/Beacon/Work/Poll` | Poll for available work |
223
+ | `POST` | `/Beacon/Work/:WorkItemHash/Complete` | Report work item completion |
224
+ | `POST` | `/Beacon/Work/:WorkItemHash/Error` | Report work item failure |
225
+ | `POST` | `/Beacon/Work/:WorkItemHash/Progress` | Report work item progress |
226
+ | `POST` | `/Beacon/Work/:WorkItemHash/Upload` | Upload a binary result file for a work item |
227
+ | `GET` | `/Beacon/Work` | List all work items |
228
+ | `GET` | `/Beacon/Affinity` | List active affinity bindings |
229
+ | `GET` | `/Beacon/Reachability` | Get the connectivity matrix between all beacon pairs |
230
+ | `POST` | `/Beacon/Reachability/Probe` | Trigger connectivity probes between all online beacon pairs |
231
+
232
+ #### POST /Beacon/Register
233
+
234
+ Register a new Beacon worker with the coordinator.
235
+
236
+ ```bash
237
+ curl -X POST http://localhost:54321/Beacon/Register \
238
+ -H "Content-Type: application/json" \
239
+ -d '{
240
+ "Name": "GPU-Worker-1",
241
+ "Capabilities": ["Shell", "FileSystem"],
242
+ "MaxConcurrent": 4
243
+ }'
244
+ ```
245
+
246
+ Response:
247
+
248
+ ```json
249
+ {
250
+ "BeaconID": "beacon-abc123",
251
+ "Name": "GPU-Worker-1",
252
+ "Capabilities": ["Shell", "FileSystem"],
253
+ "MaxConcurrent": 4,
254
+ "Status": "Online"
255
+ }
256
+ ```
257
+
258
+ #### POST /Beacon/Work/Poll
259
+
260
+ Poll for available work matching the Beacon's capabilities.
261
+
262
+ ```bash
263
+ curl -X POST http://localhost:54321/Beacon/Work/Poll \
264
+ -H "Content-Type: application/json" \
265
+ -d '{ "BeaconID": "beacon-abc123" }'
266
+ ```
267
+
268
+ Response:
269
+
270
+ ```json
271
+ {
272
+ "WorkItem": {
273
+ "WorkItemHash": "wi-xyz789",
274
+ "Capability": "Shell",
275
+ "Action": "Execute",
276
+ "Settings": { "Command": "echo hello" }
277
+ }
278
+ }
279
+ ```
280
+
281
+ #### POST /Beacon/Work/:WorkItemHash/Complete
282
+
283
+ Report successful completion of a work item.
284
+
285
+ ```bash
286
+ curl -X POST http://localhost:54321/Beacon/Work/wi-xyz789/Complete \
287
+ -H "Content-Type: application/json" \
288
+ -d '{
289
+ "Outputs": { "StdOut": "hello\n", "ExitCode": 0 },
290
+ "Log": ["Command executed successfully"]
291
+ }'
292
+ ```
293
+
294
+ #### POST /Beacon/Work/:WorkItemHash/Upload
295
+
296
+ Upload a binary result file for a work item. The Beacon sends raw file
297
+ bytes with `Content-Type: application/octet-stream` and an
298
+ `X-Output-Filename` header. The file is written to the operation's
299
+ staging directory. Requires session auth.
300
+
301
+ ```bash
302
+ curl -X POST http://localhost:54321/Beacon/Work/wi-xyz789/Upload \
303
+ -H "Content-Type: application/octet-stream" \
304
+ -H "X-Output-Filename: result.bin" \
305
+ --data-binary @result.bin
306
+ ```
307
+
308
+ Response:
309
+
310
+ ```json
311
+ {
312
+ "Status": "Uploaded",
313
+ "WorkItemHash": "wi-xyz789",
314
+ "FilePath": "/data/staging/my-pipeline/result.bin"
315
+ }
316
+ ```
317
+
318
+ #### GET /Beacon/Reachability
319
+
320
+ Returns the connectivity matrix between all beacon pairs. No auth
321
+ required (management UI).
322
+
323
+ ```bash
324
+ curl http://localhost:54321/Beacon/Reachability
325
+ ```
326
+
327
+ Response:
328
+
329
+ ```json
330
+ [
331
+ {
332
+ "SourceBeaconID": "beacon-abc123",
333
+ "TargetBeaconID": "beacon-def456",
334
+ "Status": "Reachable",
335
+ "ProbeLatencyMs": 12,
336
+ "LastProbeAt": "2026-03-21T10:00:00.000Z",
337
+ "ProbeURL": "http://192.168.1.10:54322/probe"
338
+ }
339
+ ]
340
+ ```
341
+
342
+ #### POST /Beacon/Reachability/Probe
343
+
344
+ Triggers connectivity probes between all online beacon pairs. Returns
345
+ the updated reachability matrix after probes complete. No auth required
346
+ (management UI).
347
+
348
+ ```bash
349
+ curl -X POST http://localhost:54321/Beacon/Reachability/Probe
350
+ ```
351
+
352
+ Response: Array of reachability records (same shape as
353
+ `GET /Beacon/Reachability`).
354
+
213
355
  ## Error Responses
214
356
 
215
357
  All error responses follow this format:
@@ -0,0 +1,209 @@
1
+ # Beacon Authentication
2
+
3
+ ## Overview
4
+
5
+ Ultravisor uses Orator Authentication to manage beacon identity and connectivity. Beacons authenticate with the server before registering, receive a session cookie, and use it on all subsequent requests. If a session expires or the server restarts, beacons automatically re-authenticate and re-register — eliminating "unknown beacon" errors and providing graceful reconnection.
6
+
7
+ ## Architecture
8
+
9
+ ### Session-Based Identity
10
+
11
+ Rather than a custom identity scheme, beacons use Orator's cookie-based session system:
12
+
13
+ ```
14
+ Beacon Client Ultravisor Server
15
+ │ │
16
+ │ POST /1.0/Authenticate │
17
+ │ { UserName: "gpu-worker-1" } │
18
+ │───────────────────────────────────────▸ │
19
+ │ │ Create session
20
+ │ ◂─── 200 { LoggedIn: true } │ Set-Cookie: SessionID=<uuid>
21
+ │ │
22
+ │ POST /Beacon/Register │
23
+ │ Cookie: SessionID=<uuid> │
24
+ │ { Capabilities, MaxConcurrent, Tags } │
25
+ │───────────────────────────────────────▸ │
26
+ │ │ Create/reclaim beacon record
27
+ │ ◂─── 200 { BeaconID: "bcn-..." } │ Associate with session
28
+ │ │
29
+ │ POST /Beacon/Work/Poll │
30
+ │ Cookie: SessionID=<uuid> │ (every 5s)
31
+ │───────────────────────────────────────▸ │
32
+ │ │ Validate session → OK
33
+ │ ◂─── 200 { WorkItem } or null │
34
+ │ │
35
+ ```
36
+
37
+ ### Separation of Concerns
38
+
39
+ - **Orator Authentication** handles identity: sessions, cookies, credential verification
40
+ - **Beacon Coordinator** handles capabilities: registration, work dispatch, affinity, timeouts
41
+ - A beacon record stores both its `BeaconID` (coordinator identity) and `SessionID` (auth identity)
42
+
43
+ ## Reconnection Protocol
44
+
45
+ When a session becomes invalid (server restart, session expiry, network interruption), the beacon detects a 401 response and automatically reconnects:
46
+
47
+ ```
48
+ 1. Any HTTP request returns 401
49
+ 2. Client sets _Authenticating flag (prevents concurrent reconnects)
50
+ 3. Clear poll and heartbeat intervals
51
+ 4. Clear stale session cookie
52
+ 5. POST /1.0/Authenticate (get fresh session)
53
+ 6. POST /Beacon/Register (coordinator reclaims offline beacon or creates new)
54
+ 7. Restart poll and heartbeat intervals
55
+ 8. On failure: retry in 10 seconds
56
+ ```
57
+
58
+ ### Beacon Reclamation
59
+
60
+ When a beacon re-registers with the same `Name` after reconnection, the coordinator checks for an existing beacon record with `Status: 'Offline'`. If found, it **reclaims** the existing record:
61
+
62
+ - Same `BeaconID` is preserved
63
+ - Affinity bindings remain intact
64
+ - SessionID is updated to the new session
65
+ - Status is set back to `Online`
66
+
67
+ This avoids duplicate beacon entries and preserves work routing continuity.
68
+
69
+ ## Configuration
70
+
71
+ ### Server-Side
72
+
73
+ In Ultravisor settings:
74
+
75
+ ```json
76
+ {
77
+ "UltravisorBeaconSessionTTLMs": 86400000
78
+ }
79
+ ```
80
+
81
+ | Setting | Default | Description |
82
+ |---------|---------|-------------|
83
+ | `UltravisorBeaconSessionTTLMs` | `86400000` (24h) | Session time-to-live in milliseconds |
84
+
85
+ The default authenticator accepts any username with any (or empty) password. This allows beacons to connect without credential management. To require credentials, set a custom authenticator on the OratorAuthentication service.
86
+
87
+ ### Client-Side
88
+
89
+ In `.ultravisor-beacon.json`:
90
+
91
+ ```json
92
+ {
93
+ "Name": "gpu-worker-1",
94
+ "Password": "",
95
+ "ServerURL": "http://localhost:54321",
96
+ "Capabilities": ["Shell", "FileSystem"],
97
+ "MaxConcurrent": 4,
98
+ "PollIntervalMs": 5000,
99
+ "HeartbeatIntervalMs": 30000
100
+ }
101
+ ```
102
+
103
+ CLI options:
104
+
105
+ ```
106
+ node Ultravisor-Beacon-CLI.cjs --password <password>
107
+ ```
108
+
109
+ | Option | Config Key | Default | Description |
110
+ |--------|-----------|---------|-------------|
111
+ | `--password` | `Password` | `""` | Password for authentication |
112
+ | `--name` | `Name` | `"beacon-worker"` | Beacon name (used as username) |
113
+ | `--server` | `ServerURL` | `"http://localhost:54321"` | Server URL |
114
+
115
+ ## Security Model
116
+
117
+ ### Graduated Security
118
+
119
+ The system is designed for incremental security hardening:
120
+
121
+ **Level 0 — Open (default):**
122
+ No credentials required. Any beacon name is accepted. Suitable for development and trusted networks.
123
+
124
+ **Level 1 — Shared secret:**
125
+ Set a custom authenticator that checks passwords against a configured secret or API key list:
126
+
127
+ ```javascript
128
+ tmpAuth.setAuthenticator((pUsername, pPassword, fCallback) =>
129
+ {
130
+ if (pPassword === process.env.BEACON_SECRET)
131
+ {
132
+ return fCallback(null, { LoginID: pUsername, IDUser: 0 });
133
+ }
134
+ return fCallback(null, null);
135
+ });
136
+ ```
137
+
138
+ **Level 2 — Per-beacon credentials:**
139
+ Validate each beacon's name and password against a database or config:
140
+
141
+ ```javascript
142
+ tmpAuth.setAuthenticator((pUsername, pPassword, fCallback) =>
143
+ {
144
+ let tmpBeaconCreds = loadBeaconCredentials();
145
+ let tmpRecord = tmpBeaconCreds[pUsername];
146
+ if (tmpRecord && tmpRecord.Password === pPassword)
147
+ {
148
+ return fCallback(null, { LoginID: pUsername, IDUser: tmpRecord.ID });
149
+ }
150
+ return fCallback(null, null);
151
+ });
152
+ ```
153
+
154
+ **Level 3 — OAuth/OIDC:**
155
+ For beacons on remote networks, use Orator Authentication's built-in OIDC provider to authenticate against an identity provider (Azure AD, Okta, etc.).
156
+
157
+ ## HTTP Endpoints
158
+
159
+ ### Authentication (provided by Orator Authentication)
160
+
161
+ | Method | Path | Auth Required | Description |
162
+ |--------|------|--------------|-------------|
163
+ | POST | `/1.0/Authenticate` | No | Authenticate with username/password, receive session cookie |
164
+ | GET | `/1.0/CheckSession` | Cookie | Validate current session |
165
+ | GET | `/1.0/Deauthenticate` | Cookie | End session |
166
+
167
+ ### Beacon (all require valid session cookie)
168
+
169
+ | Method | Path | Description |
170
+ |--------|------|-------------|
171
+ | POST | `/Beacon/Register` | Register beacon, associate with session |
172
+ | GET | `/Beacon` | List all beacons |
173
+ | GET | `/Beacon/:BeaconID` | Get specific beacon |
174
+ | DELETE | `/Beacon/:BeaconID` | Deregister beacon |
175
+ | POST | `/Beacon/:BeaconID/Heartbeat` | Send heartbeat |
176
+ | POST | `/Beacon/Work/Poll` | Poll for work items |
177
+ | POST | `/Beacon/Work/:WorkItemHash/Complete` | Report work completion |
178
+ | POST | `/Beacon/Work/:WorkItemHash/Error` | Report work failure |
179
+ | POST | `/Beacon/Work/:WorkItemHash/Progress` | Report progress |
180
+ | POST | `/Beacon/Work/Dispatch` | Direct synchronous dispatch |
181
+ | GET | `/Beacon/Work` | List all work items |
182
+ | GET | `/Beacon/Affinity` | List affinity bindings |
183
+ | GET | `/Beacon/Capabilities` | List available capabilities |
184
+
185
+ ## Implementation Details
186
+
187
+ ### Files
188
+
189
+ | File | Role |
190
+ |------|------|
191
+ | `source/web_server/Ultravisor-API-Server.cjs` | Initializes OratorAuthentication, guards beacon endpoints with session validation |
192
+ | `source/services/Ultravisor-Beacon-Coordinator.cjs` | Stores SessionID on beacon records, supports reconnection via name-based lookup |
193
+ | `source/beacon/Ultravisor-Beacon-Client.cjs` | Authenticates before registering, sends cookies, detects 401, reconnects automatically |
194
+ | `source/beacon/Ultravisor-Beacon-CLI.cjs` | Accepts `--password` CLI option |
195
+
196
+ ### Session Lifecycle
197
+
198
+ 1. **Creation:** Beacon POSTs to `/1.0/Authenticate` → session created in-memory Map → `Set-Cookie` header returned
199
+ 2. **Validation:** Every beacon request → `getSessionForRequest()` parses cookie, looks up session, checks TTL, updates `LastAccess`
200
+ 3. **Expiry:** Session TTL exceeded (default 24h) → next request returns 401 → beacon reconnects
201
+ 4. **Server restart:** All sessions lost (in-memory) → all beacons get 401 → all reconnect automatically
202
+
203
+ ### Timeout Interactions
204
+
205
+ - **Poll interval (5s):** Each poll validates the session, keeping `LastAccess` current. Sessions stay alive as long as the beacon is polling.
206
+ - **Heartbeat interval (30s):** Also validates session. Redundant with poll but provides a safety net.
207
+ - **Beacon heartbeat timeout (60s):** Coordinator marks beacon `Offline` if no poll or heartbeat received. Happens independently of session expiry.
208
+ - **Session TTL (24h):** Much longer than heartbeat timeout. A beacon goes `Offline` long before its session expires.
209
+ - **Work item timeout (5m default):** If a beacon disconnects mid-work, the coordinator times out the work item independently.