ultravisor 1.0.0 → 1.0.3

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 (87) hide show
  1. package/CONTRIBUTING.md +50 -0
  2. package/README.md +34 -0
  3. package/debug/Harness.js +4 -2
  4. package/docs/.nojekyll +0 -0
  5. package/docs/README.md +63 -0
  6. package/docs/_cover.md +15 -0
  7. package/docs/_sidebar.md +18 -0
  8. package/docs/_topbar.md +7 -0
  9. package/docs/architecture.md +103 -0
  10. package/docs/features/api.md +230 -0
  11. package/docs/features/cli.md +182 -0
  12. package/docs/features/configuration.md +245 -0
  13. package/docs/features/manifests.md +177 -0
  14. package/docs/features/operations.md +292 -0
  15. package/docs/features/scheduling.md +179 -0
  16. package/docs/features/tasks.md +1857 -0
  17. package/docs/index.html +39 -0
  18. package/docs/overview.md +75 -0
  19. package/docs/quickstart.md +167 -0
  20. package/docs/retold-catalog.json +24 -0
  21. package/docs/retold-keyword-index.json +19 -0
  22. package/package.json +13 -7
  23. package/source/Ultravisor.cjs +2 -2
  24. package/source/cli/Ultravisor-CLIProgram.cjs +38 -0
  25. package/source/cli/commands/Ultravisor-Command-ScheduleOperation.cjs +26 -2
  26. package/source/cli/commands/Ultravisor-Command-ScheduleTask.cjs +26 -2
  27. package/source/cli/commands/Ultravisor-Command-ScheduleView.cjs +22 -0
  28. package/source/cli/commands/Ultravisor-Command-SingleOperation.cjs +49 -1
  29. package/source/cli/commands/Ultravisor-Command-SingleTask.cjs +51 -1
  30. package/source/cli/commands/Ultravisor-Command-Stop.cjs +4 -0
  31. package/source/cli/commands/Ultravisor-Command-UpdateTask.cjs +91 -0
  32. package/source/config/Ultravisor-Default-Command-Configuration.cjs +6 -1
  33. package/source/services/Ultravisor-Hypervisor-Event-Base.cjs +18 -1
  34. package/source/services/Ultravisor-Hypervisor-State.cjs +213 -0
  35. package/source/services/Ultravisor-Hypervisor.cjs +225 -1
  36. package/source/services/Ultravisor-Operation-Manifest.cjs +150 -1
  37. package/source/services/Ultravisor-Operation.cjs +190 -1
  38. package/source/services/Ultravisor-Task.cjs +339 -1
  39. package/source/services/events/Ultravisor-Hypervisor-Event-Cron.cjs +71 -1
  40. package/source/services/tasks/Ultravisor-Task-Base.cjs +264 -0
  41. package/source/services/tasks/Ultravisor-Task-CollectValues.cjs +188 -0
  42. package/source/services/tasks/Ultravisor-Task-Command.cjs +65 -0
  43. package/source/services/tasks/Ultravisor-Task-CommandEach.cjs +190 -0
  44. package/source/services/tasks/Ultravisor-Task-Conditional.cjs +104 -0
  45. package/source/services/tasks/Ultravisor-Task-DateWindow.cjs +72 -0
  46. package/source/services/tasks/Ultravisor-Task-GeneratePagedOperation.cjs +336 -0
  47. package/source/services/tasks/Ultravisor-Task-LaunchOperation.cjs +143 -0
  48. package/source/services/tasks/Ultravisor-Task-LaunchTask.cjs +146 -0
  49. package/source/services/tasks/Ultravisor-Task-LineMatch.cjs +158 -0
  50. package/source/services/tasks/Ultravisor-Task-Request.cjs +56 -0
  51. package/source/services/tasks/Ultravisor-Task-Solver.cjs +89 -0
  52. package/source/services/tasks/Ultravisor-Task-TemplateString.cjs +93 -0
  53. package/source/services/tasks/rest/Ultravisor-Task-GetBinary.cjs +127 -0
  54. package/source/services/tasks/rest/Ultravisor-Task-GetJSON.cjs +119 -0
  55. package/source/services/tasks/rest/Ultravisor-Task-GetText.cjs +109 -0
  56. package/source/services/tasks/rest/Ultravisor-Task-GetXML.cjs +112 -0
  57. package/source/services/tasks/rest/Ultravisor-Task-RestRequest.cjs +499 -0
  58. package/source/services/tasks/rest/Ultravisor-Task-SendJSON.cjs +150 -0
  59. package/source/services/tasks/stagingfiles/Ultravisor-Task-CopyFile.cjs +110 -0
  60. package/source/services/tasks/stagingfiles/Ultravisor-Task-ListFiles.cjs +89 -0
  61. package/source/services/tasks/stagingfiles/Ultravisor-Task-ReadBinary.cjs +87 -0
  62. package/source/services/tasks/stagingfiles/Ultravisor-Task-ReadJSON.cjs +67 -0
  63. package/source/services/tasks/stagingfiles/Ultravisor-Task-ReadText.cjs +66 -0
  64. package/source/services/tasks/stagingfiles/Ultravisor-Task-ReadXML.cjs +69 -0
  65. package/source/services/tasks/stagingfiles/Ultravisor-Task-WriteBinary.cjs +95 -0
  66. package/source/services/tasks/stagingfiles/Ultravisor-Task-WriteJSON.cjs +96 -0
  67. package/source/services/tasks/stagingfiles/Ultravisor-Task-WriteText.cjs +99 -0
  68. package/source/services/tasks/stagingfiles/Ultravisor-Task-WriteXML.cjs +102 -0
  69. package/source/web_server/Ultravisor-API-Server.cjs +463 -3
  70. package/test/Ultravisor_tests.js +6097 -1
  71. package/webinterface/css/ultravisor.css +121 -0
  72. package/webinterface/html/index.html +32 -0
  73. package/webinterface/package.json +39 -0
  74. package/webinterface/source/Pict-Application-Ultravisor-Configuration.json +15 -0
  75. package/webinterface/source/Pict-Application-Ultravisor.js +414 -0
  76. package/webinterface/source/providers/PictRouter-Ultravisor-Configuration.json +42 -0
  77. package/webinterface/source/views/PictView-Ultravisor-BottomBar.js +65 -0
  78. package/webinterface/source/views/PictView-Ultravisor-Dashboard.js +236 -0
  79. package/webinterface/source/views/PictView-Ultravisor-Layout.js +83 -0
  80. package/webinterface/source/views/PictView-Ultravisor-ManifestList.js +273 -0
  81. package/webinterface/source/views/PictView-Ultravisor-OperationEdit.js +243 -0
  82. package/webinterface/source/views/PictView-Ultravisor-OperationList.js +141 -0
  83. package/webinterface/source/views/PictView-Ultravisor-Schedule.js +280 -0
  84. package/webinterface/source/views/PictView-Ultravisor-TaskEdit.js +220 -0
  85. package/webinterface/source/views/PictView-Ultravisor-TaskList.js +248 -0
  86. package/webinterface/source/views/PictView-Ultravisor-TimingView.js +420 -0
  87. package/webinterface/source/views/PictView-Ultravisor-TopBar.js +147 -0
@@ -0,0 +1,50 @@
1
+ # Contributing to Retold
2
+
3
+ We welcome contributions to Retold and its modules. This guide covers the expectations and process for contributing.
4
+
5
+ ## Code of Conduct
6
+
7
+ The Retold community values **empathy**, **equity**, **kindness**, and **thoughtfulness**. We expect all participants to treat each other with respect, assume good intent, and engage constructively. These values apply to all interactions: pull requests, issues, discussions, and code review.
8
+
9
+ ## How to Contribute
10
+
11
+ ### Pull Requests
12
+
13
+ Pull requests are the preferred method for contributing changes. To submit one:
14
+
15
+ 1. Fork the module repository you want to change
16
+ 2. Create a branch for your work
17
+ 3. Make your changes, following the code style of the module you are editing
18
+ 4. Ensure your changes have test coverage (see below)
19
+ 5. Open a pull request against the module's main branch
20
+
21
+ **Submitting a pull request does not guarantee it will be accepted.** Maintainers review contributions for fit, quality, and alignment with the project's direction. A PR may be declined, or you may be asked to revise it. This is normal and not a reflection on the quality of your effort.
22
+
23
+ ### Reporting Issues
24
+
25
+ If you find a bug or have a feature suggestion, open an issue on the relevant module's repository. Include enough detail to reproduce the problem or understand the proposal.
26
+
27
+ ## Test Coverage
28
+
29
+ Every commit must include test coverage for the changes it introduces. Retold modules use Mocha in TDD style. Before submitting:
30
+
31
+ - **Write tests** for any new functionality or bug fixes
32
+ - **Run the existing test suite** with `npm test` and confirm all tests pass
33
+ - **Check coverage** with `npm run coverage` if the module supports it
34
+
35
+ Pull requests that break existing tests or lack coverage for new code will not be merged.
36
+
37
+ ## Code Style
38
+
39
+ Follow the conventions of the module you are working in. The general Retold style is:
40
+
41
+ - **Tabs** for indentation, never spaces
42
+ - **Plain JavaScript** only (no TypeScript)
43
+ - **Allman-style braces** (opening brace on its own line)
44
+ - **Variable naming:** `pVariable` for parameters, `tmpVariable` for temporaries, `libSomething` for imports
45
+
46
+ When in doubt, match what the surrounding code does.
47
+
48
+ ## Repository Structure
49
+
50
+ Each module is its own git repository. The [retold](https://github.com/stevenvelozo/retold) repository tracks module organization but does not contain module source code. Direct your pull request to the specific module repository where your change belongs.
package/README.md CHANGED
@@ -62,6 +62,26 @@ Tasks can be executed based on a number of scenarios:
62
62
  * After a condition is met (a condition in a browser, a disk drops below 5g)
63
63
  * After another task is completed (ffmpeg returns successfully transcoding)
64
64
 
65
+ #### Task Model
66
+
67
+ Each task has at minimum a GUID, Code and Name, as well as a type and
68
+ parameters. There is also a description to store markdown content about the
69
+ task.
70
+
71
+ #### Task Types
72
+
73
+ Tasks have a type which dictates how they are executed:
74
+
75
+ * Command - a shell command executed on the node
76
+ * Browser - a headless browser task that can navigate, click and interact
77
+ * Browser Read - a headless browser task that only reads data from pages
78
+ * Browser Action - a click, navigation or data fill action for a browser
79
+ * Request - an HTTP request task for pulling/pushing data from/to APIs
80
+ * Store File - a task for storing files in the output file store
81
+ * Read File - a task for reading files from the output file store
82
+ * Database Table - a task for creating a table in the output data store
83
+ * Integration - a meadow integration task
84
+
65
85
  ### Nodes
66
86
 
67
87
  Any execution of Ultravisor. Can be distributed across multiple machines.
@@ -117,3 +137,17 @@ meant to be a persistent storage location that is accessible across nodes.
117
137
  The output data store is a flexible database for storing final output data from
118
138
  operations. This can be used to store structured data, metadata, or any other
119
139
  information that needs to be queried or analyzed later.
140
+
141
+ ## Related Packages
142
+
143
+ - [orator](https://github.com/stevenvelozo/orator) - API server abstraction
144
+ - [pict](https://github.com/stevenvelozo/pict) - MVC application framework
145
+ - [fable](https://github.com/stevenvelozo/fable) - Application services framework
146
+
147
+ ## License
148
+
149
+ MIT
150
+
151
+ ## Contributing
152
+
153
+ Pull requests are welcome. For details on our code of conduct, contribution process, and testing requirements, see the [Retold Contributing Guide](https://github.com/stevenvelozo/retold/blob/main/docs/contributing.md).
package/debug/Harness.js CHANGED
@@ -1,4 +1,6 @@
1
- let libUltravisor = require(`../source/cli/Ultravisor-CLIProgram.cjs`);
1
+ let libUltravisor = require(`../source/cli/Ultravisor-Run.cjs`);
2
+ //let libUltravisor = require(`../source/cli/Ultravisor-CLIProgram.cjs`);
2
3
 
3
4
  //libUltravisor.run(['node', 'Harness.js', 'explain-config']);
4
- libUltravisor.run(['node', 'Harness.js', 'start']);
5
+
6
+ //libUltravisor.run(['node', 'Harness.js', 'start']);
package/docs/.nojekyll ADDED
File without changes
package/docs/README.md ADDED
@@ -0,0 +1,63 @@
1
+ # Ultravisor Overview
2
+
3
+ Ultravisor is a cyclic process execution tool with AI integration. It runs commands, HTTP requests and other tasks on schedule, producing structured output manifests that track timing, success/failure and logs for every execution.
4
+
5
+ ## What It Does
6
+
7
+ Ultravisor manages two core primitives -- **Tasks** and **Operations** -- and provides multiple ways to run them: immediately via CLI or API, or on a recurring schedule via cron expressions.
8
+
9
+ **Tasks** are individual units of work: shell commands, HTTP requests or other executable actions. **Operations** compose multiple tasks into a sequential pipeline with a unified output manifest.
10
+
11
+ ## How It Runs
12
+
13
+ Ultravisor can be used in three modes:
14
+
15
+ 1. **CLI** -- run individual tasks or operations from the command line
16
+ 2. **API Server** -- start a Restify-based HTTP server exposing full CRUD and execution endpoints for tasks, operations, schedules and manifests
17
+ 3. **Scheduled** -- define cron schedules that automatically execute tasks or operations at the configured intervals
18
+
19
+ ## Configuration
20
+
21
+ Ultravisor uses a layered configuration system. The default configuration ships with the module and can be overridden by a `.ultravisor.json` file in the working directory. Tasks and operations are persisted into this same configuration file.
22
+
23
+ ```json
24
+ {
25
+ "UltravisorAPIServerPort": 54321,
26
+ "UltravisorFileStorePath": "/path/to/datastore",
27
+ "UltravisorTickIntervalMilliseconds": 60000,
28
+ "Tasks": {},
29
+ "Operations": {}
30
+ }
31
+ ```
32
+
33
+ ## Key Concepts
34
+
35
+ | Concept | Description |
36
+ |---------|-------------|
37
+ | Task | A single executable unit (shell command, HTTP request, etc.) |
38
+ | Operation | An ordered set of tasks executed sequentially |
39
+ | Schedule | A cron-based trigger that runs a task or operation on a timer |
40
+ | Manifest | The output record from executing an operation |
41
+ | Hypervisor | The central scheduler that manages the schedule and dispatches executions |
42
+ | State | Persistent storage of task and operation definitions in `.ultravisor.json` |
43
+
44
+ ## Module Dependencies
45
+
46
+ Ultravisor is built on the Retold ecosystem:
47
+
48
+ - **pict** / **pict-serviceproviderbase** -- service provider pattern and CLI framework
49
+ - **pict-service-commandlineutility** -- CLI command registration
50
+ - **orator** / **orator-serviceserver-restify** -- REST API server
51
+ - **cron** -- cron expression scheduling
52
+
53
+ ## Documentation Map
54
+
55
+ - [Architecture](architecture.md) -- service structure and data flow
56
+ - [Quick Start](quickstart.md) -- get running in five minutes
57
+ - [Tasks](features/tasks.md) -- task types, model and execution
58
+ - [Operations](features/operations.md) -- composing tasks into pipelines
59
+ - [Scheduling](features/scheduling.md) -- cron-based recurring execution
60
+ - [API Server](features/api.md) -- REST endpoint reference
61
+ - [CLI Commands](features/cli.md) -- command line interface reference
62
+ - [Manifests](features/manifests.md) -- execution output and logging
63
+ - [Configuration](features/configuration.md) -- configuration file format and options
package/docs/_cover.md ADDED
@@ -0,0 +1,15 @@
1
+ # Ultravisor
2
+
3
+ > Cyclic process execution with AI integration
4
+
5
+ - Run shell commands and HTTP requests on a schedule
6
+ - Compose tasks into sequential operations
7
+ - Full REST API for remote management
8
+ - Structured manifests track every execution
9
+ - Cron-based scheduling with daily and hourly shortcuts
10
+ - CLI and API for task and operation CRUD
11
+ - Persistent state in a single JSON config file
12
+
13
+ [Get Started](overview.md)
14
+ [Quick Start](quickstart.md)
15
+ [GitHub](https://github.com/stevenvelozo/ultravisor)
@@ -0,0 +1,18 @@
1
+ - Getting Started
2
+
3
+ - [Overview](overview.md)
4
+ - [Quick Start](quickstart.md)
5
+ - [Architecture](architecture.md)
6
+
7
+ - Features
8
+
9
+ - [Tasks](features/tasks.md)
10
+ - [Operations](features/operations.md)
11
+ - [Scheduling](features/scheduling.md)
12
+ - [Manifests](features/manifests.md)
13
+
14
+ - Reference
15
+
16
+ - [API Server](features/api.md)
17
+ - [CLI Commands](features/cli.md)
18
+ - [Configuration](features/configuration.md)
@@ -0,0 +1,7 @@
1
+ # Ultravisor
2
+
3
+ - [Overview](overview.md)
4
+ - [Quick Start](quickstart.md)
5
+ - [Tasks](features/tasks.md)
6
+ - [Configuration](features/configuration.md)
7
+ - [GitHub](https://github.com/stevenvelozo/ultravisor)
@@ -0,0 +1,103 @@
1
+ # Ultravisor Architecture
2
+
3
+ ## Service Provider Pattern
4
+
5
+ Ultravisor is built on the Retold `fable-serviceproviderbase` pattern. Each
6
+ major component is a service registered with a Fable instance via
7
+ `addAndInstantiateServiceTypeIfNotExists`. Services access each other through
8
+ the shared `this.fable[ServiceName]` namespace.
9
+
10
+ ## Service Map
11
+
12
+ ```
13
+ Ultravisor-CLIProgram (Pict CLI entrypoint)
14
+ |
15
+ +-- Ultravisor-Hypervisor Scheduler / orchestrator
16
+ | |
17
+ | +-- Ultravisor-Hypervisor-Event-Cron Cron job management
18
+ | +-- Ultravisor-Hypervisor-Event-Solver Condition-based triggers (future)
19
+ |
20
+ +-- Ultravisor-Hypervisor-State Task/operation CRUD + persistence
21
+ |
22
+ +-- Ultravisor-Task Task execution engine
23
+ +-- Ultravisor-Operation Operation execution (sequential task runner)
24
+ +-- Ultravisor-Operation-Manifest Execution output tracking
25
+ |
26
+ +-- Ultravisor-API-Server REST API (Orator + Restify)
27
+ ```
28
+
29
+ ## Data Flow
30
+
31
+ ### Immediate Execution
32
+
33
+ ```
34
+ CLI Command or API Request
35
+ --> Hypervisor-State.getTask() or getOperation()
36
+ --> Task.executeTask() or Operation.executeOperation()
37
+ --> Operation-Manifest tracks results
38
+ --> Manifest returned to caller
39
+ ```
40
+
41
+ ### Scheduled Execution
42
+
43
+ ```
44
+ Hypervisor.startSchedule()
45
+ --> For each schedule entry:
46
+ --> Event-Cron creates a CronJob
47
+ --> On tick: look up target from State
48
+ --> Execute via Task or Operation service
49
+ --> Results logged
50
+ ```
51
+
52
+ ### State Persistence
53
+
54
+ ```
55
+ State.updateTask() or updateOperation()
56
+ --> In-memory hash updated
57
+ --> persistState() writes merged JSON to .ultravisor.json
58
+ ```
59
+
60
+ ## File Structure
61
+
62
+ ```
63
+ source/
64
+ Ultravisor.cjs Module entry point
65
+ cli/
66
+ Ultravisor-CLIProgram.cjs CLI bootstrap + service init
67
+ Ultravisor-Run.cjs Executable entry (shebang)
68
+ commands/
69
+ Ultravisor-Command-Start.cjs Start API server
70
+ Ultravisor-Command-Stop.cjs Stop scheduler
71
+ Ultravisor-Command-ScheduleView.cjs View schedule
72
+ Ultravisor-Command-ScheduleOperation.cjs Schedule an operation
73
+ Ultravisor-Command-ScheduleTask.cjs Schedule a task
74
+ Ultravisor-Command-UpdateTask.cjs Add/update a task definition
75
+ Ultravisor-Command-SingleOperation.cjs Run operation immediately
76
+ Ultravisor-Command-SingleTask.cjs Run task immediately
77
+ config/
78
+ Ultravisor-Default-Command-Configuration.cjs Default config values
79
+ services/
80
+ Ultravisor-Hypervisor.cjs Scheduler + schedule management
81
+ Ultravisor-Hypervisor-State.cjs CRUD + persistence
82
+ Ultravisor-Task.cjs Task execution engine
83
+ Ultravisor-Operation.cjs Operation runner
84
+ Ultravisor-Operation-Manifest.cjs Manifest lifecycle
85
+ Ultravisor-Hypervisor-Event-Base.cjs Base event class
86
+ events/
87
+ Ultravisor-Hypervisor-Event-Cron.cjs Cron scheduling
88
+ Ultravisor-Hypervisor-Event-Solver.cjs Condition-based (future)
89
+ web_server/
90
+ Ultravisor-API-Server.cjs REST endpoint definitions
91
+ ```
92
+
93
+ ## Configuration Layering
94
+
95
+ Configuration is gathered automatically by Pict in this order:
96
+
97
+ 1. **Default Program Configuration** -- hardcoded defaults in
98
+ `Ultravisor-Default-Command-Configuration.cjs`
99
+ 2. **`.ultravisor.json`** -- project-level overrides (searched from cwd upward)
100
+
101
+ The final merged result is available as `fable.ProgramConfiguration`. Tasks
102
+ and operations are stored in this same file under the `Tasks` and
103
+ `Operations` keys.
@@ -0,0 +1,230 @@
1
+ # API Server
2
+
3
+ Ultravisor includes a REST API server built on Orator (Restify). Start it
4
+ with `ultravisor start` and it exposes endpoints for managing tasks,
5
+ operations, schedules and manifests.
6
+
7
+ ## Server Configuration
8
+
9
+ The API server port is configured in `.ultravisor.json`:
10
+
11
+ ```json
12
+ {
13
+ "UltravisorAPIServerPort": 54321
14
+ }
15
+ ```
16
+
17
+ Default port: `54321`. Fallback if not configured: `55555`.
18
+
19
+ ## Starting the Server
20
+
21
+ ```bash
22
+ ultravisor start
23
+ ```
24
+
25
+ Or with verbose logging:
26
+
27
+ ```bash
28
+ ultravisor start --verbose
29
+ ```
30
+
31
+ ## Endpoint Reference
32
+
33
+ ### System
34
+
35
+ | Method | Path | Description |
36
+ |--------|------|-------------|
37
+ | `GET` | `/package` | Returns the package.json metadata |
38
+ | `GET` | `/status` | Returns server and schedule status |
39
+ | `GET` | `/stop` | Stops the scheduler and shuts down the server |
40
+
41
+ #### GET /status
42
+
43
+ ```json
44
+ {
45
+ "Status": "Running",
46
+ "ScheduleEntries": 3,
47
+ "ScheduleRunning": true
48
+ }
49
+ ```
50
+
51
+ ### Tasks
52
+
53
+ | Method | Path | Description |
54
+ |--------|------|-------------|
55
+ | `GET` | `/Task` | List all tasks |
56
+ | `GET` | `/Task/:GUIDTask` | Get a single task |
57
+ | `POST` | `/Task` | Create or update a task |
58
+ | `PUT` | `/Task/:GUIDTask` | Update a task |
59
+ | `DELETE` | `/Task/:GUIDTask` | Delete a task |
60
+ | `GET` | `/Task/:GUIDTask/Execute` | Execute a task immediately |
61
+
62
+ #### POST /Task
63
+
64
+ ```bash
65
+ curl -X POST http://localhost:54321/Task \
66
+ -H "Content-Type: application/json" \
67
+ -d '{
68
+ "GUIDTask": "my-task",
69
+ "Name": "My Task",
70
+ "Type": "Command",
71
+ "Command": "echo hello"
72
+ }'
73
+ ```
74
+
75
+ Response:
76
+
77
+ ```json
78
+ {
79
+ "GUIDTask": "my-task",
80
+ "Name": "My Task",
81
+ "Type": "Command",
82
+ "Command": "echo hello"
83
+ }
84
+ ```
85
+
86
+ #### GET /Task/:GUIDTask/Execute
87
+
88
+ ```bash
89
+ curl http://localhost:54321/Task/my-task/Execute
90
+ ```
91
+
92
+ Response:
93
+
94
+ ```json
95
+ {
96
+ "GUIDTask": "my-task",
97
+ "Name": "My Task",
98
+ "Type": "Command",
99
+ "StartTime": "2026-02-10T12:00:00.000Z",
100
+ "StopTime": "2026-02-10T12:00:00.025Z",
101
+ "Status": "Complete",
102
+ "Success": true,
103
+ "Output": "hello\n",
104
+ "Log": ["..."]
105
+ }
106
+ ```
107
+
108
+ ### Operations
109
+
110
+ | Method | Path | Description |
111
+ |--------|------|-------------|
112
+ | `GET` | `/Operation` | List all operations |
113
+ | `GET` | `/Operation/:GUIDOperation` | Get a single operation |
114
+ | `POST` | `/Operation` | Create or update an operation |
115
+ | `PUT` | `/Operation/:GUIDOperation` | Update an operation |
116
+ | `DELETE` | `/Operation/:GUIDOperation` | Delete an operation |
117
+ | `GET` | `/Operation/:GUIDOperation/Execute` | Execute an operation |
118
+
119
+ #### POST /Operation
120
+
121
+ ```bash
122
+ curl -X POST http://localhost:54321/Operation \
123
+ -H "Content-Type: application/json" \
124
+ -d '{
125
+ "GUIDOperation": "my-pipeline",
126
+ "Name": "My Pipeline",
127
+ "Tasks": ["task-a", "task-b", "task-c"]
128
+ }'
129
+ ```
130
+
131
+ #### GET /Operation/:GUIDOperation/Execute
132
+
133
+ Returns a full manifest with results for each task in the operation.
134
+
135
+ ### Schedule
136
+
137
+ | Method | Path | Description |
138
+ |--------|------|-------------|
139
+ | `GET` | `/Schedule` | List all schedule entries |
140
+ | `POST` | `/Schedule/Task` | Schedule a task |
141
+ | `POST` | `/Schedule/Operation` | Schedule an operation |
142
+ | `DELETE` | `/Schedule/:GUID` | Remove a schedule entry |
143
+ | `GET` | `/Schedule/Start` | Start all scheduled cron jobs |
144
+ | `GET` | `/Schedule/Stop` | Stop all scheduled cron jobs |
145
+
146
+ #### POST /Schedule/Task
147
+
148
+ ```bash
149
+ curl -X POST http://localhost:54321/Schedule/Task \
150
+ -H "Content-Type: application/json" \
151
+ -d '{
152
+ "GUIDTask": "disk-check",
153
+ "ScheduleType": "cron",
154
+ "Parameters": "*/5 * * * *"
155
+ }'
156
+ ```
157
+
158
+ Response:
159
+
160
+ ```json
161
+ {
162
+ "GUID": "sched-task-disk-check-1707566400000",
163
+ "TargetType": "Task",
164
+ "TargetGUID": "disk-check",
165
+ "ScheduleType": "cron",
166
+ "Parameters": "*/5 * * * *",
167
+ "CronExpression": "*/5 * * * *",
168
+ "Active": false,
169
+ "CreatedAt": "2026-02-10T12:00:00.000Z"
170
+ }
171
+ ```
172
+
173
+ #### POST /Schedule/Operation
174
+
175
+ ```bash
176
+ curl -X POST http://localhost:54321/Schedule/Operation \
177
+ -H "Content-Type: application/json" \
178
+ -d '{
179
+ "GUIDOperation": "nightly-etl",
180
+ "ScheduleType": "daily",
181
+ "Parameters": "0 2 * * *"
182
+ }'
183
+ ```
184
+
185
+ ### Manifests
186
+
187
+ | Method | Path | Description |
188
+ |--------|------|-------------|
189
+ | `GET` | `/Manifest` | List all operation run manifests |
190
+ | `GET` | `/Manifest/:GUIDRun` | Get a specific manifest by run GUID |
191
+
192
+ #### GET /Manifest
193
+
194
+ Returns an array of all operation manifests from the current session.
195
+
196
+ #### GET /Manifest/:GUIDRun
197
+
198
+ ```json
199
+ {
200
+ "GUIDOperation": "my-pipeline",
201
+ "GUIDRun": "my-pipeline-1707566400000",
202
+ "Name": "My Pipeline",
203
+ "StartTime": "2026-02-10T12:00:00.000Z",
204
+ "StopTime": "2026-02-10T12:00:02.500Z",
205
+ "Status": "Complete",
206
+ "Success": true,
207
+ "Summary": "Operation my-pipeline Complete: 3 task(s) executed.",
208
+ "TaskResults": [],
209
+ "Log": []
210
+ }
211
+ ```
212
+
213
+ ## Error Responses
214
+
215
+ All error responses follow this format:
216
+
217
+ ```json
218
+ {
219
+ "Error": "Description of what went wrong"
220
+ }
221
+ ```
222
+
223
+ HTTP status codes used:
224
+
225
+ | Code | Meaning |
226
+ |------|---------|
227
+ | `200` | Success |
228
+ | `400` | Bad request (invalid input) |
229
+ | `404` | Resource not found |
230
+ | `500` | Server error |