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.
- package/.claude/launch.json +11 -0
- package/.claude/ultravisor-dev-config.json +3 -0
- 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 +12 -8
- package/source/Ultravisor.cjs +30 -3
- 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 +44 -22
- package/source/cli/commands/Ultravisor-Command-SingleOperation.cjs +29 -18
- package/source/cli/commands/Ultravisor-Command-SingleTask.cjs +62 -19
- package/source/cli/commands/Ultravisor-Command-UpdateTask.cjs +27 -15
- package/source/config/Ultravisor-Default-Command-Configuration.cjs +12 -3
- package/source/services/Ultravisor-Beacon-Coordinator.cjs +966 -0
- package/source/services/Ultravisor-ExecutionEngine.cjs +1093 -0
- package/source/services/Ultravisor-ExecutionManifest.cjs +629 -0
- package/source/services/Ultravisor-Hypervisor-State.cjs +270 -97
- package/source/services/Ultravisor-Hypervisor.cjs +185 -75
- package/source/services/Ultravisor-Schedule-Persistence-Base.cjs +45 -0
- package/source/services/Ultravisor-StateManager.cjs +253 -0
- package/source/services/Ultravisor-TaskTypeRegistry.cjs +213 -0
- 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 +125 -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-transform/Ultravisor-TaskType-ReplaceString.cjs +80 -0
- package/source/services/tasks/data-transform/Ultravisor-TaskType-SetValues.cjs +74 -0
- package/source/services/tasks/data-transform/Ultravisor-TaskType-StringAppender.cjs +90 -0
- 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-system/Ultravisor-TaskType-ReadFile.cjs +96 -0
- package/source/services/tasks/file-system/Ultravisor-TaskType-ReadFileBuffered.cjs +123 -0
- package/source/services/tasks/file-system/Ultravisor-TaskType-WriteFile.cjs +106 -0
- 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/flow-control/Ultravisor-TaskType-IfConditional.cjs +125 -0
- package/source/services/tasks/flow-control/Ultravisor-TaskType-LaunchOperation.cjs +186 -0
- package/source/services/tasks/flow-control/Ultravisor-TaskType-SplitExecute.cjs +164 -0
- 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/user-interaction/Ultravisor-TaskType-ErrorMessage.cjs +55 -0
- package/source/services/tasks/user-interaction/Ultravisor-TaskType-ValueInput.cjs +47 -0
- 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 +849 -124
- package/test/Ultravisor_browser_tests.js +2226 -0
- package/test/Ultravisor_operation_library_tests.js +894 -0
- package/test/Ultravisor_tests.js +4946 -5044
- 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 +37 -14
- 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 +13 -4
- package/webinterface/source/Pict-Application-Ultravisor.js +564 -70
- 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/data/ExampleFlow-CSVPipeline.js +231 -0
- package/webinterface/source/data/ExampleFlow-FileProcessor.js +315 -0
- package/webinterface/source/data/ExampleFlow-MeadowPipeline.js +328 -0
- package/webinterface/source/panels/Ultravisor-CardSettingsPanel.js +902 -0
- package/webinterface/source/providers/PictRouter-Ultravisor-Configuration.json +20 -8
- 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 +25 -25
- package/webinterface/source/views/PictView-Ultravisor-Documentation.js +856 -0
- package/webinterface/source/views/PictView-Ultravisor-FlowEditor.js +777 -0
- package/webinterface/source/views/PictView-Ultravisor-ManifestList.js +321 -58
- package/webinterface/source/views/PictView-Ultravisor-OperationEdit.js +36 -91
- package/webinterface/source/views/PictView-Ultravisor-OperationList.js +388 -16
- package/webinterface/source/views/PictView-Ultravisor-PendingInput.js +314 -0
- package/webinterface/source/views/PictView-Ultravisor-Schedule.js +521 -65
- package/webinterface/source/views/PictView-Ultravisor-TimingView.js +333 -71
- package/webinterface/source/views/PictView-Ultravisor-TopBar.js +257 -21
- package/webinterface/theme-sampler.html +645 -0
- package/debug/Harness.js +0 -6
- package/source/services/Ultravisor-Operation-Manifest.cjs +0 -160
- package/source/services/Ultravisor-Operation.cjs +0 -200
- package/source/services/Ultravisor-Task.cjs +0 -349
- package/source/services/events/Ultravisor-Hypervisor-Event-Solver.cjs +0 -11
- package/source/services/tasks/Ultravisor-Task-Base.cjs +0 -264
- package/source/services/tasks/Ultravisor-Task-CollectValues.cjs +0 -188
- package/source/services/tasks/Ultravisor-Task-Command.cjs +0 -65
- package/source/services/tasks/Ultravisor-Task-CommandEach.cjs +0 -190
- package/source/services/tasks/Ultravisor-Task-Conditional.cjs +0 -104
- package/source/services/tasks/Ultravisor-Task-DateWindow.cjs +0 -72
- package/source/services/tasks/Ultravisor-Task-GeneratePagedOperation.cjs +0 -336
- package/source/services/tasks/Ultravisor-Task-LaunchOperation.cjs +0 -143
- package/source/services/tasks/Ultravisor-Task-LaunchTask.cjs +0 -146
- package/source/services/tasks/Ultravisor-Task-LineMatch.cjs +0 -158
- package/source/services/tasks/Ultravisor-Task-Request.cjs +0 -56
- package/source/services/tasks/Ultravisor-Task-Solver.cjs +0 -89
- package/source/services/tasks/Ultravisor-Task-TemplateString.cjs +0 -93
- package/source/services/tasks/rest/Ultravisor-Task-GetBinary.cjs +0 -127
- package/source/services/tasks/rest/Ultravisor-Task-GetJSON.cjs +0 -119
- package/source/services/tasks/rest/Ultravisor-Task-GetText.cjs +0 -109
- package/source/services/tasks/rest/Ultravisor-Task-GetXML.cjs +0 -112
- package/source/services/tasks/rest/Ultravisor-Task-RestRequest.cjs +0 -499
- package/source/services/tasks/rest/Ultravisor-Task-SendJSON.cjs +0 -150
- package/source/services/tasks/stagingfiles/Ultravisor-Task-CopyFile.cjs +0 -110
- package/source/services/tasks/stagingfiles/Ultravisor-Task-ListFiles.cjs +0 -89
- package/source/services/tasks/stagingfiles/Ultravisor-Task-ReadBinary.cjs +0 -87
- package/source/services/tasks/stagingfiles/Ultravisor-Task-ReadJSON.cjs +0 -67
- package/source/services/tasks/stagingfiles/Ultravisor-Task-ReadText.cjs +0 -66
- package/source/services/tasks/stagingfiles/Ultravisor-Task-ReadXML.cjs +0 -69
- package/source/services/tasks/stagingfiles/Ultravisor-Task-WriteBinary.cjs +0 -95
- package/source/services/tasks/stagingfiles/Ultravisor-Task-WriteJSON.cjs +0 -96
- package/source/services/tasks/stagingfiles/Ultravisor-Task-WriteText.cjs +0 -99
- package/source/services/tasks/stagingfiles/Ultravisor-Task-WriteXML.cjs +0 -102
- package/webinterface/source/views/PictView-Ultravisor-TaskEdit.js +0 -220
- package/webinterface/source/views/PictView-Ultravisor-TaskList.js +0 -248
package/docs/_sidebar.md
CHANGED
|
@@ -7,10 +7,27 @@
|
|
|
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
|
+
- [LLM Integration](features/llm.md)
|
|
14
|
+
- [LLM Model Setup Guide](features/llm-model-setup.md)
|
|
10
15
|
- [Operations](features/operations.md)
|
|
11
16
|
- [Scheduling](features/scheduling.md)
|
|
12
17
|
- [Manifests](features/manifests.md)
|
|
13
18
|
|
|
19
|
+
- Task Reference
|
|
20
|
+
|
|
21
|
+
- [Data Transform](features/tasks-data-transform.md)
|
|
22
|
+
- [File System](features/tasks-file-system.md)
|
|
23
|
+
- [Flow Control](features/tasks-flow-control.md)
|
|
24
|
+
- [HTTP Client](features/tasks-http-client.md)
|
|
25
|
+
- [LLM](features/tasks-llm.md)
|
|
26
|
+
- [Meadow API](features/tasks-meadow-api.md)
|
|
27
|
+
- [Content System](features/tasks-content-system.md)
|
|
28
|
+
- [Extension](features/tasks-extension.md)
|
|
29
|
+
- [User Interaction](features/tasks-user-interaction.md)
|
|
30
|
+
|
|
14
31
|
- Reference
|
|
15
32
|
|
|
16
33
|
- [API Server](features/api.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
|
+
}
|
|
@@ -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.
|