@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.
- package/LICENSE +661 -661
- package/NOTICE +23 -23
- package/README.md +137 -137
- package/dist/assets/index-C4Hm2Pud.js +75 -0
- package/dist/assets/index-CiLOHdeR.css +1 -0
- package/dist/index.html +14 -14
- package/dist-cli/cli.js +1325 -503
- package/dist-cli/deployment.yaml +105 -0
- package/dist-cli/llmproxy.yaml +303 -300
- package/dist-cli/workflow.yaml +913 -895
- package/package.json +2 -3
- package/dist/assets/index-CnM-MQ9w.css +0 -1
- package/dist/assets/index-LJpK2FES.js +0 -75
|
@@ -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".'
|