forge-openclaw-plugin 0.3.11 → 0.3.13
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/dist/openclaw/tools.js +2 -0
- package/dist/server/server/migrations/071_agent_runtime_claude_identity.sql +49 -0
- package/dist/server/server/src/app.js +30 -0
- package/dist/server/server/src/openapi.js +5 -2
- package/dist/server/server/src/repositories/agent-runtime-sessions.js +27 -0
- package/dist/server/server/src/repositories/settings.js +2 -1
- package/dist/server/server/src/types.js +2 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/server/migrations/071_agent_runtime_claude_identity.sql +49 -0
- package/skills/forge-openclaw/SKILL.md +4 -0
- package/skills/forge-openclaw/entity_conversation_playbooks.md +4 -0
package/dist/openclaw/tools.js
CHANGED
|
@@ -173,6 +173,7 @@ const lifeForceRouteSpecs = {
|
|
|
173
173
|
const workbenchRouteSpecs = {
|
|
174
174
|
boxCatalog: { method: "GET", path: "/api/v1/workbench/catalog/boxes" },
|
|
175
175
|
listFlows: { method: "GET", path: "/api/v1/workbench/flows" },
|
|
176
|
+
flowDetail: { method: "GET", path: "/api/v1/workbench/flows/:id" },
|
|
176
177
|
flowById: { method: "GET", path: "/api/v1/workbench/flows/:id" },
|
|
177
178
|
flowBySlug: {
|
|
178
179
|
method: "GET",
|
|
@@ -212,6 +213,7 @@ const workbenchRouteSpecs = {
|
|
|
212
213
|
method: "GET",
|
|
213
214
|
path: "/api/v1/workbench/flows/:id/output"
|
|
214
215
|
},
|
|
216
|
+
runHistory: { method: "GET", path: "/api/v1/workbench/flows/:id/runs" },
|
|
215
217
|
runs: { method: "GET", path: "/api/v1/workbench/flows/:id/runs" },
|
|
216
218
|
runDetail: {
|
|
217
219
|
method: "GET",
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
INSERT OR IGNORE INTO users (
|
|
2
|
+
id, kind, handle, display_name, description, accent_color, created_at, updated_at
|
|
3
|
+
) VALUES (
|
|
4
|
+
'user_agent_claude',
|
|
5
|
+
'bot',
|
|
6
|
+
'claude',
|
|
7
|
+
'Claude Code',
|
|
8
|
+
'Claude Code runtime actor linked to Forge agent identity and Kanban ownership.',
|
|
9
|
+
'#f97316',
|
|
10
|
+
datetime('now'),
|
|
11
|
+
datetime('now')
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
UPDATE users
|
|
15
|
+
SET kind = 'bot',
|
|
16
|
+
handle = 'claude',
|
|
17
|
+
display_name = 'Claude Code',
|
|
18
|
+
description = 'Claude Code runtime actor linked to Forge agent identity and Kanban ownership.',
|
|
19
|
+
accent_color = '#f97316',
|
|
20
|
+
updated_at = datetime('now')
|
|
21
|
+
WHERE id = 'user_agent_claude';
|
|
22
|
+
|
|
23
|
+
UPDATE agent_identities
|
|
24
|
+
SET label = 'Forge Claude Code',
|
|
25
|
+
agent_type = 'claude',
|
|
26
|
+
provider = 'claude',
|
|
27
|
+
identity_key = COALESCE(identity_key, 'runtime:claude:legacy:default'),
|
|
28
|
+
machine_key = COALESCE(machine_key, 'legacy'),
|
|
29
|
+
persona_key = COALESCE(persona_key, 'default'),
|
|
30
|
+
description = 'Forge Claude Code runtime agent with stable Forge identity and linked Kanban user.',
|
|
31
|
+
updated_at = datetime('now')
|
|
32
|
+
WHERE lower(agent_type) = 'claude'
|
|
33
|
+
OR lower(label) IN ('forge claude', 'forge claude code', 'claude', 'claude code');
|
|
34
|
+
|
|
35
|
+
INSERT OR IGNORE INTO agent_identity_users (
|
|
36
|
+
agent_id, user_id, role, created_at, updated_at
|
|
37
|
+
)
|
|
38
|
+
SELECT id, 'user_agent_claude', 'primary', datetime('now'), datetime('now')
|
|
39
|
+
FROM agent_identities
|
|
40
|
+
WHERE provider = 'claude';
|
|
41
|
+
|
|
42
|
+
UPDATE agent_runtime_sessions
|
|
43
|
+
SET agent_label = 'Forge Claude Code',
|
|
44
|
+
agent_type = 'claude',
|
|
45
|
+
provider = 'claude',
|
|
46
|
+
updated_at = datetime('now')
|
|
47
|
+
WHERE provider = 'claude'
|
|
48
|
+
OR lower(agent_type) = 'claude'
|
|
49
|
+
OR lower(agent_label) IN ('forge claude', 'forge claude code', 'claude', 'claude code');
|
|
@@ -5134,9 +5134,11 @@ function buildAgentOnboardingPayload(request) {
|
|
|
5134
5134
|
summary: "Dedicated graph-flow API. Use it for flow catalog reads, flow CRUD, execution, run history, published outputs, node results, and latest successful node outputs.",
|
|
5135
5135
|
routeKeys: [
|
|
5136
5136
|
"listFlows",
|
|
5137
|
+
"flowDetail",
|
|
5137
5138
|
"flowById",
|
|
5138
5139
|
"flowBySlug",
|
|
5139
5140
|
"publishedOutput",
|
|
5141
|
+
"runHistory",
|
|
5140
5142
|
"runs",
|
|
5141
5143
|
"runDetail",
|
|
5142
5144
|
"runNodes",
|
|
@@ -5160,9 +5162,11 @@ function buildAgentOnboardingPayload(request) {
|
|
|
5160
5162
|
],
|
|
5161
5163
|
methodRoutes: {
|
|
5162
5164
|
listFlows: "GET /api/v1/workbench/flows",
|
|
5165
|
+
flowDetail: "GET /api/v1/workbench/flows/:id",
|
|
5163
5166
|
flowById: "GET /api/v1/workbench/flows/:id",
|
|
5164
5167
|
flowBySlug: "GET /api/v1/workbench/flows/by-slug/:slug",
|
|
5165
5168
|
publishedOutput: "GET /api/v1/workbench/flows/:id/output",
|
|
5169
|
+
runHistory: "GET /api/v1/workbench/flows/:id/runs",
|
|
5166
5170
|
runs: "GET /api/v1/workbench/flows/:id/runs",
|
|
5167
5171
|
runDetail: "GET /api/v1/workbench/flows/:id/runs/:runId",
|
|
5168
5172
|
runNodes: "GET /api/v1/workbench/flows/:id/runs/:runId/nodes",
|
|
@@ -5178,9 +5182,11 @@ function buildAgentOnboardingPayload(request) {
|
|
|
5178
5182
|
},
|
|
5179
5183
|
readRoutes: {
|
|
5180
5184
|
listFlows: "/api/v1/workbench/flows",
|
|
5185
|
+
flowDetail: "/api/v1/workbench/flows/:id",
|
|
5181
5186
|
flowById: "/api/v1/workbench/flows/:id",
|
|
5182
5187
|
flowBySlug: "/api/v1/workbench/flows/by-slug/:slug",
|
|
5183
5188
|
publishedOutput: "/api/v1/workbench/flows/:id/output",
|
|
5189
|
+
runHistory: "/api/v1/workbench/flows/:id/runs",
|
|
5184
5190
|
runs: "/api/v1/workbench/flows/:id/runs",
|
|
5185
5191
|
runDetail: "/api/v1/workbench/flows/:id/runs/:runId",
|
|
5186
5192
|
runNodes: "/api/v1/workbench/flows/:id/runs/:runId/nodes",
|
|
@@ -5199,6 +5205,7 @@ function buildAgentOnboardingPayload(request) {
|
|
|
5199
5205
|
notes: [
|
|
5200
5206
|
"Workbench is a dedicated execution surface, not a batch CRUD entity family.",
|
|
5201
5207
|
"Route-selection questions are internal. User-facing questions should ask whether the user needs the saved flow, its input contract, one run, one node, or the public result instead of reciting Workbench route keys.",
|
|
5208
|
+
"`flowDetail` is the plain saved-flow detail route-key alias for `flowById`, and `runHistory` is the plain run-history route-key alias for `runs`. Keep the older keys valid for existing agents, but prefer the clearer aliases in new examples and guidance.",
|
|
5202
5209
|
"Use the flow routes when the agent needs stable public input contracts, published outputs, node-level results, or reusable execution history.",
|
|
5203
5210
|
"If the user is still figuring out inputs or editable structure, read flow detail or box catalog before asking them to reconstruct structured inputs from memory.",
|
|
5204
5211
|
"For flow creation, clarify what the flow should reliably produce, which input contract it should accept, and which first node or box anchors the flow before asking for structured input details.",
|
|
@@ -5305,6 +5312,25 @@ function buildAgentOnboardingPayload(request) {
|
|
|
5305
5312
|
"Use a distinct actor label such as Albert (codex) so Codex-originated work stays readable in Forge history.",
|
|
5306
5313
|
"The Forge MCP bridge now self-registers as a live agent session and heartbeats while the MCP server process stays alive."
|
|
5307
5314
|
]
|
|
5315
|
+
},
|
|
5316
|
+
claude: {
|
|
5317
|
+
label: "Claude Code",
|
|
5318
|
+
installSteps: [
|
|
5319
|
+
"Install Claude Code, then run npx forge-memory configure and select Claude Code.",
|
|
5320
|
+
"Keep Claude pointed at the same Forge origin, port, and shared data root used by the rest of the local runtime.",
|
|
5321
|
+
"Restart the Claude Code session after MCP configuration changes so the Forge MCP server starts cleanly."
|
|
5322
|
+
],
|
|
5323
|
+
verifyCommands: [
|
|
5324
|
+
"claude mcp list",
|
|
5325
|
+
"claude mcp get forge",
|
|
5326
|
+
"claude",
|
|
5327
|
+
`curl -s ${origin}/api/v1/health`
|
|
5328
|
+
],
|
|
5329
|
+
configNotes: [
|
|
5330
|
+
"Forge Memory writes one user-scope Claude MCP server named forge in ~/.claude.json.",
|
|
5331
|
+
"The Claude MCP server command is npx forge-memory mcp, so Claude shares the same Forge runtime and data root as OpenClaw, Hermes, and Codex.",
|
|
5332
|
+
"Use a distinct actor label such as Albert (claude) so Claude-originated work stays readable in Forge history."
|
|
5333
|
+
]
|
|
5308
5334
|
}
|
|
5309
5335
|
},
|
|
5310
5336
|
verificationPaths: {
|
|
@@ -5340,8 +5366,10 @@ function buildAgentOnboardingPayload(request) {
|
|
|
5340
5366
|
movementTripPointDelete: "/api/v1/movement/trips/:id/points/:pointId",
|
|
5341
5367
|
workbenchBoxCatalog: "/api/v1/workbench/catalog/boxes",
|
|
5342
5368
|
workbenchFlows: "/api/v1/workbench/flows",
|
|
5369
|
+
workbenchFlowDetail: "/api/v1/workbench/flows/:id",
|
|
5343
5370
|
workbenchFlowBySlug: "/api/v1/workbench/flows/by-slug/:slug",
|
|
5344
5371
|
workbenchPublishedOutput: "/api/v1/workbench/flows/:id/output",
|
|
5372
|
+
workbenchRunHistory: "/api/v1/workbench/flows/:id/runs",
|
|
5345
5373
|
workbenchRuns: "/api/v1/workbench/flows/:id/runs",
|
|
5346
5374
|
workbenchRunDetail: "/api/v1/workbench/flows/:id/runs/:runId",
|
|
5347
5375
|
workbenchNodeResult: "/api/v1/workbench/flows/:id/runs/:runId/nodes/:nodeId",
|
|
@@ -5510,10 +5538,12 @@ function buildAgentOnboardingPayload(request) {
|
|
|
5510
5538
|
lifeForceWeekdayTemplate: '{"routeKey":"weekdayTemplate","pathParams":{"weekday":"monday"},"body":{"points":[{"hour":13,"freeAp":-4}]}}',
|
|
5511
5539
|
lifeForceFatigueSignal: '{"routeKey":"fatigueSignal","body":{"signal":"tired","intensity":7,"note":"Sharp post-lunch dip after clinic admin."}}',
|
|
5512
5540
|
workbenchFlowCatalog: '{"routeKey":"listFlows","query":{"includeArchived":false}}',
|
|
5541
|
+
workbenchFlowDetail: '{"routeKey":"flowDetail","pathParams":{"id":"flow_research_digest"}}',
|
|
5513
5542
|
workbenchBoxCatalog: '{"routeKey":"boxCatalog"}',
|
|
5514
5543
|
workbenchCreateFlow: '{"routeKey":"createFlow","body":{"title":"Research digest","slug":"research-digest","description":"Turn a topic into a cited digest with a stable published summary.","nodes":[],"edges":[]}}',
|
|
5515
5544
|
workbenchUpdateFlow: '{"routeKey":"updateFlow","pathParams":{"id":"flow_research_digest"},"body":{"description":"Keep the same input contract but add a stronger evidence-check node."}}',
|
|
5516
5545
|
workbenchDeleteFlow: '{"routeKey":"deleteFlow","pathParams":{"id":"flow_research_digest"}}',
|
|
5546
|
+
workbenchRunHistory: '{"routeKey":"runHistory","pathParams":{"id":"flow_research_digest"},"query":{"limit":10}}',
|
|
5517
5547
|
workbenchRunDetail: '{"routeKey":"runDetail","pathParams":{"id":"flow_research_digest","runId":"run_123"}}',
|
|
5518
5548
|
workbenchRunNodes: '{"routeKey":"runNodes","pathParams":{"id":"flow_research_digest","runId":"run_123"}}',
|
|
5519
5549
|
workbenchNodeResult: '{"routeKey":"nodeResult","pathParams":{"id":"flow_research_digest","runId":"run_123","nodeId":"node_summary"}}',
|
|
@@ -2380,7 +2380,7 @@ export function buildOpenApiDocument() {
|
|
|
2380
2380
|
identityKey: nullable({ type: "string" }),
|
|
2381
2381
|
provider: nullable({
|
|
2382
2382
|
type: "string",
|
|
2383
|
-
enum: ["openclaw", "hermes", "codex"]
|
|
2383
|
+
enum: ["openclaw", "hermes", "codex", "claude"]
|
|
2384
2384
|
}),
|
|
2385
2385
|
machineKey: nullable({ type: "string" }),
|
|
2386
2386
|
personaKey: nullable({ type: "string" }),
|
|
@@ -2488,7 +2488,10 @@ export function buildOpenApiDocument() {
|
|
|
2488
2488
|
agentId: nullable({ type: "string" }),
|
|
2489
2489
|
agentLabel: { type: "string" },
|
|
2490
2490
|
agentType: { type: "string" },
|
|
2491
|
-
provider: {
|
|
2491
|
+
provider: {
|
|
2492
|
+
type: "string",
|
|
2493
|
+
enum: ["openclaw", "hermes", "codex", "claude"]
|
|
2494
|
+
},
|
|
2492
2495
|
sessionKey: { type: "string" },
|
|
2493
2496
|
sessionLabel: { type: "string" },
|
|
2494
2497
|
actorLabel: { type: "string" },
|
|
@@ -49,6 +49,21 @@ function toReconnectPlan(row) {
|
|
|
49
49
|
automationSupported: false
|
|
50
50
|
});
|
|
51
51
|
}
|
|
52
|
+
if (row.provider === "claude") {
|
|
53
|
+
return agentRuntimeReconnectPlanSchema.parse({
|
|
54
|
+
summary: "Restart or resume Claude Code so the Forge MCP server starts again and reconnects to the shared Forge runtime.",
|
|
55
|
+
commands: [
|
|
56
|
+
"claude mcp list",
|
|
57
|
+
"claude mcp get forge",
|
|
58
|
+
`curl -s ${forgeBaseUrl}/api/v1/health`
|
|
59
|
+
],
|
|
60
|
+
notes: [
|
|
61
|
+
"Forge Memory configures Claude through a user-scope MCP server named forge that runs npx forge-memory mcp.",
|
|
62
|
+
"If Forge is local, keep Claude pointed at the same Forge origin, port, and shared data root."
|
|
63
|
+
],
|
|
64
|
+
automationSupported: false
|
|
65
|
+
});
|
|
66
|
+
}
|
|
52
67
|
return agentRuntimeReconnectPlanSchema.parse({
|
|
53
68
|
summary: "Restart or resume the Codex session so the Forge MCP bridge launches again and re-registers with Forge.",
|
|
54
69
|
commands: [
|
|
@@ -229,6 +244,9 @@ function canonicalRuntimeAgentLabel(provider) {
|
|
|
229
244
|
if (provider === "hermes") {
|
|
230
245
|
return "Forge Hermes";
|
|
231
246
|
}
|
|
247
|
+
if (provider === "claude") {
|
|
248
|
+
return "Forge Claude Code";
|
|
249
|
+
}
|
|
232
250
|
return "Forge Codex";
|
|
233
251
|
}
|
|
234
252
|
function canonicalRuntimeDescription(provider) {
|
|
@@ -253,6 +271,15 @@ function canonicalAgentUserSpec(provider) {
|
|
|
253
271
|
accentColor: "#a78bfa"
|
|
254
272
|
};
|
|
255
273
|
}
|
|
274
|
+
if (provider === "claude") {
|
|
275
|
+
return {
|
|
276
|
+
id: "user_agent_claude",
|
|
277
|
+
handle: "claude",
|
|
278
|
+
displayName: "Claude Code",
|
|
279
|
+
description: "Claude Code runtime actor linked to Forge agent identity and Kanban ownership.",
|
|
280
|
+
accentColor: "#f97316"
|
|
281
|
+
};
|
|
282
|
+
}
|
|
256
283
|
return {
|
|
257
284
|
id: "user_agent_codex",
|
|
258
285
|
handle: "codex",
|
|
@@ -415,7 +415,8 @@ function runtimeProviderFromAgentType(agentType) {
|
|
|
415
415
|
const normalized = normalizeAgentIdentityPart(agentType);
|
|
416
416
|
if (normalized === "openclaw" ||
|
|
417
417
|
normalized === "hermes" ||
|
|
418
|
-
normalized === "codex"
|
|
418
|
+
normalized === "codex" ||
|
|
419
|
+
normalized === "claude") {
|
|
419
420
|
return normalized;
|
|
420
421
|
}
|
|
421
422
|
return null;
|
|
@@ -289,7 +289,8 @@ export const defaultAgentScopePolicy = {
|
|
|
289
289
|
export const agentRuntimeProviderSchema = z.enum([
|
|
290
290
|
"openclaw",
|
|
291
291
|
"hermes",
|
|
292
|
-
"codex"
|
|
292
|
+
"codex",
|
|
293
|
+
"claude"
|
|
293
294
|
]);
|
|
294
295
|
export const agentRuntimeConnectionModeSchema = z.enum([
|
|
295
296
|
"operator_session",
|
package/openclaw.plugin.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"id": "forge-openclaw-plugin",
|
|
3
3
|
"name": "Forge",
|
|
4
4
|
"description": "Curated OpenClaw adapter for the Forge collaboration API, UI entrypoint, and localhost auto-start runtime.",
|
|
5
|
-
"version": "0.3.
|
|
5
|
+
"version": "0.3.13",
|
|
6
6
|
"activation": {
|
|
7
7
|
"onStartup": true,
|
|
8
8
|
"onCapabilities": [
|
package/package.json
CHANGED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
INSERT OR IGNORE INTO users (
|
|
2
|
+
id, kind, handle, display_name, description, accent_color, created_at, updated_at
|
|
3
|
+
) VALUES (
|
|
4
|
+
'user_agent_claude',
|
|
5
|
+
'bot',
|
|
6
|
+
'claude',
|
|
7
|
+
'Claude Code',
|
|
8
|
+
'Claude Code runtime actor linked to Forge agent identity and Kanban ownership.',
|
|
9
|
+
'#f97316',
|
|
10
|
+
datetime('now'),
|
|
11
|
+
datetime('now')
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
UPDATE users
|
|
15
|
+
SET kind = 'bot',
|
|
16
|
+
handle = 'claude',
|
|
17
|
+
display_name = 'Claude Code',
|
|
18
|
+
description = 'Claude Code runtime actor linked to Forge agent identity and Kanban ownership.',
|
|
19
|
+
accent_color = '#f97316',
|
|
20
|
+
updated_at = datetime('now')
|
|
21
|
+
WHERE id = 'user_agent_claude';
|
|
22
|
+
|
|
23
|
+
UPDATE agent_identities
|
|
24
|
+
SET label = 'Forge Claude Code',
|
|
25
|
+
agent_type = 'claude',
|
|
26
|
+
provider = 'claude',
|
|
27
|
+
identity_key = COALESCE(identity_key, 'runtime:claude:legacy:default'),
|
|
28
|
+
machine_key = COALESCE(machine_key, 'legacy'),
|
|
29
|
+
persona_key = COALESCE(persona_key, 'default'),
|
|
30
|
+
description = 'Forge Claude Code runtime agent with stable Forge identity and linked Kanban user.',
|
|
31
|
+
updated_at = datetime('now')
|
|
32
|
+
WHERE lower(agent_type) = 'claude'
|
|
33
|
+
OR lower(label) IN ('forge claude', 'forge claude code', 'claude', 'claude code');
|
|
34
|
+
|
|
35
|
+
INSERT OR IGNORE INTO agent_identity_users (
|
|
36
|
+
agent_id, user_id, role, created_at, updated_at
|
|
37
|
+
)
|
|
38
|
+
SELECT id, 'user_agent_claude', 'primary', datetime('now'), datetime('now')
|
|
39
|
+
FROM agent_identities
|
|
40
|
+
WHERE provider = 'claude';
|
|
41
|
+
|
|
42
|
+
UPDATE agent_runtime_sessions
|
|
43
|
+
SET agent_label = 'Forge Claude Code',
|
|
44
|
+
agent_type = 'claude',
|
|
45
|
+
provider = 'claude',
|
|
46
|
+
updated_at = datetime('now')
|
|
47
|
+
WHERE provider = 'claude'
|
|
48
|
+
OR lower(agent_type) = 'claude'
|
|
49
|
+
OR lower(agent_label) IN ('forge claude', 'forge claude code', 'claude', 'claude code');
|
|
@@ -145,6 +145,8 @@ Concrete route-key examples for internal use:
|
|
|
145
145
|
`{"routeKey":"fatigueSignal","body":{"signal":"tired","intensity":7,"note":"Sharp post-lunch dip after clinic admin."}}`
|
|
146
146
|
- Workbench flow catalog:
|
|
147
147
|
`{"routeKey":"listFlows","query":{"includeArchived":false}}`
|
|
148
|
+
- Workbench flow detail:
|
|
149
|
+
`{"routeKey":"flowDetail","pathParams":{"id":"flow_research_digest"}}`
|
|
148
150
|
- Workbench box catalog:
|
|
149
151
|
`{"routeKey":"boxCatalog"}`
|
|
150
152
|
- Workbench flow creation:
|
|
@@ -153,6 +155,8 @@ Concrete route-key examples for internal use:
|
|
|
153
155
|
`{"routeKey":"updateFlow","pathParams":{"id":"flow_research_digest"},"body":{"description":"Keep the same input contract but add a stronger evidence-check node."}}`
|
|
154
156
|
- Workbench flow deletion:
|
|
155
157
|
`{"routeKey":"deleteFlow","pathParams":{"id":"flow_research_digest"}}`
|
|
158
|
+
- Workbench run history:
|
|
159
|
+
`{"routeKey":"runHistory","pathParams":{"id":"flow_research_digest"},"query":{"limit":10}}`
|
|
156
160
|
- Workbench run detail:
|
|
157
161
|
`{"routeKey":"runDetail","pathParams":{"id":"flow_research_digest","runId":"run_123"}}`
|
|
158
162
|
- Workbench run nodes:
|
|
@@ -2221,6 +2221,8 @@ Lane-to-route map:
|
|
|
2221
2221
|
|
|
2222
2222
|
- discover or inspect flows:
|
|
2223
2223
|
`/api/v1/workbench/flows`, `/api/v1/workbench/flows/:id`, or `/api/v1/workbench/flows/by-slug/:slug`
|
|
2224
|
+
Use route key `flowDetail` for saved-flow detail by id; `flowById` remains valid
|
|
2225
|
+
for older agents.
|
|
2224
2226
|
- create, update, or delete a flow:
|
|
2225
2227
|
`POST /api/v1/workbench/flows`, then `PATCH /api/v1/workbench/flows/:id` or
|
|
2226
2228
|
`DELETE /api/v1/workbench/flows/:id` for an existing saved flow
|
|
@@ -2232,6 +2234,8 @@ Lane-to-route map:
|
|
|
2232
2234
|
`POST /api/v1/workbench/flows/:id/chat`
|
|
2233
2235
|
- inspect published output or run history:
|
|
2234
2236
|
`/api/v1/workbench/flows/:id/output` or `/api/v1/workbench/flows/:id/runs`
|
|
2237
|
+
Use route key `runHistory` for the run-history read; `runs` remains valid for
|
|
2238
|
+
older agents.
|
|
2235
2239
|
- inspect one run or node result:
|
|
2236
2240
|
`/api/v1/workbench/flows/:id/runs/:runId`,
|
|
2237
2241
|
`/api/v1/workbench/flows/:id/runs/:runId/nodes`,
|