@meistrari/tela-skills 1.3.4 → 1.3.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/package.json +2 -2
- package/skill/TELA_SKILL.md +5 -5
- package/skill/index.ts +5 -5
- package/skill/workflow-builders.ts +1 -1
- package/skill/{workflow-nodes-v1-v2.md → workflow-nodes-v2-v3.md} +20 -20
- package/skill/{workflow-references-v1-v2.md → workflow-references-v2-v3.md} +6 -6
- package/skill/workflow-run-builders.ts +2 -2
- package/skill/workflow-spec-builders.ts +4 -4
- package/skill/workflow-v2-create-update.md +12 -23
- package/skill/workflow-v3-create-update.md +65 -0
- package/skill/workflow.md +16 -16
- package/skill/workflows.ts +37 -37
- package/skill/workflow-v1-create-update.md +0 -54
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@meistrari/tela-skills",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.5",
|
|
4
4
|
"description": "Tela API skills for Claude Code",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"open": "^11.0.0"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
|
-
"@meistrari/mise-en-place": "^2.10.
|
|
32
|
+
"@meistrari/mise-en-place": "^2.10.6",
|
|
33
33
|
"bun-types": "^1.3.4"
|
|
34
34
|
}
|
|
35
35
|
}
|
package/skill/TELA_SKILL.md
CHANGED
|
@@ -9,7 +9,7 @@ Skills for interacting with the Tela API. Note: Prompts are called "Canvas" in T
|
|
|
9
9
|
|
|
10
10
|
**IMPORTANT**: When the user shares a Tela URL like `https://app.tela.com/prompt/{id}/craft`, use these skills to fetch and modify the canvas - do NOT use WebFetch.
|
|
11
11
|
|
|
12
|
-
**Workflows**: For workflow authoring and execution, use the `workflow.md` skill which provides version-safe orchestration (
|
|
12
|
+
**Workflows**: For workflow authoring and execution, use the `workflow.md` skill which provides version-safe orchestration (v2/v3), graph validation, and bundled reference docs.
|
|
13
13
|
|
|
14
14
|
## Installation
|
|
15
15
|
|
|
@@ -50,10 +50,10 @@ bun --preload ~/.claude/skills/tela/preload.ts -e "console.log(await tela.listPr
|
|
|
50
50
|
|
|
51
51
|
### Workflow Operations
|
|
52
52
|
|
|
53
|
-
- `tela.createWorkflowVersionV1(payload)` - Create workflow prompt-version in v1 compatibility mode
|
|
54
53
|
- `tela.createWorkflowVersionV2(payload)` - Create workflow prompt-version in v2 compatibility mode
|
|
55
|
-
- `tela.
|
|
54
|
+
- `tela.createWorkflowVersionV3(payload)` - Create workflow prompt-version in v3 compatibility mode
|
|
56
55
|
- `tela.updateWorkflowVersionV2(versionId, payload)` - Update workflow prompt-version in v2 compatibility mode
|
|
56
|
+
- `tela.updateWorkflowVersionV3(versionId, payload)` - Update workflow prompt-version in v3 compatibility mode
|
|
57
57
|
- `tela.runWorkflow(payload)` - Run workflow via `/workflow/test`
|
|
58
58
|
- `tela.getWorkflowRun(runId)` - Get workflow run by ID
|
|
59
59
|
- `tela.waitForWorkflowRun(runId, options?)` - Poll until terminal status
|
|
@@ -63,8 +63,8 @@ bun --preload ~/.claude/skills/tela/preload.ts -e "console.log(await tela.listPr
|
|
|
63
63
|
- `tela.getWorkflowVariablesByStep(promptId, stepId, payload?)` - Get step-targeted compatibility variables
|
|
64
64
|
- `tela.validateWorkflowGraph(graph, { version })` - Validate graph/ports/references by version
|
|
65
65
|
- `tela.assertWorkflowGraphValid(graph, { version })` - Throw on validation errors
|
|
66
|
-
- `tela.
|
|
67
|
-
- `tela.
|
|
66
|
+
- `tela.getWorkflowV2Url(promptId)` - Get legacy UI URL (`/prompt/:id/workflow`)
|
|
67
|
+
- `tela.getWorkflowV3Url(promptId)` - Get DAG UI URL (`/workflows/:id`)
|
|
68
68
|
|
|
69
69
|
### Export
|
|
70
70
|
|
package/skill/index.ts
CHANGED
|
@@ -69,8 +69,8 @@ export {
|
|
|
69
69
|
buildGraph,
|
|
70
70
|
buildRunInput,
|
|
71
71
|
buildRunPayload,
|
|
72
|
-
buildWorkflowSpecV1,
|
|
73
72
|
buildWorkflowSpecV2,
|
|
73
|
+
buildWorkflowSpecV3,
|
|
74
74
|
canvasNode,
|
|
75
75
|
codeExecutionNode,
|
|
76
76
|
type ConditionCase,
|
|
@@ -129,15 +129,15 @@ export {
|
|
|
129
129
|
cancelWorkflowRun,
|
|
130
130
|
createWorkflowVersion,
|
|
131
131
|
type CreateWorkflowVersionPayload,
|
|
132
|
-
createWorkflowVersionV1,
|
|
133
132
|
createWorkflowVersionV2,
|
|
133
|
+
createWorkflowVersionV3,
|
|
134
134
|
getPromptVersion,
|
|
135
135
|
getWorkflowAttributes,
|
|
136
136
|
type GetWorkflowAttributesOptions,
|
|
137
137
|
getWorkflowRun,
|
|
138
138
|
getWorkflowUrl,
|
|
139
|
-
getWorkflowV1Url,
|
|
140
139
|
getWorkflowV2Url,
|
|
140
|
+
getWorkflowV3Url,
|
|
141
141
|
getWorkflowVariables,
|
|
142
142
|
getWorkflowVariablesByStep,
|
|
143
143
|
getWorkflowVariablesByStepFromVersion,
|
|
@@ -150,13 +150,13 @@ export {
|
|
|
150
150
|
type RunWorkflowPayload,
|
|
151
151
|
updateWorkflowVersion,
|
|
152
152
|
type UpdateWorkflowVersionPayload,
|
|
153
|
-
updateWorkflowVersionV1,
|
|
154
153
|
updateWorkflowVersionV2,
|
|
154
|
+
updateWorkflowVersionV3,
|
|
155
155
|
validateWorkflowGraph,
|
|
156
156
|
waitForWorkflowRun,
|
|
157
157
|
WORKFLOW_ACTION_IDS_SHARED,
|
|
158
|
-
WORKFLOW_ACTION_IDS_V1_UI,
|
|
159
158
|
WORKFLOW_ACTION_IDS_V2_UI,
|
|
159
|
+
WORKFLOW_ACTION_IDS_V3_UI,
|
|
160
160
|
type WorkflowActionId,
|
|
161
161
|
type WorkflowAvailableVariable,
|
|
162
162
|
type WorkflowDefinition,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Workflow Node Builders
|
|
2
2
|
|
|
3
|
-
Typed builder functions for workflow nodes. Each builder encodes the exact contract from `tela-workflow-
|
|
3
|
+
Typed builder functions for workflow nodes. Each builder encodes the exact contract from `tela-workflow-v3` — ports, defaults, and required fields are handled automatically.
|
|
4
4
|
|
|
5
5
|
IDs are generated as `crypto.randomUUID()` matching the Tela frontend. In `buildGraph` connections, reference nodes by variable (the node object). In string references (prompts, conditions, map `over`), use `{{step://${node.id}}}` template literals to interpolate the UUID.
|
|
6
6
|
|
|
@@ -383,7 +383,7 @@ const summarize = tela.canvasNode({
|
|
|
383
383
|
|
|
384
384
|
---
|
|
385
385
|
|
|
386
|
-
### `templateNode` — Execute a Tela template (
|
|
386
|
+
### `templateNode` — Execute a Tela template (v2 only)
|
|
387
387
|
|
|
388
388
|
| Field | Type | Required | Default |
|
|
389
389
|
|---|---|---|---|
|
|
@@ -394,7 +394,7 @@ const summarize = tela.canvasNode({
|
|
|
394
394
|
|
|
395
395
|
**Ports:** `in:default`, `out:default`
|
|
396
396
|
|
|
397
|
-
**
|
|
397
|
+
**v2 only** — not available in the v2 workflow editor (`/workflows/:id`). All other nodes work in both versions.
|
|
398
398
|
|
|
399
399
|
**Reference formats** (`variables.*` fields, max: unlimited) — same as `canvasNode`:
|
|
400
400
|
|
|
@@ -523,12 +523,12 @@ const graph = tela.buildGraph(
|
|
|
523
523
|
|
|
524
524
|
## Workflow Spec Builder
|
|
525
525
|
|
|
526
|
-
**CRITICAL:
|
|
526
|
+
**CRITICAL: v2 and v3 use different spec builders.**
|
|
527
527
|
|
|
528
|
-
- **
|
|
528
|
+
- **v2** (`/prompt/:id/workflow`): The UI reads from `workflowSpec.steps`. Steps **must** be populated with the node definitions — pass the same nodes you gave to `buildGraph`.
|
|
529
529
|
- **v2** (`/workflows/:id`): The graph is the source of truth. Steps can be empty.
|
|
530
530
|
|
|
531
|
-
###
|
|
531
|
+
### v2 — `buildWorkflowSpecV2`
|
|
532
532
|
|
|
533
533
|
Input fields:
|
|
534
534
|
|
|
@@ -544,8 +544,8 @@ Input fields:
|
|
|
544
544
|
const nodes = [extract, transform, summarize]
|
|
545
545
|
const graph = tela.buildGraph(nodes, [[extract, transform], [transform, summarize]])
|
|
546
546
|
|
|
547
|
-
const spec = tela.
|
|
548
|
-
nodes, // REQUIRED for
|
|
547
|
+
const spec = tela.buildWorkflowSpecV2({
|
|
548
|
+
nodes, // REQUIRED for v2 — populates steps from the graph nodes
|
|
549
549
|
graph, // Pass graph so map subgraph relationships are detected automatically
|
|
550
550
|
inputs: [
|
|
551
551
|
{ name: 'document', type: 'file', required: true, description: 'PDF to process', multimodal: false },
|
|
@@ -557,10 +557,10 @@ const spec = tela.buildWorkflowSpecV1({
|
|
|
557
557
|
// → { steps: [{ id, name, actionId, input, stepNumber, parentStepId? }...], inputs: {...}, outputs: {...} }
|
|
558
558
|
```
|
|
559
559
|
|
|
560
|
-
### v2 — `
|
|
560
|
+
### v2 — `buildWorkflowSpecV3`
|
|
561
561
|
|
|
562
562
|
```typescript
|
|
563
|
-
const spec = tela.
|
|
563
|
+
const spec = tela.buildWorkflowSpecV3({
|
|
564
564
|
inputs: [
|
|
565
565
|
{ name: 'document', type: 'file', required: true, multimodal: false },
|
|
566
566
|
],
|
|
@@ -604,7 +604,7 @@ const payload = tela.buildRunPayload({
|
|
|
604
604
|
graph,
|
|
605
605
|
spec,
|
|
606
606
|
inputs,
|
|
607
|
-
version: '
|
|
607
|
+
version: 'v3', // must match the workflow version — defaults to undefined (v2)
|
|
608
608
|
})
|
|
609
609
|
|
|
610
610
|
const run = await tela.runWorkflow(payload)
|
|
@@ -612,9 +612,9 @@ const run = await tela.runWorkflow(payload)
|
|
|
612
612
|
|
|
613
613
|
---
|
|
614
614
|
|
|
615
|
-
## End-to-End Example (
|
|
615
|
+
## End-to-End Example (v2)
|
|
616
616
|
|
|
617
|
-
Complete
|
|
617
|
+
Complete v2 workflow: split a PDF, process each page with LLM, then aggregate results.
|
|
618
618
|
|
|
619
619
|
```typescript
|
|
620
620
|
// 1. Build nodes
|
|
@@ -660,8 +660,8 @@ const graph = tela.buildGraph(nodes, [
|
|
|
660
660
|
[mapPages, aggregate],
|
|
661
661
|
])
|
|
662
662
|
|
|
663
|
-
// 3. Build spec (
|
|
664
|
-
const spec = tela.
|
|
663
|
+
// 3. Build spec (v2 — pass nodes + graph so map subgraphs are detected)
|
|
664
|
+
const spec = tela.buildWorkflowSpecV2({
|
|
665
665
|
nodes,
|
|
666
666
|
graph,
|
|
667
667
|
inputs: [{ name: 'document', type: 'file', required: true }],
|
|
@@ -674,8 +674,8 @@ const inputs = {
|
|
|
674
674
|
}),
|
|
675
675
|
}
|
|
676
676
|
|
|
677
|
-
// 4. Create version (
|
|
678
|
-
const version = await tela.
|
|
677
|
+
// 4. Create version (v2)
|
|
678
|
+
const version = await tela.createWorkflowVersionV2({
|
|
679
679
|
promptId: 'prompt-uuid',
|
|
680
680
|
title: 'PDF Extraction Workflow',
|
|
681
681
|
workflowSpec: spec,
|
|
@@ -709,12 +709,12 @@ const graph = tela.buildGraph(nodes, [
|
|
|
709
709
|
])
|
|
710
710
|
|
|
711
711
|
// v2 spec — no nodes needed
|
|
712
|
-
const spec = tela.
|
|
712
|
+
const spec = tela.buildWorkflowSpecV3({
|
|
713
713
|
inputs: [{ name: 'document', type: 'file', required: true }],
|
|
714
714
|
})
|
|
715
715
|
|
|
716
716
|
// Create version (v2)
|
|
717
|
-
const version = await tela.
|
|
717
|
+
const version = await tela.createWorkflowVersionV3({
|
|
718
718
|
promptId: 'prompt-uuid',
|
|
719
719
|
title: 'PDF Extraction Workflow',
|
|
720
720
|
workflowSpec: spec,
|
|
@@ -740,7 +740,7 @@ const version = await tela.createWorkflowVersionV2({
|
|
|
740
740
|
Always validate before save/run:
|
|
741
741
|
|
|
742
742
|
```typescript
|
|
743
|
-
tela.assertWorkflowGraphValid(graph, { version: '
|
|
743
|
+
tela.assertWorkflowGraphValid(graph, { version: 'v3' })
|
|
744
744
|
```
|
|
745
745
|
|
|
746
746
|
The `buildGraph` function does NOT auto-validate — call validation explicitly so errors surface with clear context.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# Workflow References (
|
|
1
|
+
# Workflow References (v2 vs v3)
|
|
2
2
|
|
|
3
3
|
Reference syntax for accessing step outputs, inputs, and map variables in workflow parameters.
|
|
4
4
|
|
|
5
|
-
## Reference URI Syntax (
|
|
5
|
+
## Reference URI Syntax (v3)
|
|
6
6
|
|
|
7
7
|
```
|
|
8
8
|
{{protocol://id?path=...&format=...}}
|
|
@@ -133,13 +133,13 @@ prompt: "Result: {{step://id}}" → prompt: "Result: {\"the\":\"object\"}"
|
|
|
133
133
|
|
|
134
134
|
## Safe cross-version references
|
|
135
135
|
|
|
136
|
-
These work in both
|
|
136
|
+
These work in both v2 and v3:
|
|
137
137
|
|
|
138
138
|
- `{{varName}}` — input variable
|
|
139
139
|
- `{{step://stepId}}` — entire step output
|
|
140
140
|
- `{{step://stepId?path=field[subfield]}}` — nested value
|
|
141
141
|
|
|
142
|
-
## v2-only references (avoid in
|
|
142
|
+
## v2-only references (avoid in v2 mode)
|
|
143
143
|
|
|
144
144
|
- `{{step://id?format=raw}}` — format override
|
|
145
145
|
- `{{step://id?path=a&path=b}}` — multi-path zipping
|
|
@@ -160,10 +160,10 @@ These work in both v1 and v2:
|
|
|
160
160
|
|
|
161
161
|
## Authoring policy
|
|
162
162
|
|
|
163
|
-
1. If user chose
|
|
163
|
+
1. If user chose v2, block v3-oriented references.
|
|
164
164
|
2. If user chose v2, allow advanced refs only when needed.
|
|
165
165
|
3. If user requests cross-version compatibility, always use safe references.
|
|
166
166
|
|
|
167
167
|
## Helper behavior
|
|
168
168
|
|
|
169
|
-
`validateWorkflowGraph` enforces
|
|
169
|
+
`validateWorkflowGraph` enforces v2 reference safety in strict v3 mode and reports detailed issues.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { RunWorkflowPayload, WorkflowEnvironment, WorkflowGraph, WorkflowVersion } from './workflows.ts'
|
|
2
|
-
import {
|
|
2
|
+
import { buildWorkflowSpecV3 } from './workflow-spec-builders.ts'
|
|
3
3
|
|
|
4
4
|
export function buildRunInput(
|
|
5
5
|
name: string,
|
|
@@ -48,7 +48,7 @@ export function buildRunPayload(params: {
|
|
|
48
48
|
version?: WorkflowVersion
|
|
49
49
|
}): RunWorkflowPayload {
|
|
50
50
|
return {
|
|
51
|
-
definition: (params.spec ??
|
|
51
|
+
definition: (params.spec ?? buildWorkflowSpecV3()) as RunWorkflowPayload['definition'],
|
|
52
52
|
inputs: params.inputs ?? {},
|
|
53
53
|
promptVersionId: params.promptVersionId,
|
|
54
54
|
graph: params.graph,
|
|
@@ -106,12 +106,12 @@ function nodesToSteps(nodes: WorkflowNode[], graph?: WorkflowGraph): Array<Recor
|
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
/**
|
|
109
|
-
* Build workflow spec for
|
|
110
|
-
*
|
|
109
|
+
* Build workflow spec for v2 workflows.
|
|
110
|
+
* v2 requires `steps` populated — the UI reads from steps, not from graph alone.
|
|
111
111
|
* Pass the same nodes and graph you used in buildGraph so subgraph
|
|
112
112
|
* relationships (map sub-steps) are detected automatically.
|
|
113
113
|
*/
|
|
114
|
-
export function
|
|
114
|
+
export function buildWorkflowSpecV2(params: {
|
|
115
115
|
nodes: WorkflowNode[]
|
|
116
116
|
graph?: WorkflowGraph
|
|
117
117
|
inputs?: WorkflowSpecInput[]
|
|
@@ -128,7 +128,7 @@ export function buildWorkflowSpecV1(params: {
|
|
|
128
128
|
* Build workflow spec for v2 workflows.
|
|
129
129
|
* v2 uses graph as source of truth — steps can be empty.
|
|
130
130
|
*/
|
|
131
|
-
export function
|
|
131
|
+
export function buildWorkflowSpecV3(params?: {
|
|
132
132
|
inputs?: WorkflowSpecInput[]
|
|
133
133
|
outputs?: Record<string, WorkflowSpecOutput>
|
|
134
134
|
}): Record<string, unknown> {
|
|
@@ -2,26 +2,23 @@
|
|
|
2
2
|
|
|
3
3
|
## Goal
|
|
4
4
|
|
|
5
|
-
Create or update a workflow
|
|
5
|
+
Create or update a workflow that remains valid for legacy workflow UI (`/prompt/:id/workflow`).
|
|
6
6
|
|
|
7
7
|
## Rules
|
|
8
8
|
|
|
9
|
-
1. Use v2
|
|
10
|
-
-
|
|
11
|
-
-
|
|
9
|
+
1. Use v2-safe references only.
|
|
10
|
+
- Prefer `{{varName}}` for inputs.
|
|
11
|
+
- Use `{{step://stepId}}` or one simple `path=`.
|
|
12
|
+
- Avoid `format=...`, `format[path]=...`, multi-path references, numeric index paths.
|
|
12
13
|
|
|
13
|
-
2.
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
- Avoid advanced refs if the user requested cross-version compatibility.
|
|
14
|
+
2. Validate graph before save.
|
|
15
|
+
- Use `tela.validateWorkflowGraph(graph, { version: 'v2' })`.
|
|
16
|
+
- Fail fast if validation returns errors.
|
|
17
17
|
|
|
18
|
-
3. Persist
|
|
18
|
+
3. Persist workflow via prompt-version.
|
|
19
19
|
- Create: `tela.createWorkflowVersionV2(...)`
|
|
20
20
|
- Update: `tela.updateWorkflowVersionV2(...)`
|
|
21
21
|
|
|
22
|
-
4. Use compatibility endpoint when selecting references for a specific node.
|
|
23
|
-
- `tela.getWorkflowVariablesByStep(...)`
|
|
24
|
-
|
|
25
22
|
## Create example
|
|
26
23
|
|
|
27
24
|
```bash
|
|
@@ -51,15 +48,7 @@ console.log(updated.id)
|
|
|
51
48
|
"
|
|
52
49
|
```
|
|
53
50
|
|
|
54
|
-
##
|
|
51
|
+
## Notes
|
|
55
52
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const result = await tela.getWorkflowVariablesByStep('PROMPT_ID', 'NODE_ID', {
|
|
59
|
-
graph: GRAPH_OBJECT,
|
|
60
|
-
input: INPUT_VARIABLE_DEFS,
|
|
61
|
-
version: 'v2'
|
|
62
|
-
})
|
|
63
|
-
console.log(JSON.stringify(result, null, 2))
|
|
64
|
-
"
|
|
65
|
-
```
|
|
53
|
+
- Backend persistence is still prompt-version based.
|
|
54
|
+
- v2 compatibility mode intentionally blocks v3-oriented references.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Workflow Create/Update (v3)
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Create or update a workflow intended for DAG workflow page (`/workflows/:id`).
|
|
6
|
+
|
|
7
|
+
## Rules
|
|
8
|
+
|
|
9
|
+
1. Use v3 graph constraints.
|
|
10
|
+
- Validate with `tela.validateWorkflowGraph(graph, { version: 'v3' })`.
|
|
11
|
+
- Respect node port requirements (especially `condition`, `map`, `stop`).
|
|
12
|
+
|
|
13
|
+
2. You may use v3 reference features when required.
|
|
14
|
+
- URI style refs (`{{input://...}}`, `{{step://...}}`).
|
|
15
|
+
- format modifiers (`?format=...`) only when needed.
|
|
16
|
+
- Avoid advanced refs if the user requested cross-version compatibility.
|
|
17
|
+
|
|
18
|
+
3. Persist through prompt-version endpoints.
|
|
19
|
+
- Create: `tela.createWorkflowVersionV3(...)`
|
|
20
|
+
- Update: `tela.updateWorkflowVersionV3(...)`
|
|
21
|
+
|
|
22
|
+
4. Use compatibility endpoint when selecting references for a specific node.
|
|
23
|
+
- `tela.getWorkflowVariablesByStep(...)`
|
|
24
|
+
|
|
25
|
+
## Create example
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
bun --preload ~/.claude/skills/tela/preload.ts -e "
|
|
29
|
+
const version = await tela.createWorkflowVersionV3({
|
|
30
|
+
promptId: 'PROMPT_ID',
|
|
31
|
+
title: 'Workflow v3 draft',
|
|
32
|
+
workflowSpec: WORKFLOW_SPEC_OBJECT,
|
|
33
|
+
graph: GRAPH_OBJECT,
|
|
34
|
+
variables: VARIABLES,
|
|
35
|
+
draft: true
|
|
36
|
+
})
|
|
37
|
+
console.log(version.id)
|
|
38
|
+
"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Update example
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
bun --preload ~/.claude/skills/tela/preload.ts -e "
|
|
45
|
+
const updated = await tela.updateWorkflowVersionV3('PROMPT_VERSION_ID', {
|
|
46
|
+
workflowSpec: WORKFLOW_SPEC_OBJECT,
|
|
47
|
+
graph: GRAPH_OBJECT,
|
|
48
|
+
variables: VARIABLES
|
|
49
|
+
})
|
|
50
|
+
console.log(updated.id)
|
|
51
|
+
"
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Node-scoped variable compatibility example
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
bun --preload ~/.claude/skills/tela/preload.ts -e "
|
|
58
|
+
const result = await tela.getWorkflowVariablesByStep('PROMPT_ID', 'NODE_ID', {
|
|
59
|
+
graph: GRAPH_OBJECT,
|
|
60
|
+
input: INPUT_VARIABLE_DEFS,
|
|
61
|
+
version: 'v3'
|
|
62
|
+
})
|
|
63
|
+
console.log(JSON.stringify(result, null, 2))
|
|
64
|
+
"
|
|
65
|
+
```
|
package/skill/workflow.md
CHANGED
|
@@ -9,9 +9,9 @@ description: Use when the user wants to create, update, validate, run, inspect,
|
|
|
9
9
|
|
|
10
10
|
Facade skill for end-to-end Tela workflow authoring and execution.
|
|
11
11
|
|
|
12
|
-
Version choice is mandatory before authoring because
|
|
12
|
+
Version choice is mandatory before authoring because v2 and v3 differ in node support, graph ports/edges, and reference compatibility.
|
|
13
13
|
|
|
14
|
-
For node builder details, examples, and edge cases, read `workflow-nodes-
|
|
14
|
+
For node builder details, examples, and edge cases, read `workflow-nodes-v2-v3.md`. For reference syntax compatibility, read `workflow-references-v2-v3.md`. The legacy files `workflow-v2-create-update.md` and `workflow-v3-create-update.md` are superseded by this file and should not be read.
|
|
15
15
|
|
|
16
16
|
## When to Use
|
|
17
17
|
|
|
@@ -27,11 +27,11 @@ For node builder details, examples, and edge cases, read `workflow-nodes-v1-v2.m
|
|
|
27
27
|
|
|
28
28
|
## Steps
|
|
29
29
|
|
|
30
|
-
**Step 1: Resolve workflow version (`
|
|
31
|
-
[WHY:
|
|
30
|
+
**Step 1: Resolve workflow version (`v2` or `v3`)**
|
|
31
|
+
[WHY: v3-style refs can break in v2 UI, so version-first avoids invalid graphs.]
|
|
32
32
|
|
|
33
33
|
If version is not explicit, ask exactly:
|
|
34
|
-
- `Do you want workflow
|
|
34
|
+
- `Do you want workflow v2 (/prompt/:id/workflow) or v3 (/workflows/:id)?`
|
|
35
35
|
|
|
36
36
|
Do not create/update graph or references until the version is confirmed.
|
|
37
37
|
|
|
@@ -112,17 +112,17 @@ prompt: `Summarize this: {{step://${splitter.id}?format=raw}}`
|
|
|
112
112
|
This only applies to file values flowing into LLM/agent nodes. All other action×type combinations have a single format — no choice needed.
|
|
113
113
|
|
|
114
114
|
**Step 3: Build and validate by version**
|
|
115
|
-
[WHY: `templateNode` is
|
|
115
|
+
[WHY: `templateNode` is v2-only, and v3-oriented references (`?format=`, multi-path, `input://`) break in v2.]
|
|
116
116
|
|
|
117
117
|
- Validate first: `tela.assertWorkflowGraphValid(graph, { version })`
|
|
118
|
-
- If
|
|
119
|
-
- If
|
|
118
|
+
- If v3: do not use `templateNode` (use `canvasNode` instead).
|
|
119
|
+
- If v2: enforce v2-safe references only (no `?format=`, no multi-path, no `input://`).
|
|
120
120
|
|
|
121
121
|
**Step 4: Persist workflow definition**
|
|
122
122
|
[WHY: create/update flows should map to explicit version-aware APIs.]
|
|
123
123
|
|
|
124
|
-
- Create: `tela.
|
|
125
|
-
- Update: `tela.
|
|
124
|
+
- Create: `tela.createWorkflowVersionV2(...)` or `tela.createWorkflowVersionV3(...)`
|
|
125
|
+
- Update: `tela.updateWorkflowVersionV2(...)` or `tela.updateWorkflowVersionV3(...)`
|
|
126
126
|
|
|
127
127
|
**Step 5: Run and lifecycle operations**
|
|
128
128
|
[WHY: run/wait/cancel behavior is shared after definition is valid.]
|
|
@@ -158,7 +158,7 @@ Use references in string parameters (LLM prompts, map `over`) to access workflow
|
|
|
158
158
|
{{variableName}}
|
|
159
159
|
```
|
|
160
160
|
|
|
161
|
-
**Format control** (
|
|
161
|
+
**Format control** (v3 only) — override how a referenced value is transformed before injection. Each action only supports specific formats per reference type (see `workflow-references-v2-v3.md` for the full matrix):
|
|
162
162
|
```typescript
|
|
163
163
|
`{{step://${myNode.id}?format=raw}}` // preserve original type (override ai-xml default in LLM/agent)
|
|
164
164
|
`{{step://${myNode.id}?format=ai-xml}}` // semantic XML for LLM consumption (default for objects in LLM/agent)
|
|
@@ -205,8 +205,8 @@ conditionNode({
|
|
|
205
205
|
|
|
206
206
|
- Ask version first if missing.
|
|
207
207
|
- Validate graph before persisting.
|
|
208
|
-
- v1 URL: `tela.getWorkflowV1Url(promptId)`
|
|
209
208
|
- v2 URL: `tela.getWorkflowV2Url(promptId)`
|
|
209
|
+
- v3 URL: `tela.getWorkflowV3Url(promptId)`
|
|
210
210
|
- Variables compatibility:
|
|
211
211
|
- `tela.getWorkflowVariables(promptId, payload?)`
|
|
212
212
|
- `tela.getWorkflowVariablesByStep(promptId, stepId, payload?)`
|
|
@@ -214,18 +214,18 @@ conditionNode({
|
|
|
214
214
|
## Examples
|
|
215
215
|
|
|
216
216
|
<good-example>
|
|
217
|
-
User asks to create a workflow without specifying version. Ask for
|
|
217
|
+
User asks to create a workflow without specifying version. Ask for v2/v3 first, gather inputs (including multimodal for file inputs), build nodes and graph with builders, validate, and persist.
|
|
218
218
|
</good-example>
|
|
219
219
|
|
|
220
220
|
<bad-example>
|
|
221
221
|
User has not chosen a version, but the graph is authored with `{{step://stepId?format=raw}}`.
|
|
222
|
-
**Why bad:** `format=raw` is
|
|
222
|
+
**Why bad:** `format=raw` is v3-oriented and may not be valid/usable in v2 workflow UI.
|
|
223
223
|
</bad-example>
|
|
224
224
|
|
|
225
225
|
## Common Mistakes
|
|
226
226
|
|
|
227
227
|
- **Not asking about multimodal for file inputs.** This is mandatory — never assume. Multimodal (model reads file) vs parsed (Tela extracts text) produce completely different results.
|
|
228
|
-
- **Reading legacy workflow doc files.** Do not load `workflow-
|
|
228
|
+
- **Reading legacy workflow doc files.** Do not load `workflow-v2-create-update.md` or `workflow-v3-create-update.md` — they are superseded. Use `workflow-nodes-v2-v3.md` and `workflow-references-v2-v3.md` for reference.
|
|
229
229
|
- **Passing full JSON Schema to `llmNode` schema.** Pass properties only (e.g. `{ field: { type: 'string' } }`). The runtime wraps it into `{ type: 'object', properties: ... }` automatically. The builder will reject full JSON Schema objects.
|
|
230
230
|
- **Missing `function execute(input)` in `codeExecutionNode`.** The runtime requires this exact function declaration. CommonJS exports and top-level code don't work. The builder validates this.
|
|
231
231
|
- **Using 0-based indexes in `documentCropperNode`.** Indexes are 1-based. The builder rejects index 0.
|
|
@@ -238,5 +238,5 @@ User has not chosen a version, but the graph is authored with `{{step://stepId?f
|
|
|
238
238
|
- **Wrapping step/input references in code blocks.** Never wrap `{{step://...}}` or `{{input://...}}` references in triple backticks. Use them inline: `{{step://uuid}}`, not `` ```\n{{step://uuid}}\n``` ``. Code fences break reference resolution at runtime.
|
|
239
239
|
- **Using `stopNode` as a workflow terminator.** Workflows end naturally when a node has no outgoing edges. `stopNode` is only for `conditionNode` branches (typically the default branch) where you need to explicitly halt that path. Do NOT append `stopNode` after every workflow — a single `llmNode` with no connections runs and completes on its own.
|
|
240
240
|
- Skipping version confirmation and mixing incompatible refs.
|
|
241
|
-
- Assuming node ports and edge constraints are identical in
|
|
241
|
+
- Assuming node ports and edge constraints are identical in v2 and v3.
|
|
242
242
|
- Saving a graph before running version-specific validation.
|
package/skill/workflows.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { apiRequest, getAppBaseUrl } from './common.ts'
|
|
2
2
|
import type { Variable } from './canvas.ts'
|
|
3
3
|
|
|
4
|
-
export type WorkflowVersion = '
|
|
4
|
+
export type WorkflowVersion = 'v2' | 'v3'
|
|
5
5
|
|
|
6
6
|
export type WorkflowActionId
|
|
7
7
|
= | 'agent'
|
|
@@ -31,12 +31,12 @@ export const WORKFLOW_ACTION_IDS_SHARED: WorkflowActionId[] = [
|
|
|
31
31
|
/**
|
|
32
32
|
* Legacy workflow UI (/prompt/:id/workflow) generally supports the shared set.
|
|
33
33
|
*/
|
|
34
|
-
export const
|
|
34
|
+
export const WORKFLOW_ACTION_IDS_V2_UI: WorkflowActionId[] = [...WORKFLOW_ACTION_IDS_SHARED]
|
|
35
35
|
|
|
36
36
|
/**
|
|
37
37
|
* DAG workflow page (/workflows/:id) currently uses a stricter module set.
|
|
38
38
|
*/
|
|
39
|
-
export const
|
|
39
|
+
export const WORKFLOW_ACTION_IDS_V3_UI: WorkflowActionId[] = [
|
|
40
40
|
'agent',
|
|
41
41
|
'canvas',
|
|
42
42
|
'code-execution',
|
|
@@ -102,7 +102,7 @@ export interface ValidateWorkflowGraphOptions {
|
|
|
102
102
|
*/
|
|
103
103
|
strictUiCompatibility?: boolean
|
|
104
104
|
/**
|
|
105
|
-
* When true, disallow
|
|
105
|
+
* When true, disallow v3-oriented reference features in v2 graphs.
|
|
106
106
|
*/
|
|
107
107
|
strictReferenceCompatibility?: boolean
|
|
108
108
|
}
|
|
@@ -278,15 +278,15 @@ const DEFAULT_TERMINAL_STATUSES: WorkflowRunStatus[] = ['completed', 'failed', '
|
|
|
278
278
|
const CONTROL_FLOW_ACTIONS = new Set(['condition', 'map', 'stop'])
|
|
279
279
|
|
|
280
280
|
function normalizeVersion(version?: WorkflowVersion): WorkflowVersion {
|
|
281
|
-
return version ?? '
|
|
281
|
+
return version ?? 'v2'
|
|
282
282
|
}
|
|
283
283
|
|
|
284
284
|
function getAllowedActions(version: WorkflowVersion, strictUiCompatibility: boolean): Set<string> {
|
|
285
285
|
if (!strictUiCompatibility)
|
|
286
286
|
return new Set(WORKFLOW_ACTION_IDS_SHARED)
|
|
287
|
-
return version === '
|
|
288
|
-
? new Set(
|
|
289
|
-
: new Set(
|
|
287
|
+
return version === 'v3'
|
|
288
|
+
? new Set(WORKFLOW_ACTION_IDS_V3_UI)
|
|
289
|
+
: new Set(WORKFLOW_ACTION_IDS_V2_UI)
|
|
290
290
|
}
|
|
291
291
|
|
|
292
292
|
function parseGraphInput(graph: WorkflowGraph | string): WorkflowGraph {
|
|
@@ -545,18 +545,18 @@ export function validateWorkflowGraph(
|
|
|
545
545
|
})
|
|
546
546
|
}
|
|
547
547
|
|
|
548
|
-
if (version === '
|
|
548
|
+
if (version === 'v3' && node.input && typeof node.input === 'object' && 'steps' in node.input) {
|
|
549
549
|
warnings.push({
|
|
550
550
|
code: 'map_steps_v2_warning',
|
|
551
|
-
message: `Map node '${node.id}' contains input.steps, which is
|
|
551
|
+
message: `Map node '${node.id}' contains input.steps, which is v2-oriented and typically ignored in v3 graph-driven execution.`,
|
|
552
552
|
nodeId: node.id,
|
|
553
553
|
})
|
|
554
554
|
}
|
|
555
555
|
|
|
556
|
-
if (version === '
|
|
556
|
+
if (version === 'v2' && (!node.input || typeof node.input !== 'object' || !Array.isArray((node.input).steps))) {
|
|
557
557
|
warnings.push({
|
|
558
|
-
code: '
|
|
559
|
-
message: `Map node '${node.id}' has no input.steps array. Legacy
|
|
558
|
+
code: 'map_steps_v2_warning',
|
|
559
|
+
message: `Map node '${node.id}' has no input.steps array. Legacy v2 spec builders usually include it.`,
|
|
560
560
|
nodeId: node.id,
|
|
561
561
|
})
|
|
562
562
|
}
|
|
@@ -572,14 +572,14 @@ export function validateWorkflowGraph(
|
|
|
572
572
|
}
|
|
573
573
|
}
|
|
574
574
|
|
|
575
|
-
if (version === '
|
|
575
|
+
if (version === 'v2' && strictReferenceCompatibility) {
|
|
576
576
|
const stringValues = collectStringValues(node.input)
|
|
577
577
|
for (const entry of stringValues) {
|
|
578
578
|
const pathParamCount = [...entry.value.matchAll(/(?:\?|&)path=/g)].length
|
|
579
579
|
if (pathParamCount > 1) {
|
|
580
580
|
errors.push({
|
|
581
|
-
code: '
|
|
582
|
-
message: `Node '${node.id}' uses multi-path reference in ${entry.path}, which is
|
|
581
|
+
code: 'v2_ref_multi_path_not_supported',
|
|
582
|
+
message: `Node '${node.id}' uses multi-path reference in ${entry.path}, which is v3-oriented and unsafe for v2 UI/runtime compatibility.`,
|
|
583
583
|
nodeId: node.id,
|
|
584
584
|
path: entry.path,
|
|
585
585
|
})
|
|
@@ -587,8 +587,8 @@ export function validateWorkflowGraph(
|
|
|
587
587
|
|
|
588
588
|
if (/(?:\?|&)format(?:=|%5B)/i.test(entry.value) || entry.value.includes('format[')) {
|
|
589
589
|
errors.push({
|
|
590
|
-
code: '
|
|
591
|
-
message: `Node '${node.id}' uses format modifiers in ${entry.path}, which are not reliably supported in
|
|
590
|
+
code: 'v2_ref_format_not_supported',
|
|
591
|
+
message: `Node '${node.id}' uses format modifiers in ${entry.path}, which are not reliably supported in v2 compatibility mode.`,
|
|
592
592
|
nodeId: node.id,
|
|
593
593
|
path: entry.path,
|
|
594
594
|
})
|
|
@@ -596,8 +596,8 @@ export function validateWorkflowGraph(
|
|
|
596
596
|
|
|
597
597
|
if (/input:\/\/workflow-input-/i.test(entry.value)) {
|
|
598
598
|
errors.push({
|
|
599
|
-
code: '
|
|
600
|
-
message: `Node '${node.id}' uses input://workflow-input-* alias in ${entry.path}, which is
|
|
599
|
+
code: 'v2_ref_workflow_input_alias_not_supported',
|
|
600
|
+
message: `Node '${node.id}' uses input://workflow-input-* alias in ${entry.path}, which is v3 state-index behavior.`,
|
|
601
601
|
nodeId: node.id,
|
|
602
602
|
path: entry.path,
|
|
603
603
|
})
|
|
@@ -605,8 +605,8 @@ export function validateWorkflowGraph(
|
|
|
605
605
|
|
|
606
606
|
if (/\{\{input:\/\/[^?}]*\?[^}]*path=/i.test(entry.value)) {
|
|
607
607
|
errors.push({
|
|
608
|
-
code: '
|
|
609
|
-
message: `Node '${node.id}' uses input:// with path in ${entry.path}, which is
|
|
608
|
+
code: 'v2_ref_input_uri_path_not_supported',
|
|
609
|
+
message: `Node '${node.id}' uses input:// with path in ${entry.path}, which is v3-oriented and unsafe for v2 mode.`,
|
|
610
610
|
nodeId: node.id,
|
|
611
611
|
path: entry.path,
|
|
612
612
|
})
|
|
@@ -614,8 +614,8 @@ export function validateWorkflowGraph(
|
|
|
614
614
|
|
|
615
615
|
if (/path=[^}\s]*\[\d+\]/i.test(entry.value)) {
|
|
616
616
|
errors.push({
|
|
617
|
-
code: '
|
|
618
|
-
message: `Node '${node.id}' uses numeric index path in ${entry.path}, which is not safely compatible with
|
|
617
|
+
code: 'v2_ref_numeric_index_path_not_supported',
|
|
618
|
+
message: `Node '${node.id}' uses numeric index path in ${entry.path}, which is not safely compatible with v2 resolution semantics.`,
|
|
619
619
|
nodeId: node.id,
|
|
620
620
|
path: entry.path,
|
|
621
621
|
})
|
|
@@ -797,16 +797,16 @@ export async function createWorkflowVersion(payload: CreateWorkflowVersionPayloa
|
|
|
797
797
|
})
|
|
798
798
|
}
|
|
799
799
|
|
|
800
|
-
export async function
|
|
800
|
+
export async function createWorkflowVersionV2(
|
|
801
801
|
payload: Omit<CreateWorkflowVersionPayload, 'version'>,
|
|
802
802
|
): Promise<WorkflowPromptVersion> {
|
|
803
|
-
return await createWorkflowVersion({ ...payload, version: '
|
|
803
|
+
return await createWorkflowVersion({ ...payload, version: 'v2' })
|
|
804
804
|
}
|
|
805
805
|
|
|
806
|
-
export async function
|
|
806
|
+
export async function createWorkflowVersionV3(
|
|
807
807
|
payload: Omit<CreateWorkflowVersionPayload, 'version'>,
|
|
808
808
|
): Promise<WorkflowPromptVersion> {
|
|
809
|
-
return await createWorkflowVersion({ ...payload, version: '
|
|
809
|
+
return await createWorkflowVersion({ ...payload, version: 'v3' })
|
|
810
810
|
}
|
|
811
811
|
|
|
812
812
|
export async function updateWorkflowVersion(
|
|
@@ -837,18 +837,18 @@ export async function updateWorkflowVersion(
|
|
|
837
837
|
})
|
|
838
838
|
}
|
|
839
839
|
|
|
840
|
-
export async function
|
|
840
|
+
export async function updateWorkflowVersionV2(
|
|
841
841
|
versionId: string,
|
|
842
842
|
payload: Omit<UpdateWorkflowVersionPayload, 'version'>,
|
|
843
843
|
): Promise<WorkflowPromptVersion> {
|
|
844
|
-
return await updateWorkflowVersion(versionId, { ...payload, version: '
|
|
844
|
+
return await updateWorkflowVersion(versionId, { ...payload, version: 'v2' })
|
|
845
845
|
}
|
|
846
846
|
|
|
847
|
-
export async function
|
|
847
|
+
export async function updateWorkflowVersionV3(
|
|
848
848
|
versionId: string,
|
|
849
849
|
payload: Omit<UpdateWorkflowVersionPayload, 'version'>,
|
|
850
850
|
): Promise<WorkflowPromptVersion> {
|
|
851
|
-
return await updateWorkflowVersion(versionId, { ...payload, version: '
|
|
851
|
+
return await updateWorkflowVersion(versionId, { ...payload, version: 'v3' })
|
|
852
852
|
}
|
|
853
853
|
|
|
854
854
|
export async function runWorkflow(payload: RunWorkflowPayload): Promise<WorkflowRun> {
|
|
@@ -992,16 +992,16 @@ export async function getWorkflowAttributes(
|
|
|
992
992
|
return await apiRequest<Record<string, unknown>>(`/workflow/${promptId}/attributes?${params.toString()}`)
|
|
993
993
|
}
|
|
994
994
|
|
|
995
|
-
export function
|
|
995
|
+
export function getWorkflowV2Url(promptId: string): string {
|
|
996
996
|
return `${getAppBaseUrl()}/prompt/${promptId}/workflow`
|
|
997
997
|
}
|
|
998
998
|
|
|
999
|
-
export function
|
|
999
|
+
export function getWorkflowV3Url(promptId: string): string {
|
|
1000
1000
|
return `${getAppBaseUrl()}/workflows/${promptId}`
|
|
1001
1001
|
}
|
|
1002
1002
|
|
|
1003
1003
|
export function getWorkflowUrl(promptId: string, version: WorkflowVersion): string {
|
|
1004
|
-
return version === '
|
|
1005
|
-
?
|
|
1006
|
-
:
|
|
1004
|
+
return version === 'v3'
|
|
1005
|
+
? getWorkflowV3Url(promptId)
|
|
1006
|
+
: getWorkflowV2Url(promptId)
|
|
1007
1007
|
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
# Workflow Create/Update (v1)
|
|
2
|
-
|
|
3
|
-
## Goal
|
|
4
|
-
|
|
5
|
-
Create or update a workflow that remains valid for legacy workflow UI (`/prompt/:id/workflow`).
|
|
6
|
-
|
|
7
|
-
## Rules
|
|
8
|
-
|
|
9
|
-
1. Use v1-safe references only.
|
|
10
|
-
- Prefer `{{varName}}` for inputs.
|
|
11
|
-
- Use `{{step://stepId}}` or one simple `path=`.
|
|
12
|
-
- Avoid `format=...`, `format[path]=...`, multi-path references, numeric index paths.
|
|
13
|
-
|
|
14
|
-
2. Validate graph before save.
|
|
15
|
-
- Use `tela.validateWorkflowGraph(graph, { version: 'v1' })`.
|
|
16
|
-
- Fail fast if validation returns errors.
|
|
17
|
-
|
|
18
|
-
3. Persist workflow via prompt-version.
|
|
19
|
-
- Create: `tela.createWorkflowVersionV1(...)`
|
|
20
|
-
- Update: `tela.updateWorkflowVersionV1(...)`
|
|
21
|
-
|
|
22
|
-
## Create example
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
bun --preload ~/.claude/skills/tela/preload.ts -e "
|
|
26
|
-
const version = await tela.createWorkflowVersionV1({
|
|
27
|
-
promptId: 'PROMPT_ID',
|
|
28
|
-
title: 'Workflow v1 draft',
|
|
29
|
-
workflowSpec: WORKFLOW_SPEC_OBJECT,
|
|
30
|
-
graph: GRAPH_OBJECT,
|
|
31
|
-
variables: VARIABLES,
|
|
32
|
-
draft: true
|
|
33
|
-
})
|
|
34
|
-
console.log(version.id)
|
|
35
|
-
"
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## Update example
|
|
39
|
-
|
|
40
|
-
```bash
|
|
41
|
-
bun --preload ~/.claude/skills/tela/preload.ts -e "
|
|
42
|
-
const updated = await tela.updateWorkflowVersionV1('PROMPT_VERSION_ID', {
|
|
43
|
-
workflowSpec: WORKFLOW_SPEC_OBJECT,
|
|
44
|
-
graph: GRAPH_OBJECT,
|
|
45
|
-
variables: VARIABLES
|
|
46
|
-
})
|
|
47
|
-
console.log(updated.id)
|
|
48
|
-
"
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## Notes
|
|
52
|
-
|
|
53
|
-
- Backend persistence is still prompt-version based.
|
|
54
|
-
- v1 compatibility mode intentionally blocks v2-oriented references.
|