@teamclaws/teamclaw 2026.3.26-2 → 2026.4.2-1
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/README.md +52 -8
- package/cli.mjs +538 -224
- package/index.ts +76 -27
- package/openclaw.plugin.json +53 -28
- package/package.json +5 -2
- package/skills/teamclaw/SKILL.md +213 -0
- package/skills/teamclaw/references/api-quick-ref.md +117 -0
- package/skills/teamclaw-setup/SKILL.md +81 -0
- package/skills/teamclaw-setup/references/install-modes.md +136 -0
- package/skills/teamclaw-setup/references/validation-checklist.md +73 -0
- package/src/config.ts +44 -16
- package/src/controller/controller-capacity.ts +2 -2
- package/src/controller/controller-service.ts +193 -47
- package/src/controller/controller-tools.ts +102 -2
- package/src/controller/delivery-report.ts +563 -0
- package/src/controller/http-server.ts +1907 -172
- package/src/controller/kickoff-orchestrator.ts +292 -0
- package/src/controller/managed-gateway-process.ts +330 -0
- package/src/controller/orchestration-manifest.ts +69 -1
- package/src/controller/preview-manager.ts +676 -0
- package/src/controller/prompt-injector.ts +116 -67
- package/src/controller/role-inference.ts +41 -0
- package/src/controller/websocket.ts +3 -1
- package/src/controller/worker-provisioning.ts +429 -74
- package/src/discovery.ts +1 -1
- package/src/git-collaboration.ts +198 -47
- package/src/identity.ts +12 -2
- package/src/interaction-contracts.ts +179 -3
- package/src/networking.ts +99 -0
- package/src/openclaw-workspace.ts +478 -11
- package/src/prompt-policy.ts +381 -0
- package/src/roles.ts +37 -36
- package/src/state.ts +40 -1
- package/src/task-executor.ts +282 -78
- package/src/types.ts +150 -7
- package/src/ui/app.js +1403 -175
- package/src/ui/assets/teamclaw-app-icon.png +0 -0
- package/src/ui/index.html +122 -40
- package/src/ui/style.css +829 -143
- package/src/worker/http-handler.ts +40 -4
- package/src/worker/prompt-injector.ts +9 -38
- package/src/worker/skill-installer.ts +2 -2
- package/src/worker/tools.ts +31 -5
- package/src/worker/worker-service.ts +49 -8
- package/src/workspace-browser.ts +20 -7
- package/src/controller/local-worker-manager.ts +0 -533
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: teamclaw-setup
|
|
3
|
+
description: Install, configure, validate, or troubleshoot the TeamClaw OpenClaw plugin for virtual software-team workflows. Use when users want TeamClaw setup help, controller or worker config snippets, on-demand process/docker/kubernetes workers, external worker registration, or safe first-run validation steps.
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
metadata:
|
|
6
|
+
openclaw:
|
|
7
|
+
author: TeamClaws
|
|
8
|
+
homepage: https://github.com/topcheer/teamclaw
|
|
9
|
+
links:
|
|
10
|
+
homepage: https://github.com/topcheer/teamclaw
|
|
11
|
+
repository: https://github.com/topcheer/teamclaw
|
|
12
|
+
documentation: https://github.com/topcheer/teamclaw/blob/main/INSTALL.md
|
|
13
|
+
changelog: https://github.com/topcheer/teamclaw/releases
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# TeamClaw Setup
|
|
17
|
+
|
|
18
|
+
Guide users to the smallest working TeamClaw installation first, then expand.
|
|
19
|
+
|
|
20
|
+
## Default workflow
|
|
21
|
+
|
|
22
|
+
1. Prefer the guided installer first:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npx -y @teamclaws/teamclaw install
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
The guided installer already applies `--dangerously-force-unsafe-install` for TeamClaw and defaults to an independent `teamclaw` agent/workspace.
|
|
29
|
+
|
|
30
|
+
Advanced compatibility only:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npx -y @teamclaws/teamclaw install --agent-mode main
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Use that only when the user explicitly wants the legacy shared-`main` layout.
|
|
37
|
+
|
|
38
|
+
2. Use manual plugin install only when the user wants direct control:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
openclaw plugins install --dangerously-force-unsafe-install @teamclaws/teamclaw
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
If the user explicitly wants the ClawHub package path, use:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
openclaw plugins install --dangerously-force-unsafe-install clawhub:@teamclaws/teamclaw
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
3. Recommend `controller + process provisioning` for the first successful run unless the user explicitly needs external workers, Docker, or Kubernetes immediately.
|
|
51
|
+
|
|
52
|
+
4. Read `references/install-modes.md` before generating config. Pick the smallest matching topology and reuse the provided snippets.
|
|
53
|
+
|
|
54
|
+
5. Read `references/validation-checklist.md` before finishing. Always give the user:
|
|
55
|
+
- one health-check command
|
|
56
|
+
- one UI URL
|
|
57
|
+
- one tiny smoke-test requirement
|
|
58
|
+
- one or two likely failure checks for the chosen topology
|
|
59
|
+
|
|
60
|
+
## Installation guidance
|
|
61
|
+
|
|
62
|
+
- Start with a single host and `process` provisioning.
|
|
63
|
+
- Keep TeamClaw `taskTimeoutMs` large for real model runs.
|
|
64
|
+
- Keep OpenClaw `agents.defaults.timeoutSeconds` at least as large as the TeamClaw task window in seconds.
|
|
65
|
+
- For `docker` or `kubernetes`, require a reachable `workerProvisioningControllerUrl`.
|
|
66
|
+
- For `docker`, mention the published runtime image:
|
|
67
|
+
|
|
68
|
+
```text
|
|
69
|
+
ghcr.io/topcheer/teamclaw-openclaw:latest
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## What to produce
|
|
73
|
+
|
|
74
|
+
When helping a user, produce:
|
|
75
|
+
|
|
76
|
+
1. the exact install command
|
|
77
|
+
2. the minimal config snippet for the chosen topology
|
|
78
|
+
3. the startup command
|
|
79
|
+
4. the validation commands and first smoke-test task
|
|
80
|
+
|
|
81
|
+
Do not push users into distributed, Docker, or Kubernetes first unless they asked for it or already have the surrounding infrastructure ready.
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# TeamClaw install modes
|
|
2
|
+
|
|
3
|
+
## 1. Guided install
|
|
4
|
+
|
|
5
|
+
Use this when the user already has OpenClaw working and wants the shortest path:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npx -y @teamclaws/teamclaw install
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
The guided installer already applies `--dangerously-force-unsafe-install` for TeamClaw.
|
|
12
|
+
|
|
13
|
+
What it helps with:
|
|
14
|
+
|
|
15
|
+
- installs or updates the TeamClaw plugin
|
|
16
|
+
- locates `openclaw.json`
|
|
17
|
+
- lets the user choose a topology
|
|
18
|
+
- reuses existing OpenClaw model definitions
|
|
19
|
+
- prompts for workspace placement
|
|
20
|
+
|
|
21
|
+
## 2. Manual plugin install
|
|
22
|
+
|
|
23
|
+
Use this when the user wants direct control over plugin installation:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
openclaw plugins install --dangerously-force-unsafe-install @teamclaws/teamclaw
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
If the user explicitly wants the ClawHub source:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
openclaw plugins install --dangerously-force-unsafe-install clawhub:@teamclaws/teamclaw
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## 3. Recommended first topology: controller + process provisioning
|
|
36
|
+
|
|
37
|
+
Minimal TeamClaw plugin block:
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"mode": "controller",
|
|
42
|
+
"processModel": "multi",
|
|
43
|
+
"port": 9527,
|
|
44
|
+
"teamName": "my-team",
|
|
45
|
+
"taskTimeoutMs": 1800000,
|
|
46
|
+
"gitEnabled": true,
|
|
47
|
+
"gitDefaultBranch": "main",
|
|
48
|
+
"workerProvisioningType": "process",
|
|
49
|
+
"workerProvisioningRoles": [],
|
|
50
|
+
"workerProvisioningMinPerRole": 0,
|
|
51
|
+
"workerProvisioningMaxPerRole": 2,
|
|
52
|
+
"workerProvisioningIdleTtlMs": 120000,
|
|
53
|
+
"workerProvisioningStartupTimeoutMs": 120000
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Use this first because it avoids multi-machine networking while still exercising the real controller, provisioned workers, UI, messages, clarifications, and git-backed workspace flow.
|
|
58
|
+
|
|
59
|
+
## 4. Worker-only topology
|
|
60
|
+
|
|
61
|
+
Use this only when a controller already exists elsewhere:
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"mode": "worker",
|
|
66
|
+
"port": 9528,
|
|
67
|
+
"role": "developer",
|
|
68
|
+
"controllerUrl": "http://controller-host:9527",
|
|
69
|
+
"taskTimeoutMs": 1800000,
|
|
70
|
+
"gitEnabled": true,
|
|
71
|
+
"gitDefaultBranch": "main"
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## 5. On-demand process workers
|
|
76
|
+
|
|
77
|
+
Use this when the controller should launch same-machine workers only as needed:
|
|
78
|
+
|
|
79
|
+
```json
|
|
80
|
+
{
|
|
81
|
+
"mode": "controller",
|
|
82
|
+
"port": 9527,
|
|
83
|
+
"teamName": "my-team",
|
|
84
|
+
"workerProvisioningType": "process",
|
|
85
|
+
"workerProvisioningMinPerRole": 0,
|
|
86
|
+
"workerProvisioningMaxPerRole": 2,
|
|
87
|
+
"workerProvisioningIdleTtlMs": 120000,
|
|
88
|
+
"workerProvisioningStartupTimeoutMs": 120000
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## 6. On-demand Docker workers
|
|
93
|
+
|
|
94
|
+
Use this when the user already has Docker and wants containerized workers:
|
|
95
|
+
|
|
96
|
+
```json
|
|
97
|
+
{
|
|
98
|
+
"mode": "controller",
|
|
99
|
+
"port": 9527,
|
|
100
|
+
"teamName": "my-team",
|
|
101
|
+
"workerProvisioningType": "docker",
|
|
102
|
+
"workerProvisioningControllerUrl": "http://host.docker.internal:9527",
|
|
103
|
+
"workerProvisioningImage": "ghcr.io/topcheer/teamclaw-openclaw:latest",
|
|
104
|
+
"workerProvisioningWorkspaceRoot": "/workspace-root",
|
|
105
|
+
"workerProvisioningDockerWorkspaceVolume": "teamclaw-workspaces",
|
|
106
|
+
"workerProvisioningMaxPerRole": 3
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Important notes:
|
|
111
|
+
|
|
112
|
+
- `workerProvisioningControllerUrl` must be reachable from the worker container.
|
|
113
|
+
- If persistent workspaces matter, keep `workerProvisioningDockerWorkspaceVolume`.
|
|
114
|
+
|
|
115
|
+
## 7. On-demand Kubernetes workers
|
|
116
|
+
|
|
117
|
+
Use this only when the user already runs the controller in or behind a reachable cluster address:
|
|
118
|
+
|
|
119
|
+
```json
|
|
120
|
+
{
|
|
121
|
+
"mode": "controller",
|
|
122
|
+
"port": 9527,
|
|
123
|
+
"teamName": "my-team",
|
|
124
|
+
"workerProvisioningType": "kubernetes",
|
|
125
|
+
"workerProvisioningControllerUrl": "http://teamclaw-controller.default.svc.cluster.local:9527",
|
|
126
|
+
"workerProvisioningImage": "ghcr.io/topcheer/teamclaw-openclaw:latest",
|
|
127
|
+
"workerProvisioningWorkspaceRoot": "/workspace-root",
|
|
128
|
+
"workerProvisioningKubernetesWorkspacePersistentVolumeClaim": "teamclaw-workspace",
|
|
129
|
+
"workerProvisioningMaxPerRole": 2
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Important notes:
|
|
134
|
+
|
|
135
|
+
- `kubectl` must be available where the controller runs.
|
|
136
|
+
- The controller URL must be reachable from pods.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# TeamClaw validation checklist
|
|
2
|
+
|
|
3
|
+
## Startup checks
|
|
4
|
+
|
|
5
|
+
After startup, always give the user:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
curl http://127.0.0.1:9527/api/v1/health
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Expected shape:
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{"status":"ok","mode":"controller", ...}
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Also point them to:
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
http://127.0.0.1:9527/ui
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## First smoke-test task
|
|
24
|
+
|
|
25
|
+
Recommend a tiny requirement before any large SDLC workflow:
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
Create a minimal static site in the workspace with README.md, index.html, and style.css.
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
This checks controller intake, task routing, worker execution, workspace writes, and UI visibility with minimal risk.
|
|
32
|
+
|
|
33
|
+
## Timeout guidance
|
|
34
|
+
|
|
35
|
+
For real model runs:
|
|
36
|
+
|
|
37
|
+
- TeamClaw: `taskTimeoutMs = 1800000`
|
|
38
|
+
- OpenClaw: `agents.defaults.timeoutSeconds >= 2400`
|
|
39
|
+
|
|
40
|
+
If OpenClaw times out first, users often think TeamClaw is broken when the real issue is the inner agent deadline.
|
|
41
|
+
|
|
42
|
+
## Common failure checks
|
|
43
|
+
|
|
44
|
+
### process provisioning
|
|
45
|
+
|
|
46
|
+
- confirm the chosen model already works in plain OpenClaw
|
|
47
|
+
- confirm `agents.defaults.workspace` points to a writable path
|
|
48
|
+
|
|
49
|
+
### distributed worker
|
|
50
|
+
|
|
51
|
+
- confirm `controllerUrl` is reachable from the worker machine
|
|
52
|
+
- confirm the worker role matches the intended role
|
|
53
|
+
|
|
54
|
+
### Docker
|
|
55
|
+
|
|
56
|
+
- confirm `workerProvisioningControllerUrl` is reachable from containers
|
|
57
|
+
- confirm the controller can access Docker
|
|
58
|
+
- confirm the runtime image is `ghcr.io/topcheer/teamclaw-openclaw:latest`
|
|
59
|
+
|
|
60
|
+
### Kubernetes
|
|
61
|
+
|
|
62
|
+
- confirm pods can reach `workerProvisioningControllerUrl`
|
|
63
|
+
- confirm the controller environment has `kubectl`
|
|
64
|
+
- confirm any workspace PVC actually exists
|
|
65
|
+
|
|
66
|
+
## Done criteria
|
|
67
|
+
|
|
68
|
+
Treat the install as successful only when:
|
|
69
|
+
|
|
70
|
+
1. controller health is `ok`
|
|
71
|
+
2. expected workers appear in the UI or status view
|
|
72
|
+
3. the smoke-test task completes
|
|
73
|
+
4. files appear in the workspace
|
package/src/config.ts
CHANGED
|
@@ -31,7 +31,7 @@ function buildConfigSchema() {
|
|
|
31
31
|
},
|
|
32
32
|
teamName: {
|
|
33
33
|
type: "string" as const,
|
|
34
|
-
default: "
|
|
34
|
+
default: "TeamClaw",
|
|
35
35
|
description: "Team name for mDNS identification",
|
|
36
36
|
},
|
|
37
37
|
heartbeatIntervalMs: {
|
|
@@ -42,7 +42,7 @@ function buildConfigSchema() {
|
|
|
42
42
|
taskTimeoutMs: {
|
|
43
43
|
type: "number" as const,
|
|
44
44
|
default: 1800000,
|
|
45
|
-
description: "
|
|
45
|
+
description: "Inactivity threshold in milliseconds before TeamClaw probes a stalled role task instead of failing it",
|
|
46
46
|
},
|
|
47
47
|
gitEnabled: {
|
|
48
48
|
type: "boolean" as const,
|
|
@@ -69,14 +69,17 @@ function buildConfigSchema() {
|
|
|
69
69
|
default: "teamclaw@local",
|
|
70
70
|
description: "Git author email used for TeamClaw-managed workspace commits",
|
|
71
71
|
},
|
|
72
|
-
|
|
73
|
-
type: "
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
72
|
+
agentIsolationMode: {
|
|
73
|
+
type: "string" as const,
|
|
74
|
+
enum: ["independent", "main"],
|
|
75
|
+
default: "independent",
|
|
76
|
+
description: "Runtime isolation mode: dedicated TeamClaw agent/workspace, or legacy main-agent shared mode",
|
|
77
|
+
},
|
|
78
|
+
processModel: {
|
|
79
|
+
type: "string" as const,
|
|
80
|
+
enum: ["multi"],
|
|
81
|
+
default: "multi",
|
|
82
|
+
description: "Worker execution model: TeamClaw runs workers as separate gateway processes",
|
|
80
83
|
},
|
|
81
84
|
workerProvisioningType: {
|
|
82
85
|
type: "string" as const,
|
|
@@ -84,6 +87,11 @@ function buildConfigSchema() {
|
|
|
84
87
|
default: "none",
|
|
85
88
|
description: "Controller-only on-demand worker launch backend",
|
|
86
89
|
},
|
|
90
|
+
workerProvisioningDisabled: {
|
|
91
|
+
type: "boolean" as const,
|
|
92
|
+
default: false,
|
|
93
|
+
description: "Explicitly disable controller-managed on-demand workers even when TeamClaw would normally default to same-host process provisioning",
|
|
94
|
+
},
|
|
87
95
|
workerProvisioningControllerUrl: {
|
|
88
96
|
type: "string" as const,
|
|
89
97
|
default: "",
|
|
@@ -105,7 +113,7 @@ function buildConfigSchema() {
|
|
|
105
113
|
},
|
|
106
114
|
workerProvisioningMaxPerRole: {
|
|
107
115
|
type: "number" as const,
|
|
108
|
-
default:
|
|
116
|
+
default: 3,
|
|
109
117
|
description: "Maximum on-demand workers to launch per role",
|
|
110
118
|
},
|
|
111
119
|
workerProvisioningIdleTtlMs: {
|
|
@@ -177,6 +185,14 @@ function buildConfigSchema() {
|
|
|
177
185
|
default: "",
|
|
178
186
|
description: "Optional service account name for launched worker pods",
|
|
179
187
|
},
|
|
188
|
+
workerProvisioningKubernetesImagePullSecrets: {
|
|
189
|
+
type: "array" as const,
|
|
190
|
+
default: [],
|
|
191
|
+
description: "Optional image pull secret names added to launched worker pods",
|
|
192
|
+
items: {
|
|
193
|
+
type: "string" as const,
|
|
194
|
+
},
|
|
195
|
+
},
|
|
180
196
|
workerProvisioningKubernetesWorkspacePersistentVolumeClaim: {
|
|
181
197
|
type: "string" as const,
|
|
182
198
|
default: "",
|
|
@@ -208,8 +224,8 @@ function buildConfigSchema() {
|
|
|
208
224
|
teamName: { label: "Team Name", help: "Team identifier for mDNS" },
|
|
209
225
|
heartbeatIntervalMs: { label: "Heartbeat Interval", help: "In milliseconds, minimum 1000" },
|
|
210
226
|
taskTimeoutMs: {
|
|
211
|
-
label: "Task
|
|
212
|
-
help: "
|
|
227
|
+
label: "Task Stall Threshold",
|
|
228
|
+
help: "In milliseconds, how long TeamClaw waits without visible progress before probing the task instead of failing it",
|
|
213
229
|
},
|
|
214
230
|
gitEnabled: {
|
|
215
231
|
label: "Git Collaboration",
|
|
@@ -231,14 +247,22 @@ function buildConfigSchema() {
|
|
|
231
247
|
label: "Git Author Email",
|
|
232
248
|
help: "Author email for TeamClaw-managed workspace commits",
|
|
233
249
|
},
|
|
234
|
-
|
|
235
|
-
label: "
|
|
236
|
-
help: "
|
|
250
|
+
agentIsolationMode: {
|
|
251
|
+
label: "Agent Isolation Mode",
|
|
252
|
+
help: "Use a dedicated TeamClaw agent/workspace by default, or the legacy shared main-agent mode",
|
|
253
|
+
},
|
|
254
|
+
processModel: {
|
|
255
|
+
label: "Process Model",
|
|
256
|
+
help: "TeamClaw runs workers as separate gateway processes",
|
|
237
257
|
},
|
|
238
258
|
workerProvisioningType: {
|
|
239
259
|
label: "On-demand Worker Provider",
|
|
240
260
|
help: "Launch missing workers on demand using process, Docker, or Kubernetes",
|
|
241
261
|
},
|
|
262
|
+
workerProvisioningDisabled: {
|
|
263
|
+
label: "Disable On-demand Workers",
|
|
264
|
+
help: "Force TeamClaw to keep worker provisioning off even for same-host local controllers",
|
|
265
|
+
},
|
|
242
266
|
workerProvisioningControllerUrl: {
|
|
243
267
|
label: "Provisioned Worker Controller URL",
|
|
244
268
|
help: "URL that launched workers use to call back into the controller",
|
|
@@ -303,6 +327,10 @@ function buildConfigSchema() {
|
|
|
303
327
|
label: "Kubernetes Service Account",
|
|
304
328
|
help: "Optional service account for launched worker pods",
|
|
305
329
|
},
|
|
330
|
+
workerProvisioningKubernetesImagePullSecrets: {
|
|
331
|
+
label: "Kubernetes Image Pull Secrets",
|
|
332
|
+
help: "Optional secret names added to launched worker pods so they can pull private images",
|
|
333
|
+
},
|
|
306
334
|
workerProvisioningKubernetesWorkspacePersistentVolumeClaim: {
|
|
307
335
|
label: "Kubernetes Workspace PVC",
|
|
308
336
|
help: "Optional PVC mounted as the persistent workspace root for launched worker pods",
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type { PluginConfig, TeamState } from "../types.js";
|
|
2
2
|
|
|
3
3
|
export function hasOnDemandWorkerProvisioning(
|
|
4
|
-
config: Pick<PluginConfig, "workerProvisioningType">,
|
|
4
|
+
config: Pick<PluginConfig, "workerProvisioningType" | "processModel">,
|
|
5
5
|
): boolean {
|
|
6
6
|
return config.workerProvisioningType !== "none";
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
export function shouldBlockControllerWithoutWorkers(
|
|
10
|
-
config: Pick<PluginConfig, "workerProvisioningType">,
|
|
10
|
+
config: Pick<PluginConfig, "workerProvisioningType" | "processModel">,
|
|
11
11
|
state: TeamState | null,
|
|
12
12
|
): boolean {
|
|
13
13
|
return !!state && Object.keys(state.workers).length === 0 && !hasOnDemandWorkerProvisioning(config);
|