@foresthubai/workflow-cli 0.4.3 → 0.4.5

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.
@@ -0,0 +1,105 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright (c) 2026 ForestHub.
3
+
4
+ openapi: 3.0.3
5
+ info:
6
+ title: ForestHub Deployment Spec Contract
7
+ version: 0.1.0
8
+ description: "The resolved, component-agnostic set of containers to run on a device for one deployment."
9
+
10
+ paths: {}
11
+ components:
12
+ schemas:
13
+ DeploymentSpec:
14
+ type: object
15
+ required: [schemaVersion, id, components]
16
+ description: "The resolved set of components to run on one device for one deployment, plus its identity. Every decision is frozen at packaging time."
17
+ properties:
18
+ schemaVersion:
19
+ type: integer
20
+ minimum: 1
21
+ description: "Spec format version. Bumped when the spec shape changes incompatibly."
22
+ id:
23
+ type: string
24
+ description: "Stable identifier for this deployment, used as the rollback/history key."
25
+ createdAt:
26
+ type: string
27
+ format: date-time
28
+ description: "When this spec was produced, stamped by the producer."
29
+ components:
30
+ type: array
31
+ description: "The components to run for this deployment, each a fully resolved container. Unordered — components declare no dependencies on one another."
32
+ items:
33
+ $ref: "#/components/schemas/DeployComponent"
34
+
35
+ DeployComponent:
36
+ type: object
37
+ required: [name, image]
38
+ description: "One resolved container to run as part of a deployment. Generic by design: carries only runtime-neutral container knobs, never a component-typed config schema."
39
+ properties:
40
+ name:
41
+ type: string
42
+ description: "Unique component name within the deployment."
43
+ image:
44
+ type: string
45
+ description: 'OCI image reference, frozen at packaging time. OSS: a locally-built convention tag, e.g. "foresthub/engine:local". Paid: a registry-qualified, digest-pinned ref, e.g. "ghcr.io/foresthubai/engine:1.2.0@sha256:...".'
46
+ pull:
47
+ type: string
48
+ enum: [always, missing, never]
49
+ description: 'Image pull policy. Omit to default to "missing" (pull only if absent locally); "never" for a locally-built image in no registry; "always" re-pulls on every start.'
50
+ command:
51
+ type: array
52
+ description: 'Overrides the image''s default command/entrypoint arguments, in exec form — one token per element, e.g. ["--model", "/path/x.gguf", "--ctx-size", "4096"]. Omit to use the image''s default command.'
53
+ items:
54
+ type: string
55
+ config:
56
+ type: object
57
+ additionalProperties: true
58
+ description: "Structured config for the component, frozen at packaging time. Omit for a component configured only by its image defaults and its device-local env. Never contains secrets."
59
+ volumes:
60
+ type: array
61
+ description: 'Persistent or host volume mounts in compose short form, e.g. "./workspaces/engine:/var/lib/foresthub/workspace" or "./data:/data:ro". Empty when the component is stateless and mounts nothing beyond its config files.'
62
+ items:
63
+ type: string
64
+ devices:
65
+ type: array
66
+ description: 'Resolved host device nodes to pass into the container, e.g. "/dev/gpiochip0", "/dev/ttyUSB0". Empty when the component binds no cdev hardware.'
67
+ items:
68
+ type: string
69
+ ports:
70
+ type: array
71
+ description: 'Host port publishings in compose short form, e.g. "1883:1883". Empty when the component is reached only over the internal container network (the common case: components address each other by name, no host exposure needed).'
72
+ items:
73
+ type: string
74
+ privileged:
75
+ type: boolean
76
+ description: "Run the container privileged. Required for hardware with no single device node to grant (ADC/DAC/PWM use sysfs paths like /sys/class/pwm, /sys/bus/iio). False when the component uses only cdev hardware (use devices) or none."
77
+ user:
78
+ type: string
79
+ description: 'Container user as "UID[:GID]", e.g. "0:0" for root. Set when a nonroot image must reach root-owned resources. Omit to use the image''s default user.'
80
+ healthcheck:
81
+ $ref: "#/components/schemas/HealthCheck"
82
+
83
+ HealthCheck:
84
+ type: object
85
+ required: [test]
86
+ description: "In-container readiness/liveness probe. Present only when the image ships a probe tool; omit otherwise."
87
+ properties:
88
+ test:
89
+ type: array
90
+ description: 'The probe command in compose exec form. The first token is the probe kind: "CMD" runs the remaining tokens as an argv, "CMD-SHELL" runs the single following string in a shell, "NONE" disables a healthcheck the image baked in. Point it at a tool present in the image, e.g. ["CMD", "curl", "-f", "http://localhost:8080/health"]. A component reachable only by liveness (no readiness endpoint) probes a cheaper signal; one with no in-image probe at all omits the enclosing healthcheck entirely.'
91
+ items:
92
+ type: string
93
+ interval:
94
+ type: string
95
+ description: 'How often to run the probe once the container is up, as a compose/Go duration, e.g. "30s". Omit to use the renderer default.'
96
+ timeout:
97
+ type: string
98
+ description: 'How long one probe may run before it counts as a failure, e.g. "10s". Omit to use the renderer default.'
99
+ retries:
100
+ type: integer
101
+ minimum: 1
102
+ description: "Consecutive probe failures before the container is marked unhealthy. Omit to use the renderer default."
103
+ startPeriod:
104
+ type: string
105
+ description: 'Grace window after container start during which probe failures neither count against retries nor mark the container unhealthy, sized to the component''s worst-case warmup, e.g. a llama-server loading a multi-GB model. A container still not healthy when this elapses is the universal failure backstop. e.g. "40s".'