@netnodeag/kraftwerk 0.4.1 → 0.7.0
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 +192 -6
- package/dist/cli/doctor.js +77 -2
- package/dist/cli/init.js +65 -15
- package/dist/cli/knowledge.d.ts +2 -0
- package/dist/cli/knowledge.js +213 -0
- package/dist/cli/kraftwerk.js +12 -10
- package/dist/cli/runs.js +13 -6
- package/dist/cli/ui.js +3 -4
- package/dist/config.d.ts +9 -0
- package/dist/config.js +5 -2
- package/dist/gates.d.ts +7 -0
- package/dist/gates.js +27 -0
- package/dist/harnesses/claude.js +0 -1
- package/dist/inspector/chat/acp.d.ts +2 -2
- package/dist/inspector/chat/acp.js +44 -3
- package/dist/inspector/chat/backend.d.ts +14 -0
- package/dist/inspector/chat/pi.d.ts +2 -0
- package/dist/inspector/chat/pi.js +106 -0
- package/dist/inspector/chat/sessions.d.ts +33 -0
- package/dist/inspector/chat/sessions.js +407 -0
- package/dist/inspector/chat/store.d.ts +8 -0
- package/dist/inspector/chat/store.js +69 -0
- package/dist/inspector/chat/types.d.ts +7 -0
- package/dist/inspector/context.d.ts +7 -2
- package/dist/inspector/context.js +11 -3
- package/dist/inspector/knowledge.d.ts +24 -0
- package/dist/inspector/knowledge.js +41 -0
- package/dist/inspector/routines.d.ts +56 -0
- package/dist/inspector/routines.js +266 -0
- package/dist/inspector/runner.d.ts +10 -0
- package/dist/inspector/runner.js +6 -8
- package/dist/inspector/runs.d.ts +2 -0
- package/dist/inspector/runs.js +17 -12
- package/dist/inspector/server.d.ts +2 -0
- package/dist/inspector/server.js +311 -1
- package/dist/inspector/skills.d.ts +26 -0
- package/dist/inspector/skills.js +65 -0
- package/dist/inspector/team.d.ts +57 -0
- package/dist/inspector/team.js +121 -0
- package/dist/okf.d.ts +118 -0
- package/dist/okf.js +398 -0
- package/dist/runner/docker.d.ts +3 -1
- package/dist/runner/docker.js +5 -5
- package/dist/workflow.d.ts +7 -0
- package/dist/workflow.js +19 -0
- package/dist/yaml.js +43 -10
- package/inspector/dist/assets/index-C8AKqc_i.css +1 -0
- package/inspector/dist/assets/index-G3eFm1X4.js +13 -0
- package/inspector/dist/assets/roboto-latin-400-normal-BqEyEoaF.woff2 +0 -0
- package/inspector/dist/assets/roboto-latin-400-normal-D27F5sTu.woff +0 -0
- package/inspector/dist/assets/roboto-latin-500-normal-7RbcRiD8.woff2 +0 -0
- package/inspector/dist/assets/roboto-latin-500-normal-fsTFPL3E.woff +0 -0
- package/inspector/dist/assets/roboto-latin-700-normal-BZpUvMxY.woff2 +0 -0
- package/inspector/dist/assets/roboto-latin-700-normal-YuyVweIx.woff +0 -0
- package/inspector/dist/assets/roboto-mono-latin-400-normal-DBZPkcnn.woff +0 -0
- package/inspector/dist/assets/roboto-mono-latin-400-normal-GekRknry.woff2 +0 -0
- package/inspector/dist/assets/roboto-mono-latin-500-normal-D6j6AMzd.woff +0 -0
- package/inspector/dist/assets/roboto-mono-latin-500-normal-pxIOXZmA.woff2 +0 -0
- package/inspector/dist/assets/roboto-mono-latin-700-normal-CHYrj1DZ.woff +0 -0
- package/inspector/dist/assets/roboto-mono-latin-700-normal-foxDnrFi.woff2 +0 -0
- package/inspector/dist/index.html +2 -2
- package/package.json +1 -1
- package/schema/workflow.schema.json +166 -31
- package/inspector/dist/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/inspector/dist/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/inspector/dist/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/inspector/dist/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/inspector/dist/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
- package/inspector/dist/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
- package/inspector/dist/assets/ibm-plex-mono-latin-700-normal-7sUh57Bg.woff2 +0 -0
- package/inspector/dist/assets/ibm-plex-mono-latin-700-normal-CNHXzs6v.woff +0 -0
- package/inspector/dist/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- package/inspector/dist/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
- package/inspector/dist/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- package/inspector/dist/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
- package/inspector/dist/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
- package/inspector/dist/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- package/inspector/dist/assets/ibm-plex-sans-latin-700-normal-Bth3BMcD.woff +0 -0
- package/inspector/dist/assets/ibm-plex-sans-latin-700-normal-Bxkt5Cjx.woff2 +0 -0
- package/inspector/dist/assets/index-BCSWkslF.css +0 -1
- package/inspector/dist/assets/index-D6WuziFQ.js +0 -9
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
} catch (e) {}
|
|
16
16
|
})();
|
|
17
17
|
</script>
|
|
18
|
-
<script type="module" crossorigin src="/assets/index-
|
|
19
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
18
|
+
<script type="module" crossorigin src="/assets/index-G3eFm1X4.js"></script>
|
|
19
|
+
<link rel="stylesheet" crossorigin href="/assets/index-C8AKqc_i.css">
|
|
20
20
|
</head>
|
|
21
21
|
<body>
|
|
22
22
|
<div id="root"></div>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@netnodeag/kraftwerk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Deterministic workflow-as-code framework: agents (persona + model + tools + harness) run in bounded phases on headless CLI harnesses (claude -p, codex exec, pi); code owns the control flow, envelopes + gates judge the results",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agents",
|
|
@@ -4,7 +4,11 @@
|
|
|
4
4
|
"title": "kraftwerk workflow",
|
|
5
5
|
"description": "A linear workflow of gated agent steps. Folder form: <name>/workflow.yml, where single-line prompt/persona/workspace values may reference files inside the folder (e.g. prompts/step.md).",
|
|
6
6
|
"type": "object",
|
|
7
|
-
"required": [
|
|
7
|
+
"required": [
|
|
8
|
+
"name",
|
|
9
|
+
"description",
|
|
10
|
+
"steps"
|
|
11
|
+
],
|
|
8
12
|
"additionalProperties": false,
|
|
9
13
|
"properties": {
|
|
10
14
|
"name": {
|
|
@@ -22,21 +26,33 @@
|
|
|
22
26
|
},
|
|
23
27
|
"requires": {
|
|
24
28
|
"type": "array",
|
|
25
|
-
"items": {
|
|
29
|
+
"items": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
|
|
32
|
+
},
|
|
26
33
|
"description": "Environment variables the workflow needs (API tokens etc.). Checked before the run starts; missing variables abort with a clear error instead of failing mid-run."
|
|
27
34
|
},
|
|
28
35
|
"mcp": {
|
|
29
36
|
"type": "object",
|
|
30
37
|
"description": "MCP servers stored alongside the workflow, keyed by server name. Agents opt in via their mcp: [names] list.",
|
|
31
|
-
"propertyNames": {
|
|
32
|
-
|
|
38
|
+
"propertyNames": {
|
|
39
|
+
"pattern": "^[A-Za-z0-9_-]+$"
|
|
40
|
+
},
|
|
41
|
+
"additionalProperties": {
|
|
42
|
+
"$ref": "#/definitions/mcpServer"
|
|
43
|
+
}
|
|
33
44
|
},
|
|
34
45
|
"clis": {
|
|
35
46
|
"type": "object",
|
|
36
47
|
"description": "CLIs agents may call via Bash, keyed by command prefix (e.g. git, ddev, npm run) with a one-line usage hint (may be empty). Agents opt in via their clis: [names] list; the hint is injected into the agent's persona once — never repeat it in step prompts. claude scopes its Bash allowlist to Bash(<name>:*); codex runs commands in its sandbox anyway; pi gets the plain bash tool (no scoping).",
|
|
37
|
-
"propertyNames": {
|
|
48
|
+
"propertyNames": {
|
|
49
|
+
"pattern": "^[A-Za-z0-9@_.][A-Za-z0-9@_. /-]*$"
|
|
50
|
+
},
|
|
38
51
|
"additionalProperties": {
|
|
39
|
-
"type": [
|
|
52
|
+
"type": [
|
|
53
|
+
"string",
|
|
54
|
+
"null"
|
|
55
|
+
],
|
|
40
56
|
"description": "One-line usage hint injected into the granting agent's persona; empty/null = name only"
|
|
41
57
|
}
|
|
42
58
|
},
|
|
@@ -44,19 +60,27 @@
|
|
|
44
60
|
"type": "object",
|
|
45
61
|
"minProperties": 1,
|
|
46
62
|
"description": "Agent roster: id -> definition",
|
|
47
|
-
"additionalProperties": {
|
|
63
|
+
"additionalProperties": {
|
|
64
|
+
"$ref": "#/definitions/agent"
|
|
65
|
+
}
|
|
48
66
|
},
|
|
49
67
|
"steps": {
|
|
50
68
|
"type": "array",
|
|
51
69
|
"minItems": 1,
|
|
52
70
|
"description": "Linear sequence of gated steps: agent steps (agent + prompt) or deterministic script steps (run)",
|
|
53
|
-
"items": {
|
|
71
|
+
"items": {
|
|
72
|
+
"$ref": "#/definitions/step"
|
|
73
|
+
}
|
|
54
74
|
}
|
|
55
75
|
},
|
|
56
76
|
"definitions": {
|
|
57
77
|
"agent": {
|
|
58
78
|
"type": "object",
|
|
59
|
-
"required": [
|
|
79
|
+
"required": [
|
|
80
|
+
"model",
|
|
81
|
+
"tools",
|
|
82
|
+
"persona"
|
|
83
|
+
],
|
|
60
84
|
"additionalProperties": false,
|
|
61
85
|
"properties": {
|
|
62
86
|
"name": {
|
|
@@ -73,16 +97,28 @@
|
|
|
73
97
|
"description": "Model id in the harness's naming, e.g. haiku, claude-opus-5, gpt-5.6-sol, deepseek/deepseek-chat"
|
|
74
98
|
},
|
|
75
99
|
"effort": {
|
|
76
|
-
"enum": [
|
|
100
|
+
"enum": [
|
|
101
|
+
"low",
|
|
102
|
+
"medium",
|
|
103
|
+
"high",
|
|
104
|
+
"xhigh",
|
|
105
|
+
"max"
|
|
106
|
+
],
|
|
77
107
|
"description": "Reasoning effort; omit for the model default"
|
|
78
108
|
},
|
|
79
109
|
"runs-on": {
|
|
80
|
-
"enum": [
|
|
110
|
+
"enum": [
|
|
111
|
+
"claude",
|
|
112
|
+
"codex",
|
|
113
|
+
"pi"
|
|
114
|
+
],
|
|
81
115
|
"description": "Harness that executes this agent (default: claude)"
|
|
82
116
|
},
|
|
83
117
|
"tools": {
|
|
84
118
|
"type": "array",
|
|
85
|
-
"items": {
|
|
119
|
+
"items": {
|
|
120
|
+
"type": "string"
|
|
121
|
+
},
|
|
86
122
|
"description": "Governance: the only tools the agent may use, e.g. [Read, Write, Edit, WebFetch]"
|
|
87
123
|
},
|
|
88
124
|
"persona": {
|
|
@@ -92,12 +128,18 @@
|
|
|
92
128
|
},
|
|
93
129
|
"mcp": {
|
|
94
130
|
"type": "array",
|
|
95
|
-
"items": {
|
|
131
|
+
"items": {
|
|
132
|
+
"type": "string",
|
|
133
|
+
"minLength": 1
|
|
134
|
+
},
|
|
96
135
|
"description": "MCP servers this agent may use (names from the top-level mcp map). Governance like tools. Not supported on runs-on: pi."
|
|
97
136
|
},
|
|
98
137
|
"clis": {
|
|
99
138
|
"type": "array",
|
|
100
|
-
"items": {
|
|
139
|
+
"items": {
|
|
140
|
+
"type": "string",
|
|
141
|
+
"minLength": 1
|
|
142
|
+
},
|
|
101
143
|
"description": "CLIs this agent may use (names from the top-level clis map). Their usage hints are injected into the persona; claude additionally scopes the Bash allowlist to these commands."
|
|
102
144
|
}
|
|
103
145
|
}
|
|
@@ -106,7 +148,9 @@
|
|
|
106
148
|
"oneOf": [
|
|
107
149
|
{
|
|
108
150
|
"type": "object",
|
|
109
|
-
"required": [
|
|
151
|
+
"required": [
|
|
152
|
+
"command"
|
|
153
|
+
],
|
|
110
154
|
"additionalProperties": false,
|
|
111
155
|
"properties": {
|
|
112
156
|
"command": {
|
|
@@ -116,19 +160,25 @@
|
|
|
116
160
|
},
|
|
117
161
|
"args": {
|
|
118
162
|
"type": "array",
|
|
119
|
-
"items": {
|
|
163
|
+
"items": {
|
|
164
|
+
"type": "string"
|
|
165
|
+
},
|
|
120
166
|
"description": "Arguments; an arg that resolves to a file inside the workflow folder is made absolute (e.g. mcp/multiply-server.ts)"
|
|
121
167
|
},
|
|
122
168
|
"env": {
|
|
123
169
|
"type": "object",
|
|
124
|
-
"additionalProperties": {
|
|
170
|
+
"additionalProperties": {
|
|
171
|
+
"type": "string"
|
|
172
|
+
},
|
|
125
173
|
"description": "Extra environment variables for the server process"
|
|
126
174
|
}
|
|
127
175
|
}
|
|
128
176
|
},
|
|
129
177
|
{
|
|
130
178
|
"type": "object",
|
|
131
|
-
"required": [
|
|
179
|
+
"required": [
|
|
180
|
+
"url"
|
|
181
|
+
],
|
|
132
182
|
"additionalProperties": false,
|
|
133
183
|
"properties": {
|
|
134
184
|
"url": {
|
|
@@ -142,13 +192,21 @@
|
|
|
142
192
|
},
|
|
143
193
|
"step": {
|
|
144
194
|
"oneOf": [
|
|
145
|
-
{
|
|
146
|
-
|
|
195
|
+
{
|
|
196
|
+
"$ref": "#/definitions/agentStep"
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
"$ref": "#/definitions/scriptStep"
|
|
200
|
+
}
|
|
147
201
|
]
|
|
148
202
|
},
|
|
149
203
|
"agentStep": {
|
|
150
204
|
"type": "object",
|
|
151
|
-
"required": [
|
|
205
|
+
"required": [
|
|
206
|
+
"name",
|
|
207
|
+
"agent",
|
|
208
|
+
"prompt"
|
|
209
|
+
],
|
|
152
210
|
"additionalProperties": false,
|
|
153
211
|
"properties": {
|
|
154
212
|
"name": {
|
|
@@ -169,13 +227,26 @@
|
|
|
169
227
|
"gates": {
|
|
170
228
|
"type": "array",
|
|
171
229
|
"description": "Post-execution file checks; failures trigger an in-session correction",
|
|
172
|
-
"items": {
|
|
230
|
+
"items": {
|
|
231
|
+
"$ref": "#/definitions/gate"
|
|
232
|
+
}
|
|
233
|
+
},
|
|
234
|
+
"if": {
|
|
235
|
+
"type": "array",
|
|
236
|
+
"minItems": 1,
|
|
237
|
+
"description": "Deterministic preconditions (same forms as gates) evaluated against the run directory just before the step. If any fails, the step is SKIPPED — not failed — and the run continues with the next step.",
|
|
238
|
+
"items": {
|
|
239
|
+
"$ref": "#/definitions/gate"
|
|
240
|
+
}
|
|
173
241
|
}
|
|
174
242
|
}
|
|
175
243
|
},
|
|
176
244
|
"scriptStep": {
|
|
177
245
|
"type": "object",
|
|
178
|
-
"required": [
|
|
246
|
+
"required": [
|
|
247
|
+
"name",
|
|
248
|
+
"run"
|
|
249
|
+
],
|
|
179
250
|
"additionalProperties": false,
|
|
180
251
|
"properties": {
|
|
181
252
|
"name": {
|
|
@@ -191,7 +262,17 @@
|
|
|
191
262
|
"gates": {
|
|
192
263
|
"type": "array",
|
|
193
264
|
"description": "Post-execution file checks; script steps have no correction loop — a failing gate fails the run (fix the script)",
|
|
194
|
-
"items": {
|
|
265
|
+
"items": {
|
|
266
|
+
"$ref": "#/definitions/gate"
|
|
267
|
+
}
|
|
268
|
+
},
|
|
269
|
+
"if": {
|
|
270
|
+
"type": "array",
|
|
271
|
+
"minItems": 1,
|
|
272
|
+
"description": "Deterministic preconditions (same forms as gates) evaluated against the run directory just before the step. If any fails, the step is SKIPPED — not failed — and the run continues with the next step.",
|
|
273
|
+
"items": {
|
|
274
|
+
"$ref": "#/definitions/gate"
|
|
275
|
+
}
|
|
195
276
|
}
|
|
196
277
|
}
|
|
197
278
|
},
|
|
@@ -199,7 +280,9 @@
|
|
|
199
280
|
"oneOf": [
|
|
200
281
|
{
|
|
201
282
|
"type": "object",
|
|
202
|
-
"required": [
|
|
283
|
+
"required": [
|
|
284
|
+
"file_non_empty"
|
|
285
|
+
],
|
|
203
286
|
"additionalProperties": false,
|
|
204
287
|
"properties": {
|
|
205
288
|
"file_non_empty": {
|
|
@@ -211,7 +294,9 @@
|
|
|
211
294
|
},
|
|
212
295
|
{
|
|
213
296
|
"type": "object",
|
|
214
|
-
"required": [
|
|
297
|
+
"required": [
|
|
298
|
+
"slots_filled"
|
|
299
|
+
],
|
|
215
300
|
"additionalProperties": false,
|
|
216
301
|
"properties": {
|
|
217
302
|
"slots_filled": {
|
|
@@ -223,20 +308,70 @@
|
|
|
223
308
|
},
|
|
224
309
|
{
|
|
225
310
|
"type": "object",
|
|
226
|
-
"required": [
|
|
311
|
+
"required": [
|
|
312
|
+
"contains"
|
|
313
|
+
],
|
|
227
314
|
"additionalProperties": false,
|
|
228
315
|
"properties": {
|
|
229
316
|
"contains": {
|
|
230
317
|
"type": "object",
|
|
231
|
-
"required": [
|
|
318
|
+
"required": [
|
|
319
|
+
"file",
|
|
320
|
+
"text"
|
|
321
|
+
],
|
|
232
322
|
"additionalProperties": false,
|
|
233
323
|
"properties": {
|
|
234
|
-
"file": {
|
|
235
|
-
|
|
236
|
-
|
|
324
|
+
"file": {
|
|
325
|
+
"type": "string",
|
|
326
|
+
"minLength": 1
|
|
327
|
+
},
|
|
328
|
+
"text": {
|
|
329
|
+
"type": "string",
|
|
330
|
+
"minLength": 1
|
|
331
|
+
},
|
|
332
|
+
"label": {
|
|
333
|
+
"type": "string",
|
|
334
|
+
"description": "Short label used in the gate name; defaults to text"
|
|
335
|
+
}
|
|
237
336
|
}
|
|
238
337
|
}
|
|
239
338
|
}
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
"type": "object",
|
|
342
|
+
"required": [
|
|
343
|
+
"check"
|
|
344
|
+
],
|
|
345
|
+
"additionalProperties": false,
|
|
346
|
+
"properties": {
|
|
347
|
+
"check": {
|
|
348
|
+
"oneOf": [
|
|
349
|
+
{
|
|
350
|
+
"type": "string",
|
|
351
|
+
"minLength": 1,
|
|
352
|
+
"description": "Bash validation script executed in the run directory (single-line value = script file inside the workflow folder). Exit 0 = gate passed; non-zero = failed, and everything the script printed becomes the failure message fed into the correction prompt."
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
"type": "object",
|
|
356
|
+
"required": [
|
|
357
|
+
"run"
|
|
358
|
+
],
|
|
359
|
+
"additionalProperties": false,
|
|
360
|
+
"properties": {
|
|
361
|
+
"run": {
|
|
362
|
+
"type": "string",
|
|
363
|
+
"minLength": 1,
|
|
364
|
+
"description": "Bash validation script (single-line value = script file inside the workflow folder)"
|
|
365
|
+
},
|
|
366
|
+
"label": {
|
|
367
|
+
"type": "string",
|
|
368
|
+
"description": "Short label used in the gate name; defaults to the script reference"
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
]
|
|
373
|
+
}
|
|
374
|
+
}
|
|
240
375
|
}
|
|
241
376
|
]
|
|
242
377
|
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2) format("woff2"),url(/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff) format("woff")}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2) format("woff2"),url(/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff) format("woff")}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2) format("woff2"),url(/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff) format("woff")}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/ibm-plex-sans-latin-700-normal-Bxkt5Cjx.woff2) format("woff2"),url(/assets/ibm-plex-sans-latin-700-normal-Bth3BMcD.woff) format("woff")}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2) format("woff2"),url(/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff) format("woff")}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2) format("woff2"),url(/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff) format("woff")}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2) format("woff2"),url(/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff) format("woff")}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/ibm-plex-mono-latin-700-normal-7sUh57Bg.woff2) format("woff2"),url(/assets/ibm-plex-mono-latin-700-normal-CNHXzs6v.woff) format("woff")}:root{--font-sans: "IBM Plex Sans";--font-mono: "IBM Plex Mono";--bg: #141512;--bg-deep: #0e0f0d;--panel: #1b1d19;--panel-2: #22241f;--line: #2e312a;--line-soft: #262822;--ink: #ecebe3;--ink-2: #b3b1a4;--muted: #7c7a6e;--accent: #f5a623;--accent-dim: rgba(245, 166, 35, .14);--ok: #56c15a;--ok-dim: rgba(86, 193, 90, .14);--fail: #e5484d;--fail-dim: rgba(229, 72, 77, .14);--run: #f5a623;--pending: #4c4e46;--shadow: 0 1px 0 rgba(255, 255, 255, .03) inset, 0 8px 24px rgba(0, 0, 0, .35);color-scheme:dark}:root[data-theme=light]{--bg: #f1f0ea;--bg-deep: #e8e7df;--panel: #fbfaf6;--panel-2: #f3f2ec;--line: #d9d7cc;--line-soft: #e3e1d6;--ink: #1d1e19;--ink-2: #55564c;--muted: #8a887b;--accent: #c77c11;--accent-dim: rgba(199, 124, 17, .12);--ok: #2e8f38;--ok-dim: rgba(46, 143, 56, .12);--fail: #c73538;--fail-dim: rgba(199, 53, 56, .1);--run: #c77c11;--pending: #c9c7bb;--shadow: 0 1px 2px rgba(29, 30, 25, .06);color-scheme:light}*{box-sizing:border-box;margin:0;padding:0}html{height:100%}body{min-height:100%;background:radial-gradient(1200px 400px at 50% -200px,rgba(245,166,35,.05),transparent 70%),var(--bg);color:var(--ink);font-family:var(--font-sans),sans-serif;font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased}a{color:inherit;text-decoration:none}button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}code,pre,.mono{font-family:var(--font-mono),monospace}.topbar{position:sticky;top:0;z-index:10;display:flex;align-items:center;gap:14px;padding:10px 20px;background:color-mix(in srgb,var(--bg) 86%,transparent);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-bottom:1px solid var(--line)}.wordmark{display:flex;align-items:center;gap:10px}.wordmark .lamp-block{width:22px;height:22px;border-radius:5px;background:linear-gradient(135deg,var(--accent),#d2820b);display:grid;place-items:center;box-shadow:0 0 14px #f5a62359}.wordmark .lamp-block span{width:7px;height:7px;border-radius:2px;background:#141512}.wordmark b{font-family:var(--font-mono),monospace;font-size:13.5px;font-weight:700;letter-spacing:.14em;text-transform:uppercase}.wordmark small{font-size:11px;letter-spacing:.22em;text-transform:uppercase;color:var(--muted)}.topbar .spacer{flex:1}.topbar nav{display:flex;gap:4px;margin-left:10px}.topbar nav a{font-size:11px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);padding:4px 10px;border-radius:6px}.topbar nav a:hover{color:var(--ink);background:var(--panel-2)}.topbar .outdir{font-family:var(--font-mono),monospace;font-size:11px;color:var(--muted);max-width:44vw;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.theme-btn{border:1px solid var(--line);border-radius:6px;padding:4px 10px;font-size:11.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-2)}.theme-btn:hover{border-color:var(--accent);color:var(--ink)}.shell{max-width:1240px;margin:0 auto;padding:26px 20px 80px}.microlabel{font-size:10.5px;font-weight:600;letter-spacing:.18em;text-transform:uppercase;color:var(--muted)}.num{font-variant-numeric:tabular-nums}.lamp{width:9px;height:9px;border-radius:50%;flex:none;position:relative}.lamp.ok{background:var(--ok);box-shadow:0 0 6px color-mix(in srgb,var(--ok) 60%,transparent)}.lamp.failed,.lamp.blocked{background:var(--fail);box-shadow:0 0 6px color-mix(in srgb,var(--fail) 60%,transparent)}.lamp.aborted{background:var(--pending)}.lamp.pending{background:transparent;border:1.5px solid var(--pending)}.lamp.running{background:var(--run);animation:lamp-pulse 1.4s ease-in-out infinite}@keyframes lamp-pulse{0%,to{box-shadow:0 0 4px color-mix(in srgb,var(--run) 55%,transparent);opacity:1}50%{box-shadow:0 0 14px var(--run);opacity:.75}}.status-word{font-size:11px;font-weight:650;letter-spacing:.14em;text-transform:uppercase}.status-word.ok{color:var(--ok)}.status-word.failed,.status-word.blocked{color:var(--fail)}.status-word.running{color:var(--run)}.status-word.aborted,.status-word.pending{color:var(--muted)}.page-head{display:flex;align-items:baseline;gap:14px;margin:6px 2px 18px}.page-head h1{font-size:19px;font-weight:650;letter-spacing:-.01em}.page-head .count{color:var(--muted);font-size:13px}.run-list{display:grid;gap:10px}.run-card{display:grid;grid-template-columns:12px 200px 1fr auto;gap:8px 16px;align-items:center;background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:13px 18px;box-shadow:var(--shadow);transition:border-color .12s ease,transform .12s ease}.run-card:hover{border-color:color-mix(in srgb,var(--accent) 55%,var(--line));transform:translateY(-1px)}.run-card .rid{font-family:var(--font-mono),monospace;font-size:12.5px;color:var(--ink-2)}.run-card .wf{font-weight:650;font-size:14px}.run-card .req{color:var(--muted);font-size:12.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:52ch}.run-card .meta{display:flex;gap:18px;align-items:center;font-family:var(--font-mono),monospace;font-size:12px;color:var(--ink-2)}.progress-track{width:90px;height:4px;border-radius:2px;background:var(--line-soft);overflow:hidden}.progress-track i{display:block;height:100%;background:var(--accent);border-radius:2px}.run-card.is-ok .progress-track i{background:var(--ok)}.run-card.is-failed .progress-track i{background:var(--fail)}.empty{border:1px dashed var(--line);border-radius:8px;padding:40px;text-align:center;color:var(--muted)}.crumbs{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--muted);margin-bottom:14px}.crumbs a:hover{color:var(--accent)}.crumbs .sep{color:var(--line)}.detail-head{display:flex;flex-wrap:wrap;align-items:center;gap:10px 16px;margin-bottom:6px}.detail-head h1{font-size:18px;font-weight:650}.detail-head .rid{font-family:var(--font-mono),monospace;font-size:12px;color:var(--muted)}.detail-req{color:var(--ink-2);font-size:13px;margin-bottom:18px;max-width:90ch}.statgrid{display:flex;flex-wrap:wrap;gap:26px;margin-bottom:22px}.stat .microlabel{margin-bottom:1px}.stat .v{font-family:var(--font-mono),monospace;font-size:15px;font-weight:600}.columns{display:grid;grid-template-columns:minmax(430px,5fr) minmax(360px,4fr);gap:18px;align-items:start}@media(max-width:1020px){.columns{grid-template-columns:1fr}}.panel{background:var(--panel);border:1px solid var(--line);border-radius:8px;box-shadow:var(--shadow);overflow:hidden}.panel-head{display:flex;align-items:center;gap:10px;padding:10px 16px;border-bottom:1px solid var(--line-soft);background:var(--panel-2)}.panel-head .microlabel{color:var(--ink-2)}.panel-head .spacer{flex:1}.phases{padding:6px 0}.phase-row{position:relative;padding:10px 16px 10px 40px}.phase-row+.phase-row{border-top:1px solid var(--line-soft)}.phase-row .lamp{position:absolute;left:17px;top:16px}.phase-row:before{content:"";position:absolute;left:21px;top:0;bottom:0;width:1px;background:var(--line-soft)}.phase-row:first-child:before{top:16px}.phase-row:last-child:before{bottom:auto;height:16px}.phase-row .lamp{z-index:1}.phase-top{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}.phase-name{font-weight:650;font-size:13.5px}.chip{font-family:var(--font-mono),monospace;font-size:10.5px;border:1px solid var(--line);border-radius:4px;padding:1px 7px;color:var(--ink-2)}.chip.agent{border-color:color-mix(in srgb,var(--accent) 40%,var(--line));color:var(--accent)}.phase-top .right{margin-left:auto;display:flex;gap:14px;font-family:var(--font-mono),monospace;font-size:11.5px;color:var(--muted)}.phase-sub{margin-top:3px;font-size:12.5px;color:var(--ink-2);max-width:72ch}.phase-activity{margin-top:3px;font-family:var(--font-mono),monospace;font-size:11.5px;color:var(--run)}.phase-activity:before{content:"▸ "}.gate-line{margin-top:5px;display:flex;flex-wrap:wrap;gap:6px}.gate{display:inline-flex;align-items:center;gap:5px;font-family:var(--font-mono),monospace;font-size:10.5px;border-radius:4px;padding:1.5px 7px;background:var(--ok-dim);color:var(--ok)}.gate.failed{background:var(--fail-dim);color:var(--fail)}.gate-fail-msg{margin-top:4px;font-size:12px;color:var(--fail)}.file-list{max-height:300px;overflow:auto}.file-row{display:flex;align-items:center;gap:10px;width:100%;text-align:left;padding:7px 16px;font-family:var(--font-mono),monospace;font-size:12.5px;border-bottom:1px solid var(--line-soft);color:var(--ink-2)}.file-row:last-child{border-bottom:0}.file-row:hover{background:var(--panel-2);color:var(--ink)}.file-row.active{background:var(--accent-dim);color:var(--ink)}.file-row .fname{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-row .fsize{color:var(--muted);font-size:11px}.viewer{border-top:1px solid var(--line)}.viewer-body pre{padding:14px 16px;overflow:auto;max-height:560px;font-size:11.8px;line-height:1.55;white-space:pre-wrap;word-break:break-word;color:var(--ink-2)}.viewer-body iframe{width:100%;height:620px;border:0;background:#fff;display:block}.viewer-body img{max-width:100%;display:block;padding:14px 16px}.viewer-note{padding:6px 16px;font-size:11px;color:var(--muted);border-bottom:1px solid var(--line-soft)}.open-raw{font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);border:1px solid var(--line);border-radius:5px;padding:2px 8px}.open-raw:hover{color:var(--accent);border-color:var(--accent)}.live-note{display:inline-flex;align-items:center;gap:7px;font-size:11px;color:var(--muted)}.wf-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:12px}.wf-card{display:flex;flex-direction:column;gap:6px;background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:16px 18px;box-shadow:var(--shadow);transition:border-color .12s ease,transform .12s ease}.wf-card:hover{border-color:color-mix(in srgb,var(--accent) 55%,var(--line));transform:translateY(-1px)}.wf-card-head{display:flex;align-items:baseline;gap:10px}.wf-name{font-weight:650;font-size:15px;font-family:var(--font-mono),monospace}.wf-desc{color:var(--ink-2);font-size:12.5px;flex:1}.wf-meta{display:flex;gap:8px;font-family:var(--font-mono),monospace;font-size:11.5px;color:var(--muted)}.wf-workspace{font-size:11.5px;color:var(--ink-2);white-space:pre-wrap}.aid-0{--aid: var(--accent)}.aid-1{--aid: #4fb8a8}.aid-2{--aid: #a78bfa}.aid-3{--aid: #e5793b}.agent-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:0}.agent-card{padding:14px 18px;border-right:1px solid var(--line-soft);border-bottom:1px solid var(--line-soft)}.agent-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.agent-head b{font-size:13.5px}.agent-head .spacer{flex:1}.agent-id{font-size:11px;color:var(--muted)}.agent-dot{width:10px;height:10px;border-radius:3px;background:var(--aid);box-shadow:0 0 8px color-mix(in srgb,var(--aid) 45%,transparent)}.agent-tools{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px}.tool-chip{font-family:var(--font-mono),monospace;font-size:10.5px;border:1px solid var(--line);border-radius:4px;padding:1px 6px;color:var(--ink-2)}.agent-persona{margin-top:8px;font-size:12px;color:var(--muted);line-height:1.55;white-space:pre-wrap}.pipeline{padding:8px 0}.step-node{position:relative;display:flex;gap:14px;padding:12px 18px}.step-node+.step-node{border-top:1px solid var(--line-soft)}.step-node:before{content:"";position:absolute;left:30px;top:0;bottom:0;width:1px;background:var(--line-soft)}.step-node:first-child:before{top:18px}.step-node:last-child:before{bottom:auto;height:18px}.step-index{position:relative;z-index:1;flex:none;width:25px;height:25px;border-radius:6px;margin-top:1px;display:grid;place-items:center;font-family:var(--font-mono),monospace;font-size:11.5px;font-weight:700;background:color-mix(in srgb,var(--aid) 16%,var(--panel));border:1px solid color-mix(in srgb,var(--aid) 55%,var(--line));color:var(--aid)}.step-index.is-script{--aid: var(--ink-2)}.step-body{flex:1;min-width:0}.agent-chip{border-color:color-mix(in srgb,var(--aid) 50%,var(--line));color:var(--aid)}.step-source{margin-top:6px}.step-source summary{cursor:pointer;font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);-webkit-user-select:none;user-select:none}.step-source summary:hover{color:var(--accent)}.step-source pre{margin-top:6px;padding:10px 12px;border:1px solid var(--line-soft);border-radius:6px;background:var(--bg-deep);font-size:11.5px;line-height:1.55;white-space:pre-wrap;word-break:break-word;color:var(--ink-2);max-height:360px;overflow:auto}.gate.neutral{background:var(--panel-2);color:var(--ink-2);border:1px solid var(--line-soft)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:var(--line);border-radius:5px;border:2px solid transparent;background-clip:content-box}::-webkit-scrollbar-track{background:transparent}.run-form{display:flex;gap:10px}.run-form input[type=text]{flex:1;font:13px/1.4 var(--font-mono),monospace;color:var(--ink);background:var(--panel-2);border:1px solid var(--line);border-radius:7px;padding:9px 12px;outline:none}.run-form input[type=text]:focus{border-color:var(--accent)}.run-btn{font:600 12.5px/1 var(--font-sans),sans-serif;white-space:nowrap;color:#141512;background:var(--accent);border-radius:7px;padding:10px 16px}.run-btn:hover{filter:brightness(1.08)}.run-btn:disabled{opacity:.45;cursor:not-allowed;filter:none}.run-opts{display:flex;flex-wrap:wrap;gap:6px 22px;margin-top:10px}.run-opts label{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;color:var(--ink-2);cursor:pointer}.run-opts input[type=checkbox]{accent-color:var(--accent)}.run-opts .opt-hint{color:var(--muted)}.sandbox-chip{border:1px solid var(--line);color:var(--ink-2)}.stop-btn{font:600 12px/1 var(--font-sans),sans-serif;color:var(--fail);background:var(--fail-dim);border:1px solid color-mix(in srgb,var(--fail) 40%,transparent);border-radius:7px;padding:7px 13px}.stop-btn:hover{border-color:var(--fail)}.stop-btn:disabled{opacity:.5;cursor:default}.shell:has(.runs-screen){max-width:none;padding:0}.runs-screen{display:grid;grid-template-columns:300px minmax(0,1fr);align-items:start}.runs-side{position:sticky;top:45px;height:calc(100vh - 45px);display:flex;flex-direction:column;border-right:1px solid var(--line);background:var(--panel)}.side-head{display:flex;align-items:center;gap:10px;padding:10px 14px;border-bottom:1px solid var(--line-soft);background:var(--panel-2)}.side-head .spacer{flex:1}.side-list{flex:1;overflow-y:auto}.side-row{display:flex;align-items:flex-start;gap:9px;padding:9px 12px 9px 14px;border-bottom:1px solid var(--line-soft);border-left:2px solid transparent}.side-row .lamp{margin-top:4px}.side-row:hover{background:var(--panel-2)}.side-row.active{background:var(--accent-dim);border-left-color:var(--accent)}.side-row-body{flex:1;min-width:0}.side-row-top{display:flex;align-items:baseline;gap:8px}.side-wf{font-weight:650;font-size:12.5px;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.side-when{font-family:var(--font-mono),monospace;font-size:10.5px;color:var(--muted)}.side-row-sub{display:flex;align-items:baseline;gap:8px;margin-top:1px}.side-req{flex:1;font-size:11.5px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.side-row.active .side-req{color:var(--ink-2)}.side-meta{font-family:var(--font-mono),monospace;font-size:10.5px;color:var(--muted)}.runs-main{padding:16px 20px 40px;min-width:0}.runs-main .detail-head .spacer{flex:1}.tabs{display:flex;gap:2px;background:var(--panel-2);border:1px solid var(--line);border-radius:7px;padding:2px}.tabs button{font-size:11px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);padding:5px 13px;border-radius:5px}.tabs button:hover{color:var(--ink)}.tabs button.active{background:var(--panel);color:var(--ink);box-shadow:var(--shadow)}.run-tab{max-width:1080px}.art-layout{display:grid;grid-template-columns:280px minmax(0,1fr);gap:14px;height:calc(100vh - 168px);min-height:420px}.art-files{display:flex;flex-direction:column;min-height:0}.art-files .file-list{flex:1;max-height:none}.art-viewer{display:flex;flex-direction:column;min-height:0}.art-viewer .viewer{flex:1;display:flex;flex-direction:column;min-height:0;border-top:0}.art-viewer .viewer-body{flex:1;min-height:0}.art-viewer .viewer-body iframe{height:100%}.art-viewer .viewer-body pre{max-height:none;height:100%;box-sizing:border-box}.art-viewer .viewer-body img{max-height:100%;object-fit:contain}.art-viewer .empty{flex:1;display:grid;place-items:center}@media(max-width:940px){.runs-screen{grid-template-columns:1fr}.runs-side{display:none}.art-layout{grid-template-columns:1fr;height:auto}.art-files .file-list{max-height:240px}.art-viewer .viewer-body iframe{height:560px}}
|