Skip to content

Conversation

shad03152015
Copy link

Summary

Related Linear tickets, Github issues, and Community forum posts

Review / Merge checklist

  • PR title and summary are descriptive. (conventions)
  • Docs updated or follow-up ticket created.
  • Tests included.
  • PR Labeled with release/backport (if the PR is an urgent fix that needs to be backported)

@CLAassistant
Copy link

CLAassistant commented Oct 20, 2025

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you all sign our Contributor License Agreement before we can accept your contribution.
0 out of 2 committers have signed the CLA.

❌ shad03152015
❌ Compyle Bot


Compyle Bot seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account.
You have signed the CLA already but the status is still pending? Let us recheck it.

@n8n-assistant n8n-assistant bot added community Authored by a community member core Enhancement outside /nodes-base and /editor-ui node/new Creation of an entirely new node in linear Issue or PR has been created in Linear for internal review labels Oct 20, 2025
@n8n-assistant
Copy link

n8n-assistant bot commented Oct 20, 2025

Hey @shad03152015,

Thank you for your contribution. We appreciate the time and effort you’ve taken to submit this pull request.

Before we can proceed, please ensure the following:
• Tests are included for any new functionality, logic changes or bug fixes.
• The PR aligns with our contribution guidelines.

Regarding new nodes:
We no longer accept new nodes directly into the core codebase. Instead, we encourage contributors to follow our Community Node Submission Guide to publish nodes independently.

If your node integrates with an AI service that you own or represent, please email nodes@n8n.io and we will be happy to discuss the best approach.

About review timelines:
This PR has been added to our internal tracker as "GHC-5121". While we plan to review it, we are currently unable to provide an exact timeframe. Our goal is to begin reviews within a month, but this may change depending on team priorities. We will reach out when the review begins.

Thank you again for contributing to n8n.

Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

26 issues found across 83 files

Prompt for AI agents (all 26 issues)

Understand the root cause of the following 26 issues and fix them.


<file name="packages/frontend/editor-ui/src/components/Modals.vue">

<violation number="1" location="packages/frontend/editor-ui/src/components/Modals.vue:122">
Mounting AIDialogModal through ModalRoot registers a document-level keydown listener every time it opens, but the component never removes it on unmount, so closing and reopening this modal leaks listeners. Please add the onUnmounted cleanup before wiring it in here.</violation>
</file>

<file name="packages/nodes-base/nodes/Aws/ApiGateway/descriptions/stage/Stage.resource.ts">

<violation number="1" location="packages/nodes-base/nodes/Aws/ApiGateway/descriptions/stage/Stage.resource.ts:11">
The required “Stage Name” field shows for the list operation, but that request doesn’t take a stage name. This makes the list action unusable without entering a bogus value. Please hide the field for list (or make it optional when listing).</violation>
</file>

<file name="packages/frontend/editor-ui/src/views/NodeView.vue">

<violation number="1" location="packages/frontend/editor-ui/src/views/NodeView.vue:2024">
`WorkflowCanvas` still emits `replace:node`, but this template no longer listens for it, so the node-replacement action now silently does nothing. Please wire `@replace:node=&quot;onClickReplaceNode&quot;` back into the canvas bindings.</violation>
</file>

<file name="packages/nodes-base/nodes/Aws/test/AWS_Services_Validation.workflow.json">

<violation number="1" location="packages/nodes-base/nodes/Aws/test/AWS_Services_Validation.workflow.json:55">
State machine names must be unique per account/region; leaving this hard-coded to TestStateMachine will cause StateMachineAlreadyExists on the second run. Please derive a per-execution name (for example by appending $execution.id).</violation>

<violation number="2" location="packages/nodes-base/nodes/Aws/test/AWS_Services_Validation.workflow.json:78">
Execution names must be unique for 90 days; using the fixed TestExecution value will throw ExecutionAlreadyExists on the next run. Generate the execution name dynamically (for example by including $execution.id).</violation>

<violation number="3" location="packages/nodes-base/nodes/Aws/test/AWS_Services_Validation.workflow.json:133">
ECS cluster names must be unique per region/account; reusing TestCluster causes ClusterAlreadyExistsException on the second run. Please generate a unique cluster name (e.g. append $execution.id) and ensure the downstream list-tasks node uses the same value.</violation>
</file>

<file name="packages/cli/src/controllers/ai.controller.ts">

<violation number="1" location="packages/cli/src/controllers/ai.controller.ts:13">
Removing the `Licensed(&#39;feat:aiBuilder&#39;)` guard from these routes drops the license middleware, exposing AI Builder endpoints to unlicensed users. Please restore the license check on these handlers to keep the feature gated.</violation>
</file>

<file name="packages/nodes-base/nodes/Aws/ApiGateway/helpers/errorHandler.ts">

<violation number="1" location="packages/nodes-base/nodes/Aws/ApiGateway/helpers/errorHandler.ts:11">
Please pass the current itemIndex into the NodeApiError options so the failure is attributed to the correct input item.</violation>
</file>

<file name="packages/frontend/editor-ui/src/components/MainHeader/MainHeader.vue">

<violation number="1" location="packages/frontend/editor-ui/src/components/MainHeader/MainHeader.vue:270">
`saveCurrentWorkflow` is never defined or imported in this component, so this call fails at compile time.</violation>

<violation number="2" location="packages/frontend/editor-ui/src/components/MainHeader/MainHeader.vue:280">
`WORKFLOW_SETTINGS_MODAL_KEY` is not imported anywhere in this file, so this line references an undefined identifier and will break when the function runs.</violation>
</file>

<file name="packages/nodes-base/nodes/Aws/Kinesis/AwsKinesis.node.ts">

<violation number="1" location="packages/nodes-base/nodes/Aws/Kinesis/AwsKinesis.node.ts:303">
`sendInputData` mode rebuilds the whole input batch inside the per-item loop, so after the first iteration it replays the same records again for every remaining item. That makes each workflow input produce duplicate Kinesis writes. Please gate this branch so the batch is sent only once (e.g. handle it outside the per-item loop).</violation>

<violation number="2" location="packages/nodes-base/nodes/Aws/Kinesis/AwsKinesis.node.ts:431">
Rule violated: **Prefer Typeguards over Type casting**

Replace the `(error as Error)` assertion with a proper type guard so the caught value is safely narrowed before reading `message`.</violation>
</file>

<file name="packages/nodes-base/nodes/Aws/Route53/descriptions/recordSet/RecordSet.resource.ts">

<violation number="1" location="packages/nodes-base/nodes/Aws/Route53/descriptions/recordSet/RecordSet.resource.ts:30">
The request body interpolates record fields into XML without escaping, so values containing XML-reserved characters (e.g. &#39;&amp;&#39;) produce invalid XML and the Route53 upsert request fails.</violation>
</file>

<file name="packages/frontend/editor-ui/src/App.vue">

<violation number="1" location="packages/frontend/editor-ui/src/App.vue:91">
This condition treats the modal state object as a boolean, so the AI chat dialog now opens on every startup even when it should stay closed. Please gate on the modal’s open flag instead.</violation>
</file>

<file name="packages/frontend/editor-ui/src/components/AIAssistantPanel.vue">

<violation number="1" location="packages/frontend/editor-ui/src/components/AIAssistantPanel.vue:38">
Please sort conversations by lastMessageAt so the most recently active chat surfaces first; updatedAt gets bumped by metadata-only changes and produces stale ordering. Use lastMessageAt with an updatedAt fallback instead.

(Based on your team&#39;s feedback about using lastMessageAt for chat sorting.) [FEEDBACK_USED]</violation>
</file>

<file name="packages/nodes-base/nodes/Aws/ApiGateway/descriptions/deployment/Deployment.resource.ts">

<violation number="1" location="packages/nodes-base/nodes/Aws/ApiGateway/descriptions/deployment/Deployment.resource.ts:27">
The create deployment request always sends `stageName: &#39;&#39;` when the field is left blank, but API Gateway requires stageName to be omitted or ≥1 char. As-is, the default create request fails. Please guard the expression to omit the property when empty.</violation>
</file>

<file name="packages/frontend/editor-ui/src/features/ai/workflow-modifier/WorkflowOperationExecutor.ts">

<violation number="1" location="packages/frontend/editor-ui/src/features/ai/workflow-modifier/WorkflowOperationExecutor.ts:45">
Rule violated: **Prefer Typeguards over Type casting**

The default branch asserts `operation as any` to read `type`, which violates the &quot;Prefer Typeguards over Type casting&quot; rule by discarding type safety. Please refactor (e.g., capture the type before the switch or refine the union typing) to avoid the assertion.</violation>
</file>

<file name="packages/nodes-base/nodes/Aws/EventBridge/AwsEventBridge.node.ts">

<violation number="1" location="packages/nodes-base/nodes/Aws/EventBridge/AwsEventBridge.node.ts:308">
Rule violated: **Prefer Typeguards over Type casting**

Remove the `as any` cast when throwing `NodeApiError`; the payload already matches `JsonObject`, so the assertion is unnecessary and hides type errors.</violation>
</file>

<file name="packages/nodes-base/nodes/Aws/EC2/AwsEc2.node.ts">

<violation number="1" location="packages/nodes-base/nodes/Aws/EC2/AwsEc2.node.ts:611">
Rule violated: **Prefer Typeguards over Type casting**

Remove the `as any` cast when throwing NodeApiError; the payload already satisfies JsonObject and the cast violates the Prefer Typeguards over Type casting rule.</violation>
</file>

<file name="packages/nodes-base/nodes/Aws/CloudWatch/AwsCloudWatch.node.ts">

<violation number="1" location="packages/nodes-base/nodes/Aws/CloudWatch/AwsCloudWatch.node.ts:579">
Rule violated: **Prefer Typeguards over Type casting**

Prefer Typeguards over Type casting forbids narrowing the caught value with `(error as Error)`. Guard `error` (e.g. via `instanceof Error`) before reading `message` so we don’t assert unknown values.</violation>
</file>

<file name="packages/nodes-base/nodes/Aws/CloudFormation/helpers/errorHandler.ts">

<violation number="1" location="packages/nodes-base/nodes/Aws/CloudFormation/helpers/errorHandler.ts:11">
Rule violated: **Prefer Typeguards over Type casting**

Avoid asserting errorData/message/error with `as`; this violates the &quot;Prefer Typeguards over Type casting&quot; guideline. Introduce a type guard or tighten the helper’s typings so TypeScript can infer Type/Code/Message (and the error payload) without assertions.</violation>
</file>

<file name="packages/nodes-base/nodes/Aws/StepFunctions/helpers/errorHandler.ts">

<violation number="1" location="packages/nodes-base/nodes/Aws/StepFunctions/helpers/errorHandler.ts:10">
Rule violated: **Prefer Typeguards over Type casting**

Replace the type assertions with proper typing or guards to comply with the &quot;Prefer Typeguards over Type casting&quot; rule. Use simple runtime checks (e.g., typeof) or stronger type annotations to avoid `as string`/`as any`.</violation>
</file>

<file name="packages/nodes-base/nodes/Aws/Athena/AwsAthena.node.ts">

<violation number="1" location="packages/nodes-base/nodes/Aws/Athena/AwsAthena.node.ts:444">
Rule violated: **Prefer Typeguards over Type casting**

Casting the caught value to Error to read `.message` violates the Prefer Typeguards over Type casting rule. Use a runtime guard (e.g. `instanceof`) to narrow before accessing the property.</violation>
</file>

<file name="packages/nodes-base/nodes/Aws/RDS/AwsRds.node.ts">

<violation number="1" location="packages/nodes-base/nodes/Aws/RDS/AwsRds.node.ts:604">
Rule violated: **Prefer Typeguards over Type casting**

Avoid asserting `additionalFields.vpcSecurityGroupIds` to string; guard or encode the type before calling `.split` so non-string inputs are rejected instead of crashing, per the Prefer Typeguards over Type casting rule.</violation>

<violation number="2" location="packages/nodes-base/nodes/Aws/RDS/AwsRds.node.ts:671">
Rule violated: **Prefer Typeguards over Type casting**

Remove the `as any` assertion and satisfy NodeApiError’s `JsonObject` contract explicitly (e.g. with `satisfies`), instead of bypassing type safety via `as`, to comply with Prefer Typeguards over Type casting.</violation>
</file>

<file name="packages/nodes-base/nodes/Aws/Route53/helpers/errorHandler.ts">

<violation number="1" location="packages/nodes-base/nodes/Aws/Route53/helpers/errorHandler.ts:11">
Rule violated: **Prefer Typeguards over Type casting**

Accessing `errorData` via `(errorData as IDataObject)` (and the downstream `message as string`) narrows by assertion, which breaks our &quot;Prefer Typeguards over Type casting&quot; rule. Please introduce a proper guard/typing (e.g. check that `errorData` is an object with the expected fields or annotate the variable/function signature) instead of casting.</violation>
</file>

Since this is your first cubic review, here's how it works:

  • cubic automatically reviews your code and comments on bugs and improvements
  • Teach cubic by replying to its comments. cubic learns from your replies and gets better over time
  • Ask questions if you need clarification on any suggestion

React with 👍 or 👎 to teach cubic. Mention @cubic-dev-ai to give feedback, ask questions, or re-run the review.

</ModalRoot>

<ModalRoot :name="AI_CHAT_DIALOG_MODAL_KEY">
<AIDialogModal />
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Oct 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mounting AIDialogModal through ModalRoot registers a document-level keydown listener every time it opens, but the component never removes it on unmount, so closing and reopening this modal leaks listeners. Please add the onUnmounted cleanup before wiring it in here.

Prompt for AI agents
Address the following comment on packages/frontend/editor-ui/src/components/Modals.vue at line 122:

<comment>Mounting AIDialogModal through ModalRoot registers a document-level keydown listener every time it opens, but the component never removes it on unmount, so closing and reopening this modal leaks listeners. Please add the onUnmounted cleanup before wiring it in here.</comment>

<file context>
@@ -116,6 +118,10 @@ import VariableModal from &#39;@/features/settings/environments.ee/components/Variab
 		&lt;/ModalRoot&gt;
 
+		&lt;ModalRoot :name=&quot;AI_CHAT_DIALOG_MODAL_KEY&quot;&gt;
+			&lt;AIDialogModal /&gt;
+		&lt;/ModalRoot&gt;
+
</file context>
Fix with Cubic

type: 'options',
noDataExpression: true,
default: 'create',
displayOptions: {
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Oct 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The required “Stage Name” field shows for the list operation, but that request doesn’t take a stage name. This makes the list action unusable without entering a bogus value. Please hide the field for list (or make it optional when listing).

Prompt for AI agents
Address the following comment on packages/nodes-base/nodes/Aws/ApiGateway/descriptions/stage/Stage.resource.ts at line 11:

<comment>The required “Stage Name” field shows for the list operation, but that request doesn’t take a stage name. This makes the list action unusable without entering a bogus value. Please hide the field for list (or make it optional when listing).</comment>

<file context>
@@ -0,0 +1,258 @@
+		type: &#39;options&#39;,
+		noDataExpression: true,
+		default: &#39;create&#39;,
+		displayOptions: {
+			show: {
+				resource: [&#39;stage&#39;],
</file context>
Fix with Cubic

@delete:nodes="onDeleteNodes"
@update:nodes:enabled="onToggleNodesDisabled"
@update:nodes:pin="onPinNodes"
@duplicate:nodes="onDuplicateNodes"
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Oct 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WorkflowCanvas still emits replace:node, but this template no longer listens for it, so the node-replacement action now silently does nothing. Please wire @replace:node="onClickReplaceNode" back into the canvas bindings.

Prompt for AI agents
Address the following comment on packages/frontend/editor-ui/src/views/NodeView.vue at line 2024:

<comment>`WorkflowCanvas` still emits `replace:node`, but this template no longer listens for it, so the node-replacement action now silently does nothing. Please wire `@replace:node=&quot;onClickReplaceNode&quot;` back into the canvas bindings.</comment>

<file context>
@@ -1977,182 +1978,189 @@ onBeforeUnmount(() =&gt; {
+				@delete:nodes=&quot;onDeleteNodes&quot;
+				@update:nodes:enabled=&quot;onToggleNodesDisabled&quot;
+				@update:nodes:pin=&quot;onPinNodes&quot;
+				@duplicate:nodes=&quot;onDuplicateNodes&quot;
+				@copy:nodes=&quot;onCopyNodes&quot;
+				@cut:nodes=&quot;onCutNodes&quot;
</file context>
Fix with Cubic

"parameters": {
"resource": "cluster",
"operation": "create",
"clusterName": "TestCluster",
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Oct 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ECS cluster names must be unique per region/account; reusing TestCluster causes ClusterAlreadyExistsException on the second run. Please generate a unique cluster name (e.g. append $execution.id) and ensure the downstream list-tasks node uses the same value.

Prompt for AI agents
Address the following comment on packages/nodes-base/nodes/Aws/test/AWS_Services_Validation.workflow.json at line 133:

<comment>ECS cluster names must be unique per region/account; reusing TestCluster causes ClusterAlreadyExistsException on the second run. Please generate a unique cluster name (e.g. append $execution.id) and ensure the downstream list-tasks node uses the same value.</comment>

<file context>
@@ -0,0 +1,246 @@
+			&quot;parameters&quot;: {
+				&quot;resource&quot;: &quot;cluster&quot;,
+				&quot;operation&quot;: &quot;create&quot;,
+				&quot;clusterName&quot;: &quot;TestCluster&quot;,
+				&quot;capacityProviders&quot;: &quot;[\&quot;FARGATE\&quot;, \&quot;FARGATE_SPOT\&quot;]&quot;,
+				&quot;tags&quot;: &quot;[{\&quot;key\&quot;: \&quot;Environment\&quot;, \&quot;value\&quot;: \&quot;Test\&quot;}]&quot;
</file context>
Fix with Cubic

"resource": "execution",
"operation": "start",
"stateMachineArn": "={{$json[\"stateMachineArn\"]}}",
"executionName": "TestExecution",
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Oct 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Execution names must be unique for 90 days; using the fixed TestExecution value will throw ExecutionAlreadyExists on the next run. Generate the execution name dynamically (for example by including $execution.id).

Prompt for AI agents
Address the following comment on packages/nodes-base/nodes/Aws/test/AWS_Services_Validation.workflow.json at line 78:

<comment>Execution names must be unique for 90 days; using the fixed TestExecution value will throw ExecutionAlreadyExists on the next run. Generate the execution name dynamically (for example by including $execution.id).</comment>

<file context>
@@ -0,0 +1,246 @@
+				&quot;resource&quot;: &quot;execution&quot;,
+				&quot;operation&quot;: &quot;start&quot;,
+				&quot;stateMachineArn&quot;: &quot;={{$json[\&quot;stateMachineArn\&quot;]}}&quot;,
+				&quot;executionName&quot;: &quot;TestExecution&quot;,
+				&quot;input&quot;: &quot;{\&quot;message\&quot;: \&quot;Hello from n8n\&quot;}&quot;
+			},
</file context>
Suggested change
"executionName": "TestExecution",
"executionName": "={{'TestExecution-' + $execution.id}}"
Fix with Cubic

error: IDataObject,
): Promise<IDataObject[]> {
if (error.__type || error.message) {
const errorType = (error.__type || 'UnknownError') as string;
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Oct 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rule violated: Prefer Typeguards over Type casting

Replace the type assertions with proper typing or guards to comply with the "Prefer Typeguards over Type casting" rule. Use simple runtime checks (e.g., typeof) or stronger type annotations to avoid as string/as any.

Prompt for AI agents
Address the following comment on packages/nodes-base/nodes/Aws/StepFunctions/helpers/errorHandler.ts at line 10:

<comment>Replace the type assertions with proper typing or guards to comply with the &quot;Prefer Typeguards over Type casting&quot; rule. Use simple runtime checks (e.g., typeof) or stronger type annotations to avoid `as string`/`as any`.</comment>

<file context>
@@ -0,0 +1,18 @@
+	error: IDataObject,
+): Promise&lt;IDataObject[]&gt; {
+	if (error.__type || error.message) {
+		const errorType = (error.__type || &#39;UnknownError&#39;) as string;
+		const message = (error.message || &#39;An error occurred&#39;) as string;
+		throw new NodeApiError(this.getNode(), error as any, {
</file context>
Fix with Cubic

} catch (error) {
if (this.continueOnFail()) {
const executionData = this.helpers.constructExecutionMetaData(
this.helpers.returnJsonArray({ error: (error as Error).message }),
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Oct 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rule violated: Prefer Typeguards over Type casting

Casting the caught value to Error to read .message violates the Prefer Typeguards over Type casting rule. Use a runtime guard (e.g. instanceof) to narrow before accessing the property.

Prompt for AI agents
Address the following comment on packages/nodes-base/nodes/Aws/Athena/AwsAthena.node.ts at line 444:

<comment>Casting the caught value to Error to read `.message` violates the Prefer Typeguards over Type casting rule. Use a runtime guard (e.g. `instanceof`) to narrow before accessing the property.</comment>

<file context>
@@ -0,0 +1,456 @@
+			} catch (error) {
+				if (this.continueOnFail()) {
+					const executionData = this.helpers.constructExecutionMetaData(
+						this.helpers.returnJsonArray({ error: (error as Error).message }),
+						{ itemData: { item: i } },
+					);
</file context>
Fix with Cubic

if (!finalDBSnapshotIdentifier) {
throw new NodeApiError(this.getNode(), {
message: 'Final snapshot name required when not skipping snapshot',
} as any);
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Oct 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rule violated: Prefer Typeguards over Type casting

Remove the as any assertion and satisfy NodeApiError’s JsonObject contract explicitly (e.g. with satisfies), instead of bypassing type safety via as, to comply with Prefer Typeguards over Type casting.

Prompt for AI agents
Address the following comment on packages/nodes-base/nodes/Aws/RDS/AwsRds.node.ts at line 671:

<comment>Remove the `as any` assertion and satisfy NodeApiError’s `JsonObject` contract explicitly (e.g. with `satisfies`), instead of bypassing type safety via `as`, to comply with Prefer Typeguards over Type casting.</comment>

<file context>
@@ -0,0 +1,751 @@
+						if (!finalDBSnapshotIdentifier) {
+							throw new NodeApiError(this.getNode(), {
+								message: &#39;Final snapshot name required when not skipping snapshot&#39;,
+							} as any);
+						}
+						path += `&amp;FinalDBSnapshotIdentifier=${finalDBSnapshotIdentifier}`;
</file context>
Fix with Cubic

path += `&PubliclyAccessible=${additionalFields.publiclyAccessible}`;
}
if (additionalFields.vpcSecurityGroupIds) {
const groupIds = (additionalFields.vpcSecurityGroupIds as string)
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Oct 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rule violated: Prefer Typeguards over Type casting

Avoid asserting additionalFields.vpcSecurityGroupIds to string; guard or encode the type before calling .split so non-string inputs are rejected instead of crashing, per the Prefer Typeguards over Type casting rule.

Prompt for AI agents
Address the following comment on packages/nodes-base/nodes/Aws/RDS/AwsRds.node.ts at line 604:

<comment>Avoid asserting `additionalFields.vpcSecurityGroupIds` to string; guard or encode the type before calling `.split` so non-string inputs are rejected instead of crashing, per the Prefer Typeguards over Type casting rule.</comment>

<file context>
@@ -0,0 +1,751 @@
+						path += `&amp;PubliclyAccessible=${additionalFields.publiclyAccessible}`;
+					}
+					if (additionalFields.vpcSecurityGroupIds) {
+						const groupIds = (additionalFields.vpcSecurityGroupIds as string)
+							.split(&#39;,&#39;)
+							.map((id) =&gt; id.trim());
</file context>
Fix with Cubic

): Promise<IDataObject[]> {
if (error.Error || error.error) {
const errorData = error.Error || error.error;
const errorType = (errorData as IDataObject).Type || (errorData as IDataObject).Code || 'UnknownError';
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Oct 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rule violated: Prefer Typeguards over Type casting

Accessing errorData via (errorData as IDataObject) (and the downstream message as string) narrows by assertion, which breaks our "Prefer Typeguards over Type casting" rule. Please introduce a proper guard/typing (e.g. check that errorData is an object with the expected fields or annotate the variable/function signature) instead of casting.

Prompt for AI agents
Address the following comment on packages/nodes-base/nodes/Aws/Route53/helpers/errorHandler.ts at line 11:

<comment>Accessing `errorData` via `(errorData as IDataObject)` (and the downstream `message as string`) narrows by assertion, which breaks our &quot;Prefer Typeguards over Type casting&quot; rule. Please introduce a proper guard/typing (e.g. check that `errorData` is an object with the expected fields or annotate the variable/function signature) instead of casting.</comment>

<file context>
@@ -0,0 +1,19 @@
+): Promise&lt;IDataObject[]&gt; {
+	if (error.Error || error.error) {
+		const errorData = error.Error || error.error;
+		const errorType = (errorData as IDataObject).Type || (errorData as IDataObject).Code || &#39;UnknownError&#39;;
+		const message = (errorData as IDataObject).Message || &#39;An error occurred&#39;;
+		throw new NodeApiError(this.getNode(), error as any, {
</file context>
Fix with Cubic

cursor[bot]

This comment was marked as outdated.

@@ -0,0 +1 @@
import type{INodeType,INodeTypeDescription}from'n8n-workflow';import{agreementOperations,agreementFields}from'./descriptions';import{BASE_URL}from'./helpers/constants';export class AwsArtifact implements INodeType{description:INodeTypeDescription={displayName:'AWS Artifact',name:'awsArtifact',icon:'file:artifact.svg',group:['transform'],version:1,subtitle:'={{["operation"]+": "+["resource"]}}',description:'Interact with AWS Artifact',defaults:{name:'AWS Artifact'},inputs:['main'],outputs:['main'],credentials:[{name:'aws',required:true}],requestDefaults:{baseURL:BASE_URL,headers:{'Content-Type':'application/json'}},properties:[{displayName:'Resource',name:'resource',type:'options',noDataExpression:true,options:[{name:'Agreement',value:'agreement'}],default:'agreement'},...agreementOperations,...agreementFields]};}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: AWS Nodes Display Incorrect Subtitles

The subtitle property in these AWS nodes uses incorrect syntax ['operation'] and ['resource'] to access parameters. This causes the subtitle to display literal strings or [object Object] instead of the actual operation and resource values, affecting many AWS service nodes.

Additional Locations (4)

Fix in Cursor Fix in Web

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

community Authored by a community member core Enhancement outside /nodes-base and /editor-ui in linear Issue or PR has been created in Linear for internal review node/new Creation of an entirely new node

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants