{#if notAnonynmous} As a non logged in user, you can only see jobs ran by anonymous users like you {:else if job}
{#if isListJob} {#if render}
{/if} {:else if render}
{/if} {#if render} {#if innerModules && innerModules.length > 0 && !isListJob} {:else}
{/if} {/if}
{#if isListJob}

Subflows ({flowJobIds?.flowJobs.length})

{#each flowJobIds?.flowJobs ?? [] as loopJobId, j (loopJobId)} {#if render && j + subflowsSize + 1 == (flowJobIds?.flowJobs.length ?? 0)} {/if} {#if render && (j + subflowsSize + 1 > (flowJobIds?.flowJobs.length ?? 0) || forloop_selected == loopJobId)} {/if} {#if forloop_selected == loopJobId || innerModule?.type == 'branchall'} {@const forloopIsSelected = forloop_selected == loopJobId || (innerModule?.type != 'forloopflow' && innerModule?.type != 'whileloopflow')} {@const forLoopStoreKeyPrefix = innerModule?.type == 'forloopflow' || innerModule?.type == 'whileloopflow' ? (flowJobIds?.moduleId ?? '') + '-' + j + '-' : ''}
20)} {workspaceId} jobId={loopJobId} onJobsLoaded={({ job, force }) => { storedListJobs[j] = job innerJobLoaded(job, j, false, force) }} {onResultStreamUpdate} graphTabOpen={selected == 'graph' && graphTabOpen} isNodeSelected={forloop_selected == loopJobId} toolCallStore={{ getStoredToolCallJob: (storeKey: string) => toolCallStore?.getStoredToolCallJob(forLoopStoreKeyPrefix + storeKey), setStoredToolCallJob: (storeKey: string, job: Job) => toolCallStore?.setStoredToolCallJob(forLoopStoreKeyPrefix + storeKey, job), getLocalToolCallJobs: (prefix: string) => toolCallStore?.getLocalToolCallJobs(forLoopStoreKeyPrefix + prefix) ?? {}, addToolCallToLoad: (storeKey: string) => toolCallStore?.addToolCallToLoad(forLoopStoreKeyPrefix + storeKey), isToolCallToBeLoaded: (storeKey: string) => toolCallStore?.isToolCallToBeLoaded(forLoopStoreKeyPrefix + storeKey) ?? false }} />
{/if} {/each}
{:else if innerModules && innerModules.length > 0 && ((job.raw_flow?.modules.length ?? 0) > 0 || innerModules[0]?.id == 'preprocessor')} {@const hasPreprocessor = innerModules[0]?.id == 'preprocessor' ? 1 : 0} {@const isPreprocessorOnly = hasPreprocessor && (job.raw_flow?.modules.length ?? 0) === 0} {@const modules = isPreprocessorOnly ? [innerModules[0]] : (innerModules ?? [])}

    Step-by-step

    {#each modules as mod, i} {#if render}

    {#if mod.id === 'preprocessor'} Preprocessor module {:else if job?.raw_flow?.modules && i < job?.raw_flow?.modules.length + hasPreprocessor} Step {i + 1 - hasPreprocessor} out of {job?.raw_flow?.modules.length} {#if job.raw_flow?.modules[i]?.summary} : {job.raw_flow?.modules[i]?.summary ?? ''} {/if} {:else} Failure module {/if}

    {/if}
  • {#if render && Array.isArray(mod.failed_retries)} {#each mod.failed_retries as failedRetry, j}
    {/each} {/if} {#if ['InProgress', 'Success', 'Failure'].includes(mod.type)} {#if job.raw_flow?.modules[i]?.value.type == 'flow'} { onJobsLoadedInner(mod, job, force) }} {onResultStreamUpdate} graphTabOpen={selected == 'graph' && graphTabOpen} isNodeSelected={false} /> {:else if mod.flow_jobs?.length == 0 && mod.job == '00000000-0000-0000-0000-000000000000'}
    no subflow (empty loop?)
    {:else} { onJobsLoadedInner(mod, job, force) }} loadExtraLogs={(logs) => { setModuleState(mod.id ?? '', { logs }) }} {onResultStreamUpdate} graphTabOpen={selected == 'graph' && graphTabOpen} isNodeSelected={localModuleStates?.[selectedNode ?? '']?.job_id == mod.job} {toolCallStore} /> {#if mod.agent_actions && mod.agent_actions.length > 0 && mod.id} {@const storeKeyPrefix = getParentLoopsPrefix(mod.id)} {#each mod.agent_actions as agentAction, j} {#if agentAction.type === 'tool_call'} {@const toolCallId = getToolCallId(j, mod.id, agentAction.module_id)} {@const localToolCallKey = mod.id + '-' + j} {@const storeKey = storeKeyPrefix + localToolCallKey} {@const storedToolCallJob = toolCallStore?.getStoredToolCallJob(storeKey)} {@const isSelected = localToolCallKey === selectedToolCall} {#if isSelected || storedToolCallJob || toolCallStore?.isToolCallToBeLoaded(storeKey)} { toolCallStore?.setStoredToolCallJob(storeKey, job) onJobsLoadedInner({ id: toolCallId } as FlowStatusModule, job, force) }} loadExtraLogs={(logs) => { setModuleState(toolCallId, { logs }) }} {onResultStreamUpdate} graphTabOpen={selected == 'graph' && graphTabOpen} isNodeSelected={localModuleStates?.[toolCallId]?.job_id == agentAction.job_id} /> {/if} {/if} {/each} {/if} {/if} {:else} {/if}
  • {/each}
{:else}
Empty flow
{/if}
{#if selected == 'logs' && render}
{:else if selected == 'assets' && render}
{/if}
{#if render} {#if job.raw_flow && !isListJob}
{#each Object.values(retryStatus?.val ?? {}) as count} {#if count} Retry in progress, # of failed attempts: {count} {/if} {/each} {#each Object.values(suspendStatus?.val ?? {}) as count} {#if count.nb} Flow suspended, waiting for {count.nb} events {/if} {/each}
{ console.log('onSelect', e) if (rightColumnSelect != 'node_definition') { rightColumnSelect = 'node_status' } if (typeof e == 'string') { if (e == 'Input') { selectedNode = 'start' stepDetail = undefined } else if (e == 'Result') { selectedNode = 'end' stepDetail = 'end' } else { const id = e.startsWith(AI_TOOL_CALL_PREFIX) ? e.split('-').pop() : e const mod = dfs(job?.raw_flow?.modules ?? [], (m) => m).find( (m) => m?.id === id ) stepDetail = mod selectedNode = e if (e.startsWith(AI_TOOL_CALL_PREFIX)) { const [_prefix, agentModuleId, j, _toolModuleId] = e.split('-') const parentLoopsPrefix = getParentLoopsPrefix(agentModuleId) const jIdx = Number(j) const storeKey = parentLoopsPrefix + agentModuleId + '-' + jIdx toolCallStore?.addToolCallToLoad(storeKey) } } } else { stepDetail = e selectedNode = e.id } }} {onSelectedIteration} earlyStop={job.raw_flow?.skip_expr !== undefined} cache={job.raw_flow?.cache_ttl !== undefined} modules={job.raw_flow?.modules ?? []} notes={job.raw_flow?.notes ?? []} failureModule={job.raw_flow?.failure_module} preprocessorModule={job.raw_flow?.preprocessor_module} allowSimplifiedPoll={false} {workspace} />
{#if !hideTimeline} {/if} {#if !hideNodeDefinition} {/if} {#if Object.keys(job?.flow_status?.user_states ?? {}).length > 0} {/if} {#if rightColumnSelect == 'timeline'} buildSubflowKey(key, prefix)} durationStatuses={localDurationStatuses} /> {:else if rightColumnSelect == 'node_status'}
{#if selectedNode?.startsWith(AI_TOOL_MESSAGE_PREFIX)}
{:else if selectedNode?.startsWith(AI_MCP_TOOL_CALL_PREFIX)} {@const [, agentModuleId, toolCallIndex] = selectedNode.split('-')} {@const agentNode = localModuleStates?.[agentModuleId]} {@const agentActions = agentNode?.agent_actions} {@const mcpActionIndex = parseInt(toolCallIndex)} {@const mcpAction = agentActions && mcpActionIndex >= 0 && mcpActionIndex < agentActions.length ? agentActions[mcpActionIndex] : undefined} {#if mcpAction?.type === 'mcp_tool_call' && agentNode?.result?.messages} {@const message = agentNode.result.messages.find( (m) => m.agent_action?.call_id === mcpAction.call_id )} {/if} {:else if selectedNode} {@const node = localModuleStates[selectedNode]} {#if selectedNode == 'end'} {:else if selectedNode == 'start'} {#if job.args}
{:else}

No arguments

{/if} {:else if node} {@const module = stepDetail && typeof stepDetail !== 'string' ? stepDetail : undefined} {@const agentTools = module && module.value.type === 'aiagent' ? module.value.tools : undefined} {@const parentLoopsPrefix = getParentLoopsPrefix(module?.id ?? '')} {#if node.flow_jobs_results}
Result of step as collection of all subflows
{/if}
{#if node.flow_jobs_results} Selected subflow {/if}
{#if node.duration_ms} {msToSec(node.duration_ms)} s {/if} {#if node.job_id} {/if}
{#if !node.isListJob} {/if}
{ if (module) { const storeKey = parentLoopsPrefix + module.id + '-' + idx toolCallStore?.setStoredToolCallJob(storeKey, job) } } } : undefined} />
{:else}

The execution of this node has no information attached to it. The job likely did not run yet

{/if} {:else}

Select a node to see its details here

{/if}
{:else if rightColumnSelect == 'node_definition'} {@const node = selectedNode ? localModuleStates[selectedNode] : undefined} {:else if rightColumnSelect == 'user_states'}
{/if}
{/if} {/if} {:else} {/if}