windmill-labs/windmill · error

No pipeline editor is open. Pipeline tools only work on a /p

Error message

No pipeline editor is open. Pipeline tools only work on a /pipeline/<folder> page in edit mode.

What it means

The Windmill AI chat pipeline tools operate on a live pipeline editor instance. The manager injects that instance into the tool helpers only when a /pipeline/<folder> page is open in edit mode; when it is absent, requirePipeline throws this error instead of letting the tool run against nothing.

Source

Thrown at frontend/src/lib/components/copilot/chat/pipeline/core.ts:82

	}) => Promise<{ path: string; detectedReads: string[]; detectedWrites: string[] }>
	/** Replace an existing node's body, applied as an unsaved draft. Returns the
	 * re-inferred asset lineage (URIs) so the caller sees the effect of the edit. */
	editNode: (
		path: string,
		content: string
	) => Promise<{ detectedReads: string[]; detectedWrites: string[] }>
	/** Discard the unsaved draft at a path (undo a build_pipeline_node). */
	removeProposedNode: (path: string) => Promise<void>
	/** Preview-run a node (draft body preferred). Returns the started job id. */
	testNode: (path: string, args?: Record<string, any>) => Promise<string | undefined>
}

/** Helper bag the pipeline tools receive from the manager in global mode. */
export type PipelineToolHelpers = { pipeline?: PipelineAIChatHelpers }

function requirePipeline(helpers: PipelineToolHelpers): PipelineAIChatHelpers {
	if (!helpers?.pipeline) {
		throw new Error(
			'No pipeline editor is open. Pipeline tools only work on a /pipeline/<folder> page in edit mode.'
		)
	}
	return helpers.pipeline
}

const scriptLangSchema = z.enum($ScriptLang.enum)

const outputKindSchema = z
	.enum(['none', 'datatable', 'ducklake', 'materialize', 's3_parquet', 's3_object'])
	.describe(
		'Kind of output asset this node materializes, used to seed the output edge on the canvas before the body is parsed: "materialize"/"ducklake" → a DuckLake table, "datatable" → a Postgres data table, "s3_parquet"/"s3_object" → an S3 file, "none" → side-effect only. Defaults to none.'
	)

// ----------------------------------------------------------------------------
// Read tools
// ----------------------------------------------------------------------------

View on GitHub (pinned to e474e8803c)

Solutions

  1. Open the target pipeline at /pipeline/<folder> and switch it into edit mode before invoking pipeline tools
  2. Confirm the chat session is connected to the open editor (helpers.pipeline is registered by the editor component on mount)
  3. Reload the pipeline page if the editor is open but helpers were not injected (stale frontend state)
  4. Route the request to a chat session scoped to the pipeline editor instead of a global chat

Example fix

// before (global chat, no editor)
await chat.run('test the transform node') // -> throws
// after
// open /pipeline/my-folder in edit mode, then use that page's chat
await chat.run('test the transform node')
Defensive patterns

Strategy: validation

Validate before calling

if (!helpers?.pipeline) {
  // route the user to open /pipeline/<folder> in edit mode first
  return
}
// safe to call pipeline tools

Type guard

function hasPipeline(helpers) {
  return typeof helpers === 'object' && helpers !== null && 'pipeline' in helpers && helpers.pipeline != null
}

Prevention

When it happens

Trigger: Any pipeline tool (test node, edit pipeline, etc.) invoked while helpers.pipeline is undefined — i.e. the chat is in global/session mode but the user is not on a pipeline editor page in edit mode, or the editor failed to register its helpers.

Common situations: Developer asks the copilot to modify or test a pipeline from another page (script editor, home, flows list); the pipeline tab is open in run/view mode rather than edit mode; the editor component has not mounted its helpers yet when the tool fires.

Related errors


AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03). Data as JSON: /api/errors/246f760a6282fa5c. Report an issue: GitHub.