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.
- package/docs/_sidebar.md +25 -0
- package/docs/css/docuserve.css +73 -0
- package/docs/features/api.md +142 -0
- package/docs/features/beacon-authentication.md +209 -0
- package/docs/features/beacon-providers.md +1299 -0
- package/docs/features/beacons.md +582 -0
- package/docs/features/capabilities.md +193 -0
- package/docs/features/case-study-retold-remote.md +223 -0
- package/docs/features/llm-model-setup.md +505 -0
- package/docs/features/llm.md +262 -0
- package/docs/features/platform-cards.md +145 -0
- package/docs/features/reachability-matrix.md +145 -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 +306 -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/features/universal-addressing.md +117 -0
- package/docs/index.html +1 -1
- package/docs/retold-catalog.json +437 -1
- package/docs/retold-keyword-index.json +57721 -5
- package/operation-library/api-data-pipeline.json +363 -0
- package/operation-library/beacon-remote-command.json +72 -0
- package/operation-library/conditional-file-backup.json +364 -0
- package/operation-library/config-processor.json +136 -0
- package/operation-library/csv-data-analysis.json +767 -0
- package/operation-library/csv-to-json.json +472 -0
- package/operation-library/directory-inventory.json +389 -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 +349 -0
- package/operation-library/json-config-merge.json +388 -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 +571 -0
- package/operation-library/meadow-crud-lifecycle.json +726 -0
- package/operation-library/npm-project-validator.json +193 -0
- package/operation-library/rest-api-orchestrator.json +633 -0
- package/operation-library/shell-system-info.json +137 -0
- package/operation-library/simple-echo.json +299 -0
- package/operation-library/template-processor.json +664 -0
- package/operation-library/text-sanitizer.json +176 -0
- package/package.json +11 -7
- package/source/Ultravisor.cjs +18 -10
- package/source/beacon/Ultravisor-Beacon-CLI.cjs +143 -0
- package/source/beacon/Ultravisor-Beacon-CapabilityProvider.cjs +129 -0
- package/source/beacon/Ultravisor-Beacon-Client.cjs +582 -0
- package/source/beacon/Ultravisor-Beacon-Executor.cjs +500 -0
- package/source/beacon/Ultravisor-Beacon-ProviderRegistry.cjs +366 -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 +74 -3
- package/source/config/Ultravisor-Default-Command-Configuration.cjs +9 -1
- package/source/services/Ultravisor-Beacon-Coordinator.cjs +1994 -0
- package/source/services/Ultravisor-Beacon-Reachability.cjs +403 -0
- package/source/services/Ultravisor-ExecutionEngine.cjs +420 -9
- package/source/services/Ultravisor-ExecutionManifest.cjs +618 -5
- package/source/services/Ultravisor-Hypervisor-State.cjs +50 -0
- package/source/services/Ultravisor-Hypervisor.cjs +155 -0
- package/source/services/Ultravisor-Schedule-Persistence-Base.cjs +45 -0
- package/source/services/Ultravisor-StateManager.cjs +12 -0
- package/source/services/Ultravisor-TaskTypeRegistry.cjs +95 -25
- package/source/services/persistence/Ultravisor-Beacon-QueueJournal.cjs +474 -0
- package/source/services/persistence/Ultravisor-Schedule-Persistence-JSONFile.cjs +140 -0
- package/source/services/tasks/Ultravisor-BuiltIn-TaskConfigs.cjs +21 -0
- package/source/services/tasks/Ultravisor-TaskHelper-BeaconDispatch.cjs +116 -0
- package/source/services/tasks/Ultravisor-TaskType-Base.cjs +20 -0
- package/source/services/tasks/content-system/Ultravisor-TaskConfigs-ContentSystem.cjs +90 -0
- package/source/services/tasks/content-system/definitions/content-create-folder.json +24 -0
- package/source/services/tasks/content-system/definitions/content-list-files.json +27 -0
- package/source/services/tasks/content-system/definitions/content-read-file.json +26 -0
- package/source/services/tasks/content-system/definitions/content-save-file.json +26 -0
- package/source/services/tasks/data-collection/Ultravisor-TaskConfigs-DataCollection.cjs +66 -0
- package/source/services/tasks/data-collection/definitions/event-counter.json +26 -0
- package/source/services/tasks/data-transform/Ultravisor-TaskConfigs-DataTransform.cjs +749 -0
- package/source/services/tasks/{data → data-transform}/Ultravisor-TaskType-ReplaceString.cjs +27 -29
- package/source/services/tasks/{data → data-transform}/Ultravisor-TaskType-StringAppender.cjs +13 -24
- package/source/services/tasks/data-transform/definitions/add-field-mapping.json +22 -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-value.json +23 -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 +138 -0
- package/source/services/tasks/extension/definitions/beacon-dispatch.json +32 -0
- package/source/services/tasks/file-system/Ultravisor-TaskConfigs-FileSystem.cjs +509 -0
- package/source/services/tasks/{file-io → file-system}/Ultravisor-TaskType-ReadFile.cjs +27 -34
- package/source/services/tasks/file-system/Ultravisor-TaskType-ReadFileBuffered.cjs +123 -0
- package/source/services/tasks/{file-io → file-system}/Ultravisor-TaskType-WriteFile.cjs +26 -37
- package/source/services/tasks/file-system/definitions/copy-file.json +27 -0
- package/source/services/tasks/file-system/definitions/list-files.json +27 -0
- package/source/services/tasks/file-system/definitions/read-file-buffered.json +31 -0
- package/source/services/tasks/file-system/definitions/read-file.json +26 -0
- package/source/services/tasks/file-system/definitions/read-json.json +23 -0
- package/source/services/tasks/file-system/definitions/write-file.json +29 -0
- package/source/services/tasks/file-system/definitions/write-json.json +30 -0
- package/source/services/tasks/flow-control/Ultravisor-TaskConfigs-FlowControl.cjs +353 -0
- package/source/services/tasks/{control → flow-control}/Ultravisor-TaskType-IfConditional.cjs +1 -24
- package/source/services/tasks/{control → flow-control}/Ultravisor-TaskType-LaunchOperation.cjs +27 -28
- package/source/services/tasks/{control → flow-control}/Ultravisor-TaskType-SplitExecute.cjs +9 -29
- package/source/services/tasks/flow-control/definitions/if-conditional.json +25 -0
- package/source/services/tasks/flow-control/definitions/launch-operation.json +27 -0
- package/source/services/tasks/flow-control/definitions/split-execute.json +32 -0
- package/source/services/tasks/http-client/Ultravisor-TaskConfigs-HttpClient.cjs +366 -0
- package/source/services/tasks/http-client/definitions/add-header.json +21 -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 +739 -0
- package/source/services/tasks/llm/definitions/add-message.json +21 -0
- package/source/services/tasks/llm/definitions/add-tool.json +22 -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/platform/Ultravisor-TaskConfigs-Platform.cjs +449 -0
- package/source/services/tasks/platform/definitions/base64-decode.json +24 -0
- package/source/services/tasks/platform/definitions/base64-encode.json +25 -0
- package/source/services/tasks/platform/definitions/file-transfer.json +26 -0
- package/source/services/tasks/platform/definitions/resolve-address.json +32 -0
- package/source/services/tasks/platform/definitions/send-result.json +24 -0
- package/source/services/tasks/shell/Ultravisor-TaskConfigs-Shell.cjs +174 -0
- package/source/services/tasks/shell/definitions/add-env-var.json +21 -0
- package/source/services/tasks/shell/definitions/command.json +29 -0
- package/source/services/tasks/user-interaction/Ultravisor-TaskConfigs-UserInteraction.cjs +116 -0
- package/source/services/tasks/{interaction → user-interaction}/Ultravisor-TaskType-ErrorMessage.cjs +19 -18
- package/source/services/tasks/{interaction → user-interaction}/Ultravisor-TaskType-ValueInput.cjs +4 -19
- package/source/services/tasks/user-interaction/definitions/add-option.json +21 -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 +1583 -54
- package/test/Ultravisor_browser_tests.js +27 -20
- package/test/Ultravisor_operation_library_tests.js +894 -0
- package/test/Ultravisor_tests.js +5170 -25
- 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/build/build-codemirror-bundle.js +30 -0
- package/webinterface/build/codemirror-entry.js +13 -0
- package/webinterface/css/ultravisor-themes.css +668 -0
- package/webinterface/css/ultravisor.css +15 -15
- package/webinterface/docs/card-help/beacon-dispatch.md +30 -0
- package/webinterface/docs/card-help/command.md +27 -0
- package/webinterface/docs/card-help/comprehension-intersect.md +24 -0
- package/webinterface/docs/card-help/content-create-folder.md +22 -0
- package/webinterface/docs/card-help/content-list-files.md +25 -0
- package/webinterface/docs/card-help/content-read-file.md +24 -0
- package/webinterface/docs/card-help/content-save-file.md +24 -0
- package/webinterface/docs/card-help/copy-file.md +25 -0
- package/webinterface/docs/card-help/csv-transform.md +24 -0
- package/webinterface/docs/card-help/end.md +11 -0
- package/webinterface/docs/card-help/error-message.md +16 -0
- package/webinterface/docs/card-help/expression-solver.md +21 -0
- package/webinterface/docs/card-help/get-json.md +24 -0
- package/webinterface/docs/card-help/get-text.md +24 -0
- package/webinterface/docs/card-help/histogram.md +23 -0
- package/webinterface/docs/card-help/if-conditional.md +23 -0
- package/webinterface/docs/card-help/launch-operation.md +25 -0
- package/webinterface/docs/card-help/list-files.md +25 -0
- package/webinterface/docs/card-help/llm-chat-completion.md +43 -0
- package/webinterface/docs/card-help/llm-embedding.md +24 -0
- package/webinterface/docs/card-help/llm-tool-use.md +39 -0
- package/webinterface/docs/card-help/meadow-count.md +24 -0
- package/webinterface/docs/card-help/meadow-create.md +24 -0
- package/webinterface/docs/card-help/meadow-delete.md +19 -0
- package/webinterface/docs/card-help/meadow-read.md +24 -0
- package/webinterface/docs/card-help/meadow-reads.md +27 -0
- package/webinterface/docs/card-help/meadow-update.md +24 -0
- package/webinterface/docs/card-help/parse-csv.md +27 -0
- package/webinterface/docs/card-help/read-file-buffered.md +29 -0
- package/webinterface/docs/card-help/read-file.md +24 -0
- package/webinterface/docs/card-help/read-json.md +21 -0
- package/webinterface/docs/card-help/replace-string.md +25 -0
- package/webinterface/docs/card-help/rest-request.md +30 -0
- package/webinterface/docs/card-help/send-json.md +26 -0
- package/webinterface/docs/card-help/set-values.md +16 -0
- package/webinterface/docs/card-help/split-execute.md +35 -0
- package/webinterface/docs/card-help/start.md +11 -0
- package/webinterface/docs/card-help/string-appender.md +22 -0
- package/webinterface/docs/card-help/template-string.md +21 -0
- package/webinterface/docs/card-help/value-input.md +24 -0
- package/webinterface/docs/card-help/write-file.md +27 -0
- package/webinterface/docs/card-help/write-json.md +28 -0
- package/webinterface/html/index.html +7 -0
- package/webinterface/package.json +23 -9
- package/webinterface/source/Pict-Application-Ultravisor.js +666 -9
- package/webinterface/source/Ultravisor-TimingUtils.js +99 -0
- package/webinterface/source/card-help-content.js +46 -0
- package/webinterface/source/cards/Ultravisor-BuiltIn-CardConfigs.js +174 -0
- package/webinterface/source/cards/Ultravisor-CardConfigGenerator.js +431 -0
- package/webinterface/source/panels/Ultravisor-CardSettingsPanel.js +1060 -0
- package/webinterface/source/providers/PictRouter-Ultravisor-Configuration.json +21 -1
- package/webinterface/source/views/PictView-Ultravisor-BeaconList.js +853 -0
- package/webinterface/source/views/PictView-Ultravisor-BottomBar.js +5 -5
- package/webinterface/source/views/PictView-Ultravisor-Dashboard.js +37 -20
- package/webinterface/source/views/PictView-Ultravisor-Documentation.js +856 -0
- package/webinterface/source/views/PictView-Ultravisor-FlowEditor.js +1171 -101
- package/webinterface/source/views/PictView-Ultravisor-ManifestDetail.js +733 -0
- package/webinterface/source/views/PictView-Ultravisor-ManifestList.js +545 -95
- package/webinterface/source/views/PictView-Ultravisor-OperationDescriptionEditor.js +68 -0
- package/webinterface/source/views/PictView-Ultravisor-OperationEdit.js +4 -4
- package/webinterface/source/views/PictView-Ultravisor-OperationList.js +325 -52
- package/webinterface/source/views/PictView-Ultravisor-PendingInput.js +257 -32
- package/webinterface/source/views/PictView-Ultravisor-ReachabilityMap.js +399 -0
- package/webinterface/source/views/PictView-Ultravisor-Schedule.js +539 -32
- package/webinterface/source/views/PictView-Ultravisor-TimingView.js +311 -62
- package/webinterface/source/views/PictView-Ultravisor-TopBar.js +255 -23
- package/webinterface/theme-sampler.html +645 -0
- package/.ultravisor.json +0 -426
- package/source/services/tasks/data/Ultravisor-TaskType-SetValues.cjs +0 -81
- package/webinterface/source/cards/FlowCard-CSVTransform.js +0 -43
- package/webinterface/source/cards/FlowCard-Command.js +0 -86
- package/webinterface/source/cards/FlowCard-ComprehensionIntersect.js +0 -40
- package/webinterface/source/cards/FlowCard-Conditional.js +0 -87
- package/webinterface/source/cards/FlowCard-CopyFile.js +0 -55
- package/webinterface/source/cards/FlowCard-End.js +0 -29
- package/webinterface/source/cards/FlowCard-GetJSON.js +0 -55
- package/webinterface/source/cards/FlowCard-GetText.js +0 -54
- package/webinterface/source/cards/FlowCard-Histogram.js +0 -176
- package/webinterface/source/cards/FlowCard-LaunchOperation.js +0 -82
- package/webinterface/source/cards/FlowCard-ListFiles.js +0 -55
- package/webinterface/source/cards/FlowCard-MeadowCount.js +0 -44
- package/webinterface/source/cards/FlowCard-MeadowCreate.js +0 -44
- package/webinterface/source/cards/FlowCard-MeadowDelete.js +0 -45
- package/webinterface/source/cards/FlowCard-MeadowRead.js +0 -46
- package/webinterface/source/cards/FlowCard-MeadowReads.js +0 -46
- package/webinterface/source/cards/FlowCard-MeadowUpdate.js +0 -44
- package/webinterface/source/cards/FlowCard-ParseCSV.js +0 -85
- package/webinterface/source/cards/FlowCard-ReadJSON.js +0 -54
- package/webinterface/source/cards/FlowCard-ReadText.js +0 -54
- package/webinterface/source/cards/FlowCard-RestRequest.js +0 -59
- package/webinterface/source/cards/FlowCard-SendJSON.js +0 -57
- package/webinterface/source/cards/FlowCard-Solver.js +0 -77
- package/webinterface/source/cards/FlowCard-Start.js +0 -29
- package/webinterface/source/cards/FlowCard-TemplateString.js +0 -77
- package/webinterface/source/cards/FlowCard-WriteJSON.js +0 -54
- package/webinterface/source/cards/FlowCard-WriteText.js +0 -54
package/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
|
+
}
|
package/docs/features/api.md
CHANGED
|
@@ -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.
|