@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meistrari/tela-skills",
3
- "version": "1.3.4",
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.3",
32
+ "@meistrari/mise-en-place": "^2.10.6",
33
33
  "bun-types": "^1.3.4"
34
34
  }
35
35
  }
@@ -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 (v1/v2), graph validation, and bundled reference docs.
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.updateWorkflowVersionV1(versionId, payload)` - Update workflow prompt-version in v1 compatibility mode
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.getWorkflowV1Url(promptId)` - Get legacy UI URL (`/prompt/:id/workflow`)
67
- - `tela.getWorkflowV2Url(promptId)` - Get DAG UI URL (`/workflows/:id`)
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,
@@ -28,6 +28,6 @@ export {
28
28
  } from './workflow-run-builders.ts'
29
29
 
30
30
  export {
31
- buildWorkflowSpecV1,
32
31
  buildWorkflowSpecV2,
32
+ buildWorkflowSpecV3,
33
33
  } from './workflow-spec-builders.ts'
@@ -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-v2` — ports, defaults, and required fields are handled automatically.
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 (v1 only)
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
- **v1 only** — not available in the v2 workflow editor (`/workflows/:id`). All other nodes work in both versions.
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: v1 and v2 use different spec builders.**
526
+ **CRITICAL: v2 and v3 use different spec builders.**
527
527
 
528
- - **v1** (`/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`.
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
- ### v1 — `buildWorkflowSpecV1`
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.buildWorkflowSpecV1({
548
- nodes, // REQUIRED for v1 — populates steps from the graph nodes
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 — `buildWorkflowSpecV2`
560
+ ### v2 — `buildWorkflowSpecV3`
561
561
 
562
562
  ```typescript
563
- const spec = tela.buildWorkflowSpecV2({
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: 'v2', // must match the workflow version — defaults to undefined (v1)
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 (v1)
615
+ ## End-to-End Example (v2)
616
616
 
617
- Complete v1 workflow: split a PDF, process each page with LLM, then aggregate results.
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 (v1 — pass nodes + graph so map subgraphs are detected)
664
- const spec = tela.buildWorkflowSpecV1({
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 (v1)
678
- const version = await tela.createWorkflowVersionV1({
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.buildWorkflowSpecV2({
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.createWorkflowVersionV2({
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: 'v2' })
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 (v1 vs v2)
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 (v2)
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 v1 and v2:
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 v1 mode)
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 v1, block v2-oriented references.
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 v1 reference safety in strict v1 mode and reports detailed issues.
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 { buildWorkflowSpecV2 } from './workflow-spec-builders.ts'
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 ?? buildWorkflowSpecV2()) as RunWorkflowPayload['definition'],
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 v1 workflows.
110
- * v1 requires `steps` populated — the UI reads from steps, not from graph alone.
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 buildWorkflowSpecV1(params: {
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 buildWorkflowSpecV2(params?: {
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 intended for DAG workflow page (`/workflows/:id`).
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 graph constraints.
10
- - Validate with `tela.validateWorkflowGraph(graph, { version: 'v2' })`.
11
- - Respect node port requirements (especially `condition`, `map`, `stop`).
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. You may use v2 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.
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 through prompt-version endpoints.
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
- ## Node-scoped variable compatibility example
51
+ ## Notes
55
52
 
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: '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 v1 and v2 differ in node support, graph ports/edges, and reference compatibility.
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-v1-v2.md`. For reference syntax compatibility, read `workflow-references-v1-v2.md`. The legacy files `workflow-v1-create-update.md` and `workflow-v2-create-update.md` are superseded by this file and should not be read.
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 (`v1` or `v2`)**
31
- [WHY: v2-style refs can break in v1 UI, so version-first avoids invalid graphs.]
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 v1 (/prompt/:id/workflow) or v2 (/workflows/:id)?`
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 v1-only, and v2-oriented references (`?format=`, multi-path, `input://`) break in v1.]
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 v2: do not use `templateNode` (use `canvasNode` instead).
119
- - If v1: enforce v1-safe references only (no `?format=`, no multi-path, no `input://`).
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.createWorkflowVersionV1(...)` or `tela.createWorkflowVersionV2(...)`
125
- - Update: `tela.updateWorkflowVersionV1(...)` or `tela.updateWorkflowVersionV2(...)`
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** (v2 only) — override how a referenced value is transformed before injection. Each action only supports specific formats per reference type (see `workflow-references-v1-v2.md` for the full matrix):
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 v1/v2 first, gather inputs (including multimodal for file inputs), build nodes and graph with builders, validate, and persist.
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 v2-oriented and may not be valid/usable in v1 workflow UI.
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-v1-create-update.md` or `workflow-v2-create-update.md` — they are superseded. Use `workflow-nodes-v1-v2.md` and `workflow-references-v1-v2.md` for reference.
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 v1 and v2.
241
+ - Assuming node ports and edge constraints are identical in v2 and v3.
242
242
  - Saving a graph before running version-specific validation.
@@ -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 = 'v1' | 'v2'
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 WORKFLOW_ACTION_IDS_V1_UI: WorkflowActionId[] = [...WORKFLOW_ACTION_IDS_SHARED]
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 WORKFLOW_ACTION_IDS_V2_UI: WorkflowActionId[] = [
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 v2-oriented reference features in v1 graphs.
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 ?? 'v1'
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 === 'v2'
288
- ? new Set(WORKFLOW_ACTION_IDS_V2_UI)
289
- : new Set(WORKFLOW_ACTION_IDS_V1_UI)
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 === 'v2' && node.input && typeof node.input === 'object' && 'steps' in node.input) {
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 v1-oriented and typically ignored in v2 graph-driven execution.`,
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 === 'v1' && (!node.input || typeof node.input !== 'object' || !Array.isArray((node.input).steps))) {
556
+ if (version === 'v2' && (!node.input || typeof node.input !== 'object' || !Array.isArray((node.input).steps))) {
557
557
  warnings.push({
558
- code: 'map_steps_v1_warning',
559
- message: `Map node '${node.id}' has no input.steps array. Legacy v1 spec builders usually include it.`,
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 === 'v1' && strictReferenceCompatibility) {
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: 'v1_ref_multi_path_not_supported',
582
- message: `Node '${node.id}' uses multi-path reference in ${entry.path}, which is v2-oriented and unsafe for v1 UI/runtime compatibility.`,
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: 'v1_ref_format_not_supported',
591
- message: `Node '${node.id}' uses format modifiers in ${entry.path}, which are not reliably supported in v1 compatibility mode.`,
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: 'v1_ref_workflow_input_alias_not_supported',
600
- message: `Node '${node.id}' uses input://workflow-input-* alias in ${entry.path}, which is v2 state-index behavior.`,
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: 'v1_ref_input_uri_path_not_supported',
609
- message: `Node '${node.id}' uses input:// with path in ${entry.path}, which is v2-oriented and unsafe for v1 mode.`,
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: 'v1_ref_numeric_index_path_not_supported',
618
- message: `Node '${node.id}' uses numeric index path in ${entry.path}, which is not safely compatible with v1 resolution semantics.`,
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 createWorkflowVersionV1(
800
+ export async function createWorkflowVersionV2(
801
801
  payload: Omit<CreateWorkflowVersionPayload, 'version'>,
802
802
  ): Promise<WorkflowPromptVersion> {
803
- return await createWorkflowVersion({ ...payload, version: 'v1' })
803
+ return await createWorkflowVersion({ ...payload, version: 'v2' })
804
804
  }
805
805
 
806
- export async function createWorkflowVersionV2(
806
+ export async function createWorkflowVersionV3(
807
807
  payload: Omit<CreateWorkflowVersionPayload, 'version'>,
808
808
  ): Promise<WorkflowPromptVersion> {
809
- return await createWorkflowVersion({ ...payload, version: 'v2' })
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 updateWorkflowVersionV1(
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: 'v1' })
844
+ return await updateWorkflowVersion(versionId, { ...payload, version: 'v2' })
845
845
  }
846
846
 
847
- export async function updateWorkflowVersionV2(
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: 'v2' })
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 getWorkflowV1Url(promptId: string): string {
995
+ export function getWorkflowV2Url(promptId: string): string {
996
996
  return `${getAppBaseUrl()}/prompt/${promptId}/workflow`
997
997
  }
998
998
 
999
- export function getWorkflowV2Url(promptId: string): string {
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 === 'v2'
1005
- ? getWorkflowV2Url(promptId)
1006
- : getWorkflowV1Url(promptId)
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.