1769 lines
72 KiB
JSON
1769 lines
72 KiB
JSON
{
|
||
"createdAt": "2025-11-01T05:48:33.789Z",
|
||
"updatedAt": "2025-11-16T21:58:34.000Z",
|
||
"id": "fIRTXBkbYVoFDtEK",
|
||
"name": "Network Agent",
|
||
"active": false,
|
||
"isArchived": false,
|
||
"nodes": [
|
||
{
|
||
"parameters": {
|
||
"model": {
|
||
"__rl": true,
|
||
"value": "gpt-4.1",
|
||
"mode": "list",
|
||
"cachedResultName": "gpt-4.1"
|
||
},
|
||
"options": {}
|
||
},
|
||
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
|
||
"typeVersion": 1.2,
|
||
"position": [
|
||
96,
|
||
224
|
||
],
|
||
"id": "92ffe17d-a27d-4085-87f5-f27a07ec64d5",
|
||
"name": "OpenAI Chat Model",
|
||
"credentials": {
|
||
"openAiApi": {
|
||
"id": "0aLJYVCIXPIQZb1L",
|
||
"name": "OpenAi account"
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"parameters": {},
|
||
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
|
||
"typeVersion": 1.3,
|
||
"position": [
|
||
272,
|
||
224
|
||
],
|
||
"id": "3125f620-72bf-40bc-866c-8334fc3d4d5c",
|
||
"name": "Simple Memory"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"content": "I would make it so the text needs to contain @...\nI would also wrap the responses in an embed, its only available for bots and looks super fancy"
|
||
},
|
||
"type": "n8n-nodes-base.stickyNote",
|
||
"typeVersion": 1,
|
||
"position": [
|
||
-5136,
|
||
336
|
||
],
|
||
"id": "714789fe-2711-4a73-a758-eef4aab26013",
|
||
"name": "Sticky Note"
|
||
},
|
||
{
|
||
"parameters": {},
|
||
"type": "n8n-nodes-base.errorTrigger",
|
||
"typeVersion": 1,
|
||
"position": [
|
||
-4272,
|
||
400
|
||
],
|
||
"id": "692c87cb-d3c5-4327-85eb-01d45624d797",
|
||
"name": "Error Trigger",
|
||
"disabled": true
|
||
},
|
||
{
|
||
"parameters": {
|
||
"method": "POST",
|
||
"url": "http://10.20.22.1:8282/send",
|
||
"sendHeaders": true,
|
||
"headerParameters": {
|
||
"parameters": [
|
||
{
|
||
"name": "Content-Type",
|
||
"value": "application/json"
|
||
},
|
||
{
|
||
"name": "X-Tahoma-Token",
|
||
"value": "superlongrandomsharedsecret"
|
||
}
|
||
]
|
||
},
|
||
"sendBody": true,
|
||
"bodyParameters": {
|
||
"parameters": [
|
||
{
|
||
"name": "channel_id",
|
||
"value": "=1432513507164815411"
|
||
},
|
||
{
|
||
"name": "content",
|
||
"value": "={{ $json.formattedError }}"
|
||
}
|
||
]
|
||
},
|
||
"options": {}
|
||
},
|
||
"type": "n8n-nodes-base.httpRequest",
|
||
"typeVersion": 4.2,
|
||
"position": [
|
||
-3696,
|
||
400
|
||
],
|
||
"id": "553bf80a-6815-4321-8a42-f603ba336e28",
|
||
"name": "HTTP Request2",
|
||
"disabled": true
|
||
},
|
||
{
|
||
"parameters": {
|
||
"assignments": {
|
||
"assignments": [
|
||
{
|
||
"id": "f17edd43-e535-40e9-b28d-a6ea0eb5a8fd",
|
||
"name": "workflow",
|
||
"value": "pfSense Agent",
|
||
"type": "string"
|
||
},
|
||
{
|
||
"id": "93ce5fb1-981b-49ba-9195-cfb430a77275",
|
||
"name": "timestamp",
|
||
"value": "={{ $now }}",
|
||
"type": "string"
|
||
},
|
||
{
|
||
"id": "d54ee60d-b247-4569-bd93-42970c246a8d",
|
||
"name": "error",
|
||
"value": "={{ $json.execution.error }}",
|
||
"type": "string"
|
||
}
|
||
]
|
||
},
|
||
"options": {}
|
||
},
|
||
"type": "n8n-nodes-base.set",
|
||
"typeVersion": 3.4,
|
||
"position": [
|
||
-4080,
|
||
400
|
||
],
|
||
"id": "2e1d8798-15cf-4b2d-a6c5-18817309b545",
|
||
"name": "Edit Fields",
|
||
"disabled": true
|
||
},
|
||
{
|
||
"parameters": {
|
||
"assignments": {
|
||
"assignments": [
|
||
{
|
||
"id": "1634eb92-f9c5-437f-9d5a-8970496d74a5",
|
||
"name": "formattedError",
|
||
"value": "={{ (() => {\n const error = typeof $json.error === 'string' ? JSON.parse($json.error) : $json.error;\n const date = new Date($json.timestamp);\n const pad = (n) => String(n).padStart(2, '0');\n const formattedTime = `${pad(date.getHours())}:${pad(date.getMinutes())} - ${pad(date.getMonth() + 1)}/${pad(date.getDate())}/${String(date.getFullYear()).slice(2)}`;\n return '```json\\n' + formattedTime + '\\n' + $json.workflow + '\\n' + JSON.stringify(error, null, 2) + '\\n```';\n})() }}\n\n",
|
||
"type": "string"
|
||
}
|
||
]
|
||
},
|
||
"options": {}
|
||
},
|
||
"type": "n8n-nodes-base.set",
|
||
"typeVersion": 3.4,
|
||
"position": [
|
||
-3872,
|
||
400
|
||
],
|
||
"id": "61a9cc3e-0f6a-4236-97bc-103adc7c66cf",
|
||
"name": "Edit Fields1",
|
||
"disabled": true
|
||
},
|
||
{
|
||
"parameters": {
|
||
"promptType": "define",
|
||
"text": "={{ $('discordWebhook').item.json.body.content }}",
|
||
"options": {
|
||
"systemMessage": "=You are a network infrastructure assistant with administrative access to the pfSense router used in the ArmstrongLabs home network. Your primary responsibility is the secure monitoring, maintenance, and management of the pfSense firewall, router and other pfSense subsystems.\n\nYou have full administrator access via both:\n- A CLI tool for executing system-level pfSense commands\n- The pfSense web GUI for interactive configuration\n\nYou must follow strict operational protocols at all times.\n\n---\n\nResponsibilities:\n\n1. **Monitor the Router’s Health and Services**\n - Check the status of system services, interfaces, firewall rules, VPNs, and resource usage\n - Detect anomalies, service failures, or configuration inconsistencies\n - This should include monitoring any related logs.\n\n2. **Safeguard Configuration with Backups**\n - Before executing **any action** that changes system state (e.g., restarting a service, changing firewall rules, modifying DHCP), always:\n - Generate a configuration backup using CLI or GUI tools\n - Ensure the backup is **timestamped** for tracking\n - Confirm the backup completed successfully\n\n3. **Apply System Changes Responsibly**\n - Perform configuration changes only when explicitly requested or clearly required\n - After applying changes, always:\n - Confirm post-action system health (services up, interfaces responsive, no alerts)\n - Report only on what was done and why\n - Include relevant CLI commands used, if applicable\n\n4. **Reporting Protocol**\n - On initial user inquiry, begin with a **clear summary**:\n - ✅ System Healthy\n - ⚠️ Issues Detected\n - Do **not** repeat this summary on subsequent responses unless requested\n\n - All reports must be **responsive to the user’s input** — avoid any extraneous or verbose information\n - If an action is performed:\n - Include details of the backup created\n - Describe the exact changes applied\n - Provide CLI commands executed\n - Confirm system health after changes are complete\n\n5. **Security Awareness**\n - Never reveal passwords or sensitive details\n - Log or disclose changes only as needed for user understanding\n\n6. **Response Formatting**\n - Use markdown and other formatting techniques that will help users who interface with Discord.\n\n---\n\nYou are expected to be concise, careful, and focused in all operations.\n"
|
||
}
|
||
},
|
||
"type": "@n8n/n8n-nodes-langchain.agent",
|
||
"typeVersion": 2.2,
|
||
"position": [
|
||
224,
|
||
0
|
||
],
|
||
"id": "d9957b5d-0b58-4d67-96ad-c621a33d6801",
|
||
"name": "Tahoma.pfSense"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"options": {
|
||
"systemMessage": "You are Tahoma-Router, the centralized AI message router for ArmstrongLabs' home infrastructure.\n\nYour sole responsibility is to analyze incoming Discord messages and determine the correct route tag based on the message content and intent.\n\nYou must always return only one routing tag from the list below. Do not return any other text, explanation, or formatting — only the routing tag.\n\nRouting Tags:\n\npfsense – Use for messages about:\n\nNetwork connectivity, firewall, DHCP, DNS, VPN\n\nRouter or pfSense-specific issues\n\nMentions of “router”, “firewall”, “pfSense”, or “can’t connect”\n\nOther things that you would associate with the network router\n\nolalla1 – Use for:\n\nDocker containers (website, portainer, nginx, redis, postgres, n8n)\n\nDocker issues, restarts, logs, updates\n\nMentions of “docker”, “container”, “website down”, or host olalla1\n\nlabserver01 – Use for:\n\nCamera system (Shinobi), surveillance, recordings, host labserver01\n\nMentions of “camera”, “CCTV”, “Shinobi”, “recordings”, or labserver01\n\nchaos – Use for:\n\nFile storage (TrueNAS), Plex, Nextcloud\n\nMentions of “chaos”, “file server”, “truenas”, “plex”, “nextcloud”\n\nproxmox – Use for:\n\nVirtual machines, Home Assistant, automation, snapshots\n\nMentions of “proxmox”, “home assistant”, “HA”, “smart home”, “KNX”\n\nchat – Use for:\n\nAnything unrelated, social, unclear, or not matching above categories\n\nOnly return the matching routing tag, exactly as written. Do not include quotes, punctuation, JSON, or explanations. Output must be one word: the selected route tag only."
|
||
}
|
||
},
|
||
"type": "@n8n/n8n-nodes-langchain.agent",
|
||
"typeVersion": 2.2,
|
||
"position": [
|
||
-1168,
|
||
992
|
||
],
|
||
"id": "9005e253-8c70-4e9e-8510-f03252ff0b57",
|
||
"name": "Tahoma Agent Router",
|
||
"alwaysOutputData": true
|
||
},
|
||
{
|
||
"parameters": {
|
||
"model": {
|
||
"__rl": true,
|
||
"mode": "list",
|
||
"value": "gpt-4.1-mini"
|
||
},
|
||
"options": {}
|
||
},
|
||
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
|
||
"typeVersion": 1.2,
|
||
"position": [
|
||
-1168,
|
||
1184
|
||
],
|
||
"id": "42ce0d1b-a6c0-46d5-88aa-ccf9cefc442f",
|
||
"name": "OpenAI Chat Model1",
|
||
"credentials": {
|
||
"openAiApi": {
|
||
"id": "0aLJYVCIXPIQZb1L",
|
||
"name": "OpenAi account"
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"parameters": {},
|
||
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
|
||
"typeVersion": 1.3,
|
||
"position": [
|
||
-1040,
|
||
1184
|
||
],
|
||
"id": "c74e4915-e35f-445f-8ef9-4958d74b0bfe",
|
||
"name": "Simple Memory1"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"method": "POST",
|
||
"url": "http://10.20.22.1:8282/send",
|
||
"sendHeaders": true,
|
||
"headerParameters": {
|
||
"parameters": [
|
||
{
|
||
"name": "Content-Type",
|
||
"value": "application/json"
|
||
},
|
||
{
|
||
"name": "X-Tahoma-Token",
|
||
"value": "superlongrandomsharedsecret"
|
||
}
|
||
]
|
||
},
|
||
"sendBody": true,
|
||
"bodyParameters": {
|
||
"parameters": [
|
||
{
|
||
"name": "user_id",
|
||
"value": "={{ $('discordWebhook').item.json.body.user.id }}"
|
||
},
|
||
{
|
||
"name": "reply_to_message_id",
|
||
"value": "={{ $('discordWebhook').item.json.body.message_id }}"
|
||
},
|
||
{
|
||
"name": "content",
|
||
"value": "={{ $json.output }}"
|
||
}
|
||
]
|
||
},
|
||
"options": {}
|
||
},
|
||
"type": "n8n-nodes-base.httpRequest",
|
||
"typeVersion": 4.2,
|
||
"position": [
|
||
1648,
|
||
1040
|
||
],
|
||
"id": "75527c7a-aefe-4af2-9fb5-aa14424e5acc",
|
||
"name": "DM Message"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"method": "POST",
|
||
"url": "http://10.20.22.1:8282/send",
|
||
"sendHeaders": true,
|
||
"headerParameters": {
|
||
"parameters": [
|
||
{
|
||
"name": "Content-Type",
|
||
"value": "application/json"
|
||
},
|
||
{
|
||
"name": "X-Tahoma-Token",
|
||
"value": "superlongrandomsharedsecret"
|
||
}
|
||
]
|
||
},
|
||
"sendBody": true,
|
||
"bodyParameters": {
|
||
"parameters": [
|
||
{
|
||
"name": "channel_id",
|
||
"value": "={{ $('discordWebhook').item.json.body.channel.id }}"
|
||
},
|
||
{
|
||
"name": "reply_to_message_id",
|
||
"value": "={{ $('discordWebhook').item.json.body.message_id }}"
|
||
},
|
||
{
|
||
"name": "content",
|
||
"value": "={{ $json.output }}"
|
||
}
|
||
]
|
||
},
|
||
"options": {}
|
||
},
|
||
"type": "n8n-nodes-base.httpRequest",
|
||
"typeVersion": 4.2,
|
||
"position": [
|
||
1648,
|
||
848
|
||
],
|
||
"id": "91e0bad4-9787-4474-a589-d4a50f39a996",
|
||
"name": "Channel Message"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"rules": {
|
||
"values": [
|
||
{
|
||
"conditions": {
|
||
"options": {
|
||
"caseSensitive": true,
|
||
"leftValue": "",
|
||
"typeValidation": "strict",
|
||
"version": 2
|
||
},
|
||
"conditions": [
|
||
{
|
||
"leftValue": "={{ $('discordWebhook').item.json.body.source }}",
|
||
"rightValue": "mention",
|
||
"operator": {
|
||
"type": "string",
|
||
"operation": "equals"
|
||
},
|
||
"id": "4e57debd-1943-49a9-b794-65bec790bb4f"
|
||
}
|
||
],
|
||
"combinator": "and"
|
||
},
|
||
"renameOutput": true,
|
||
"outputKey": "Channel"
|
||
},
|
||
{
|
||
"conditions": {
|
||
"options": {
|
||
"caseSensitive": true,
|
||
"leftValue": "",
|
||
"typeValidation": "strict",
|
||
"version": 2
|
||
},
|
||
"conditions": [
|
||
{
|
||
"id": "e0ca0788-c704-4799-8525-adff31e68a86",
|
||
"leftValue": "={{ $('discordWebhook').item.json.body.source }}",
|
||
"rightValue": "dm",
|
||
"operator": {
|
||
"type": "string",
|
||
"operation": "equals",
|
||
"name": "filter.operator.equals"
|
||
}
|
||
}
|
||
],
|
||
"combinator": "and"
|
||
},
|
||
"renameOutput": true,
|
||
"outputKey": "User"
|
||
}
|
||
]
|
||
},
|
||
"options": {}
|
||
},
|
||
"type": "n8n-nodes-base.switch",
|
||
"typeVersion": 3.3,
|
||
"position": [
|
||
1424,
|
||
944
|
||
],
|
||
"id": "eb112947-4eb0-490a-b909-560f2cf603a6",
|
||
"name": "Switch1"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"httpMethod": "POST",
|
||
"path": "discord/Tahoma",
|
||
"options": {}
|
||
},
|
||
"type": "n8n-nodes-base.webhook",
|
||
"typeVersion": 2.1,
|
||
"position": [
|
||
-1536,
|
||
992
|
||
],
|
||
"id": "3998e151-10e1-43cd-a88d-4234b36a6797",
|
||
"name": "discordWebhook",
|
||
"webhookId": "f9a4841a-3e54-4432-9f4f-b380cb44c6a8"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"model": {
|
||
"__rl": true,
|
||
"value": "gpt-4.1",
|
||
"mode": "list",
|
||
"cachedResultName": "gpt-4.1"
|
||
},
|
||
"options": {}
|
||
},
|
||
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
|
||
"typeVersion": 1.2,
|
||
"position": [
|
||
80,
|
||
592
|
||
],
|
||
"id": "0c06984e-22e0-4605-b64c-17ac64117313",
|
||
"name": "OpenAI Chat Model2",
|
||
"credentials": {
|
||
"openAiApi": {
|
||
"id": "0aLJYVCIXPIQZb1L",
|
||
"name": "OpenAi account"
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"parameters": {},
|
||
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
|
||
"typeVersion": 1.3,
|
||
"position": [
|
||
256,
|
||
592
|
||
],
|
||
"id": "d8797b23-28b3-49cb-a122-680373a0995b",
|
||
"name": "Simple Memory2"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"model": {
|
||
"__rl": true,
|
||
"value": "gpt-4.1",
|
||
"mode": "list",
|
||
"cachedResultName": "gpt-4.1"
|
||
},
|
||
"options": {}
|
||
},
|
||
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
|
||
"typeVersion": 1.2,
|
||
"position": [
|
||
80,
|
||
976
|
||
],
|
||
"id": "2510fa69-86fd-45ba-9218-cc23cf5677b4",
|
||
"name": "OpenAI Chat Model3",
|
||
"credentials": {
|
||
"openAiApi": {
|
||
"id": "0aLJYVCIXPIQZb1L",
|
||
"name": "OpenAi account"
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"parameters": {},
|
||
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
|
||
"typeVersion": 1.3,
|
||
"position": [
|
||
208,
|
||
976
|
||
],
|
||
"id": "d68fbd2f-1d43-4d8f-b16e-4286afb50a71",
|
||
"name": "Simple Memory3"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"description": "This provides ssh command access to Labserver01",
|
||
"workflowId": {
|
||
"__rl": true,
|
||
"value": "Qmmsi8vfiO40YtrH",
|
||
"mode": "list",
|
||
"cachedResultUrl": "/workflow/Qmmsi8vfiO40YtrH",
|
||
"cachedResultName": "SSH_Labserver01"
|
||
},
|
||
"workflowInputs": {
|
||
"mappingMode": "defineBelow",
|
||
"value": {
|
||
"command": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('command', ``, 'string') }}"
|
||
},
|
||
"matchingColumns": [
|
||
"command"
|
||
],
|
||
"schema": [
|
||
{
|
||
"id": "command",
|
||
"displayName": "command",
|
||
"required": false,
|
||
"defaultMatch": false,
|
||
"display": true,
|
||
"canBeUsedToMatch": true,
|
||
"type": "string"
|
||
}
|
||
],
|
||
"attemptToConvertTypes": false,
|
||
"convertFieldsToString": false
|
||
}
|
||
},
|
||
"type": "@n8n/n8n-nodes-langchain.toolWorkflow",
|
||
"typeVersion": 2.2,
|
||
"position": [
|
||
464,
|
||
976
|
||
],
|
||
"id": "e6b589ba-8952-4441-bdfc-24d5e76401a5",
|
||
"name": "CLI Tool2"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"model": {
|
||
"__rl": true,
|
||
"value": "gpt-4.1",
|
||
"mode": "list",
|
||
"cachedResultName": "gpt-4.1"
|
||
},
|
||
"options": {}
|
||
},
|
||
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
|
||
"typeVersion": 1.2,
|
||
"position": [
|
||
96,
|
||
1360
|
||
],
|
||
"id": "9b8d423c-e51f-44be-bc52-786e4f84e911",
|
||
"name": "OpenAI Chat Model4",
|
||
"credentials": {
|
||
"openAiApi": {
|
||
"id": "0aLJYVCIXPIQZb1L",
|
||
"name": "OpenAi account"
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"parameters": {},
|
||
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
|
||
"typeVersion": 1.3,
|
||
"position": [
|
||
224,
|
||
1360
|
||
],
|
||
"id": "aec46220-35ac-4007-9e69-e8d566ddb15c",
|
||
"name": "Simple Memory4"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"description": "This provides ssh command access to Olalla1",
|
||
"workflowId": {
|
||
"__rl": true,
|
||
"value": "IrPspGPqNsKs0MU4",
|
||
"mode": "list",
|
||
"cachedResultUrl": "/workflow/IrPspGPqNsKs0MU4",
|
||
"cachedResultName": "SSH_pfSense"
|
||
},
|
||
"workflowInputs": {
|
||
"mappingMode": "defineBelow",
|
||
"value": {
|
||
"command": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('command', ``, 'string') }}"
|
||
},
|
||
"matchingColumns": [
|
||
"command"
|
||
],
|
||
"schema": [
|
||
{
|
||
"id": "command",
|
||
"displayName": "command",
|
||
"required": false,
|
||
"defaultMatch": false,
|
||
"display": true,
|
||
"canBeUsedToMatch": true,
|
||
"type": "string"
|
||
}
|
||
],
|
||
"attemptToConvertTypes": false,
|
||
"convertFieldsToString": false
|
||
}
|
||
},
|
||
"type": "@n8n/n8n-nodes-langchain.toolWorkflow",
|
||
"typeVersion": 2.2,
|
||
"position": [
|
||
480,
|
||
1360
|
||
],
|
||
"id": "cd7bf8eb-721b-4846-ae28-c9b97f7e38da",
|
||
"name": "CLI Tool3"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"model": {
|
||
"__rl": true,
|
||
"value": "gpt-4.1",
|
||
"mode": "list",
|
||
"cachedResultName": "gpt-4.1"
|
||
},
|
||
"options": {}
|
||
},
|
||
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
|
||
"typeVersion": 1.2,
|
||
"position": [
|
||
112,
|
||
1792
|
||
],
|
||
"id": "d480f66a-5f05-47d5-b764-fe7451bf042b",
|
||
"name": "OpenAI Chat Model5",
|
||
"credentials": {
|
||
"openAiApi": {
|
||
"id": "0aLJYVCIXPIQZb1L",
|
||
"name": "OpenAi account"
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"parameters": {},
|
||
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
|
||
"typeVersion": 1.3,
|
||
"position": [
|
||
240,
|
||
1792
|
||
],
|
||
"id": "3a15819c-9eba-4f25-99f1-ea076eeec0d9",
|
||
"name": "Simple Memory5"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"description": "This provides ssh command access to Olalla1",
|
||
"workflowId": {
|
||
"__rl": true,
|
||
"value": "IrPspGPqNsKs0MU4",
|
||
"mode": "list",
|
||
"cachedResultUrl": "/workflow/IrPspGPqNsKs0MU4",
|
||
"cachedResultName": "SSH_pfSense"
|
||
},
|
||
"workflowInputs": {
|
||
"mappingMode": "defineBelow",
|
||
"value": {
|
||
"command": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('command', ``, 'string') }}"
|
||
},
|
||
"matchingColumns": [
|
||
"command"
|
||
],
|
||
"schema": [
|
||
{
|
||
"id": "command",
|
||
"displayName": "command",
|
||
"required": false,
|
||
"defaultMatch": false,
|
||
"display": true,
|
||
"canBeUsedToMatch": true,
|
||
"type": "string"
|
||
}
|
||
],
|
||
"attemptToConvertTypes": false,
|
||
"convertFieldsToString": false
|
||
}
|
||
},
|
||
"type": "@n8n/n8n-nodes-langchain.toolWorkflow",
|
||
"typeVersion": 2.2,
|
||
"position": [
|
||
496,
|
||
1792
|
||
],
|
||
"id": "cb66a82d-8988-4840-bdff-1bef987002a3",
|
||
"name": "CLI Tool4"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"model": {
|
||
"__rl": true,
|
||
"value": "gpt-4.1",
|
||
"mode": "list",
|
||
"cachedResultName": "gpt-4.1"
|
||
},
|
||
"options": {}
|
||
},
|
||
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
|
||
"typeVersion": 1.2,
|
||
"position": [
|
||
112,
|
||
2160
|
||
],
|
||
"id": "a99d3165-83e3-477b-8cdb-cfbbae3de3ef",
|
||
"name": "OpenAI Chat Model6",
|
||
"credentials": {
|
||
"openAiApi": {
|
||
"id": "0aLJYVCIXPIQZb1L",
|
||
"name": "OpenAi account"
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"parameters": {},
|
||
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
|
||
"typeVersion": 1.3,
|
||
"position": [
|
||
240,
|
||
2160
|
||
],
|
||
"id": "8a65beff-ed0d-4a80-a62e-ffe00001c061",
|
||
"name": "Simple Memory6"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"promptType": "define",
|
||
"text": "={{ $('discordWebhook').item.json.body.content }}",
|
||
"options": {
|
||
"systemMessage": "=You are a Docker and Service Infrastructure Assistant for the Olalla1 server within the ArmstrongLabs home network. Your primary responsibility is the secure management, maintenance, and operational reporting of Docker containers, their images, volumes, networks, and the services they host.\n\nYou have full administrator access to Olalla1 via:\n\nA CLI tool for executing Docker and system-level commands\n\nThe Docker API or Docker Compose, when applicable\n\nYou must always follow best operational practices and be responsive to context from routed user input.\n\nResponsibilities:\n\nMonitor Docker and System Health\n\nCheck container statuses, resource usage (CPU, memory, disk), container logs, and uptime\n\nDetect failed or unhealthy containers, orphaned volumes or stale networks, and abnormal resource consumption or crash loops\n\nAssess host-level health if relevant (disk space, CPU load)\n\nSafeguard Operational State with Snapshots or Logs\n\nBefore executing any action that affects a running container or service:\n\nSave container configuration or inspect output\n\nCapture logs (especially before stopping or restarting)\n\nBack up relevant volumes if data loss is a risk\n\nEnsure snapshot or log includes a timestamp for reference\n\nApply Changes with Discipline\n\nOnly perform changes (e.g. restart, rebuild, pull new image, prune) when explicitly requested or clearly required\n\nAfter any change:\n\nVerify container is healthy (using docker inspect, docker ps, or health checks)\n\nConfirm no adverse impact on related containers or networks\n\nClearly report what was done, why it was done, and the result\n\nReporting Protocol\n\nOn initial user inquiry, begin with a clear status summary such as \"Containers Healthy\" or \"Issues Detected\"\n\nDo not repeat the status summary on follow-up responses unless requested\n\nWhen action is taken:\n\nProvide timestamped logs or backups if relevant\n\nDescribe the change that was made\n\nInclude any key Docker CLI commands or Compose actions used\n\nConfirm the health of affected services after the change\n\nSecurity and Context Awareness\n\nNever disclose secrets, passwords, or contents of environment (.env) files\n\nOnly act on services hosted on Olalla1 unless explicitly instructed to coordinate with others\n\nResponse Formatting\n\nKeep responses clear and concise for use in Discord\n\nUse code blocks for commands and logs when appropriate\n\nUse concise lists for status or action summaries\n\nScope of Expertise:\nYou can support and troubleshoot anything related to Docker or services hosted via containers on Olalla1, including:\n\nContainer lifecycle (start, stop, restart, rebuild, remove)\n\nImage pulls and updates\n\nDocker Compose services\n\nVolume, network, and storage inspection\n\nLog parsing and alerting\n\nService status checks for hosted applications (e.g. HomeAssistant, Plex, Portainer, etc.)\n\nAlways act with caution, document your actions, and verify the result of each operation."
|
||
}
|
||
},
|
||
"type": "@n8n/n8n-nodes-langchain.agent",
|
||
"typeVersion": 2.2,
|
||
"position": [
|
||
208,
|
||
368
|
||
],
|
||
"id": "72c43474-4c15-418b-8fc0-fba64f52c58f",
|
||
"name": "Tahoma.Olalla1"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"promptType": "define",
|
||
"text": "={{ $('discordWebhook').item.json.body.content }}",
|
||
"options": {
|
||
"systemMessage": "You are a CCTV infrastructure assistant assigned to the labserver01 server within the ArmstrongLabs home network. Your primary responsibility is the monitoring, maintenance, and operational control of the Shinobi CCTV system and the supporting server environment.\n\nYou have full administrative access to labserver01, including:\n\nElevated sudo permissions\n\nAccess to the Shinobi installation directory at /home/Shinobi\n\nProcess control via pm2 for all Shinobi components\n\nA Shinobi web account with:\n\nUsername: mail.armstronglabs@gmail.com\nPassword: tahoma$1\n\nYou must always follow strict operational discipline and act only on relevant instructions.\n\nResponsibilities:\n\nMonitor Shinobi and System Health\n\nCheck the status of Shinobi processes using pm2\n\nIdentify stopped, failed, or misbehaving services\n\nVerify camera streams, recording functionality, and dashboard accessibility\n\nMonitor CPU, memory, disk I/O, and overall system performance\n\nReview Shinobi logs for recent errors or performance warnings\n\nExecute Shinobi Commands from the Correct Directory\n\nAll pm2 commands must be executed from the /home/Shinobi directory\n\nBefore issuing a command, always navigate to that directory\n\nExample: cd /home/Shinobi\n\nCommon Shinobi service commands include:\n\npm2 start camera.js\n\npm2 stop cron.js\n\npm2 restart camera.js\n\npm2 list\n\npm2 logs\n\nManage Shinobi Processes\n\nUse pm2 to start, stop, restart, and inspect Shinobi services\n\nConfirm process status after executing a command\n\nDo not leave any Shinobi component in an unintended state\n\nManage Shinobi Web Access\n\nLog in with the Tahoma user account only when necessary\n\nUse the web interface to check camera status, motion events, and video playback\n\nDo not reconfigure camera streams or system options unless specifically requested\n\nApply Operational Changes Carefully\n\nBefore any restart or change:\n\nCheck CPU and disk load\n\nCapture current logs and pm2 status\n\nAfter changes:\n\nVerify all Shinobi services are running correctly\n\nConfirm that camera feeds and recordings are working\n\nReporting Protocol\n\nWhen asked for system status, respond with either:\n\nShinobi system healthy\n\nShinobi issues detected\n\nOnly repeat health summaries when requested again\n\nIf actions are taken, always report:\n\nThe working directory used\n\nThe exact command executed\n\nThe reason for the action\n\nThe result and current Shinobi status\n\nSecurity and Access Control\n\nDo not reveal passwords unless absolutely required to complete a task\n\nAvoid exposing sensitive configuration or user credentials\n\nAlways act with caution and prioritize system integrity\n\nResponse Format\n\nResponses must be brief and clear for Discord users\n\nWrap commands and logs in code blocks\n\nUse structured summaries when describing status or results\n\nScope of Expertise:\nYou are responsible for all Shinobi-related operations on labserver01, including:\n\nProcess control using pm2\n\nWeb interface verification\n\nLog analysis and error tracing\n\nCamera uptime and recording validation\n\nSystem resource checks that impact video performance\n\nYou are expected to act with discipline, clarity, and technical accuracy at all times."
|
||
}
|
||
},
|
||
"type": "@n8n/n8n-nodes-langchain.agent",
|
||
"typeVersion": 2.2,
|
||
"position": [
|
||
208,
|
||
752
|
||
],
|
||
"id": "b23f36ce-1a29-467b-a507-29e9ee27cd18",
|
||
"name": "Tahoma.labserver01"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"promptType": "define",
|
||
"text": "={{ $('discordWebhook').item.json.body.content }}",
|
||
"options": {
|
||
"systemMessage": "="
|
||
}
|
||
},
|
||
"type": "@n8n/n8n-nodes-langchain.agent",
|
||
"typeVersion": 2.2,
|
||
"position": [
|
||
224,
|
||
1136
|
||
],
|
||
"id": "54a3703b-a266-4740-9099-be1ae6fa6032",
|
||
"name": "Tahoma.Chaos"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"promptType": "define",
|
||
"text": "={{ $('discordWebhook').item.json.body.content }}",
|
||
"options": {
|
||
"systemMessage": "="
|
||
}
|
||
},
|
||
"type": "@n8n/n8n-nodes-langchain.agent",
|
||
"typeVersion": 2.2,
|
||
"position": [
|
||
224,
|
||
1552
|
||
],
|
||
"id": "a49fd2c0-1317-425c-8817-71b3d5309c7c",
|
||
"name": "Tahoma.Proxmox"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"promptType": "define",
|
||
"text": "={{ $('discordWebhook').item.json.body.content }}",
|
||
"options": {
|
||
"systemMessage": "=You're a helpful chat bot"
|
||
}
|
||
},
|
||
"type": "@n8n/n8n-nodes-langchain.agent",
|
||
"typeVersion": 2.2,
|
||
"position": [
|
||
240,
|
||
1936
|
||
],
|
||
"id": "aeb89f63-13bd-4a10-8ec0-153026ac3e99",
|
||
"name": "Tahoma.Chat"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"conditions": {
|
||
"options": {
|
||
"caseSensitive": true,
|
||
"leftValue": "",
|
||
"typeValidation": "strict",
|
||
"version": 2
|
||
},
|
||
"conditions": [
|
||
{
|
||
"id": "c98e8e1b-a5b1-4c1a-a187-44a2ea7d04f5",
|
||
"leftValue": "={{ $json.output }}",
|
||
"rightValue": "pfsense",
|
||
"operator": {
|
||
"type": "string",
|
||
"operation": "equals",
|
||
"name": "filter.operator.equals"
|
||
}
|
||
}
|
||
],
|
||
"combinator": "and"
|
||
},
|
||
"options": {}
|
||
},
|
||
"type": "n8n-nodes-base.if",
|
||
"typeVersion": 2.2,
|
||
"position": [
|
||
-208,
|
||
16
|
||
],
|
||
"id": "a17c01d5-56b9-4242-a0ce-fa551cece873",
|
||
"name": "If-pfsense",
|
||
"alwaysOutputData": false
|
||
},
|
||
{
|
||
"parameters": {
|
||
"description": "This provides ssh command access to pfSense",
|
||
"workflowId": {
|
||
"__rl": true,
|
||
"value": "oRBY45uEhqeypgtx",
|
||
"mode": "list",
|
||
"cachedResultUrl": "/workflow/oRBY45uEhqeypgtx",
|
||
"cachedResultName": "SSH_pfSense"
|
||
},
|
||
"workflowInputs": {
|
||
"mappingMode": "defineBelow",
|
||
"value": {
|
||
"command": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('command', ``, 'string') }}"
|
||
},
|
||
"matchingColumns": [
|
||
"command"
|
||
],
|
||
"schema": [
|
||
{
|
||
"id": "command",
|
||
"displayName": "command",
|
||
"required": false,
|
||
"defaultMatch": false,
|
||
"display": true,
|
||
"canBeUsedToMatch": true,
|
||
"type": "string"
|
||
}
|
||
],
|
||
"attemptToConvertTypes": false,
|
||
"convertFieldsToString": false
|
||
}
|
||
},
|
||
"type": "@n8n/n8n-nodes-langchain.toolWorkflow",
|
||
"typeVersion": 2.2,
|
||
"position": [
|
||
480,
|
||
224
|
||
],
|
||
"id": "4171f62c-8cd8-45f4-a004-d6130cf8ce57",
|
||
"name": "SSH_pfSense"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"conditions": {
|
||
"options": {
|
||
"caseSensitive": true,
|
||
"leftValue": "",
|
||
"typeValidation": "strict",
|
||
"version": 2
|
||
},
|
||
"conditions": [
|
||
{
|
||
"id": "79bda45f-f1da-462c-a9eb-f5d5a47345fc",
|
||
"leftValue": "={{ $json.output }}",
|
||
"rightValue": "olalla1",
|
||
"operator": {
|
||
"type": "string",
|
||
"operation": "equals",
|
||
"name": "filter.operator.equals"
|
||
}
|
||
}
|
||
],
|
||
"combinator": "and"
|
||
},
|
||
"options": {}
|
||
},
|
||
"type": "n8n-nodes-base.if",
|
||
"typeVersion": 2.2,
|
||
"position": [
|
||
-208,
|
||
384
|
||
],
|
||
"id": "15b89f15-5c75-4d54-bcfb-cad5a40bbc29",
|
||
"name": "If-Olalla1"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"assignments": {
|
||
"assignments": [
|
||
{
|
||
"id": "25d3a1df-fe28-4507-8e08-fb8d0c5d164f",
|
||
"name": "chatInput",
|
||
"value": "={{ $('addSessionId').item.json.chatInput }}",
|
||
"type": "string"
|
||
},
|
||
{
|
||
"id": "2de8cf64-71aa-4e43-86b5-f064bea83011",
|
||
"name": "sessionId",
|
||
"value": "={{ $('addSessionId').item.json.sessionId }}",
|
||
"type": "string"
|
||
}
|
||
]
|
||
},
|
||
"options": {}
|
||
},
|
||
"type": "n8n-nodes-base.set",
|
||
"typeVersion": 3.4,
|
||
"position": [
|
||
0,
|
||
0
|
||
],
|
||
"id": "71548d1f-2a43-4d09-a5e2-ec841ce5c03e",
|
||
"name": "pfsensePrompt"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"assignments": {
|
||
"assignments": [
|
||
{
|
||
"id": "25d3a1df-fe28-4507-8e08-fb8d0c5d164f",
|
||
"name": "chatInput",
|
||
"value": "={{ $('addSessionId').item.json.chatInput }}",
|
||
"type": "string"
|
||
},
|
||
{
|
||
"id": "2de8cf64-71aa-4e43-86b5-f064bea83011",
|
||
"name": "sessionId",
|
||
"value": "={{ $('addSessionId').item.json.sessionId }}",
|
||
"type": "string"
|
||
}
|
||
]
|
||
},
|
||
"options": {}
|
||
},
|
||
"type": "n8n-nodes-base.set",
|
||
"typeVersion": 3.4,
|
||
"position": [
|
||
0,
|
||
368
|
||
],
|
||
"id": "a10862fd-3730-4e3f-8239-d850947a6019",
|
||
"name": "olalla1Prompt"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"assignments": {
|
||
"assignments": [
|
||
{
|
||
"id": "25d3a1df-fe28-4507-8e08-fb8d0c5d164f",
|
||
"name": "chatInput",
|
||
"value": "={{ $('addSessionId').item.json.chatInput }}",
|
||
"type": "string"
|
||
},
|
||
{
|
||
"id": "2de8cf64-71aa-4e43-86b5-f064bea83011",
|
||
"name": "sessionId",
|
||
"value": "={{ $('addSessionId').item.json.sessionId }}",
|
||
"type": "string"
|
||
}
|
||
]
|
||
},
|
||
"options": {}
|
||
},
|
||
"type": "n8n-nodes-base.set",
|
||
"typeVersion": 3.4,
|
||
"position": [
|
||
16,
|
||
752
|
||
],
|
||
"id": "17a64d28-60a0-4c4a-8990-b443a8413161",
|
||
"name": "labserver01Prompt"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"conditions": {
|
||
"options": {
|
||
"caseSensitive": true,
|
||
"leftValue": "",
|
||
"typeValidation": "strict",
|
||
"version": 2
|
||
},
|
||
"conditions": [
|
||
{
|
||
"id": "79bda45f-f1da-462c-a9eb-f5d5a47345fc",
|
||
"leftValue": "={{ $json.output }}",
|
||
"rightValue": "labserver01",
|
||
"operator": {
|
||
"type": "string",
|
||
"operation": "equals",
|
||
"name": "filter.operator.equals"
|
||
}
|
||
}
|
||
],
|
||
"combinator": "and"
|
||
},
|
||
"options": {}
|
||
},
|
||
"type": "n8n-nodes-base.if",
|
||
"typeVersion": 2.2,
|
||
"position": [
|
||
-192,
|
||
768
|
||
],
|
||
"id": "917c7e23-9cb2-45f4-aecb-7b7ee8220c5a",
|
||
"name": "If-Labserver01"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"assignments": {
|
||
"assignments": [
|
||
{
|
||
"id": "36c1a770-24d7-4db2-ae65-29ca36a3e673",
|
||
"name": "=sessionId",
|
||
"value": "={{ $now }}",
|
||
"type": "string"
|
||
},
|
||
{
|
||
"id": "93005d98-8f3e-4907-8103-8bd3fef1ea5a",
|
||
"name": "chatInput",
|
||
"value": "={{ $json.body.content }}",
|
||
"type": "string"
|
||
}
|
||
]
|
||
},
|
||
"options": {}
|
||
},
|
||
"type": "n8n-nodes-base.set",
|
||
"typeVersion": 3.4,
|
||
"position": [
|
||
-1360,
|
||
992
|
||
],
|
||
"id": "d52013a9-d0c3-4cc8-9df2-bc8e1ac27618",
|
||
"name": "addSessionId"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"description": "This tool allows you to run SSH commands on Olalla1",
|
||
"workflowId": {
|
||
"__rl": true,
|
||
"value": "Zhs5PPx70UGORrvG",
|
||
"mode": "list",
|
||
"cachedResultUrl": "/workflow/Zhs5PPx70UGORrvG",
|
||
"cachedResultName": "SSH_Olalla1"
|
||
},
|
||
"workflowInputs": {
|
||
"mappingMode": "defineBelow",
|
||
"value": {
|
||
"command": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('command', ``, 'string') }}"
|
||
},
|
||
"matchingColumns": [
|
||
"command"
|
||
],
|
||
"schema": [
|
||
{
|
||
"id": "command",
|
||
"displayName": "command",
|
||
"required": false,
|
||
"defaultMatch": false,
|
||
"display": true,
|
||
"canBeUsedToMatch": true,
|
||
"type": "string"
|
||
}
|
||
],
|
||
"attemptToConvertTypes": false,
|
||
"convertFieldsToString": false
|
||
}
|
||
},
|
||
"type": "@n8n/n8n-nodes-langchain.toolWorkflow",
|
||
"typeVersion": 2.2,
|
||
"position": [
|
||
400,
|
||
592
|
||
],
|
||
"id": "a730fe37-04c7-4e83-8693-990e10384c56",
|
||
"name": "SSH_Olalla1"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"assignments": {
|
||
"assignments": [
|
||
{
|
||
"id": "25d3a1df-fe28-4507-8e08-fb8d0c5d164f",
|
||
"name": "chatInput",
|
||
"value": "={{ $('addSessionId').item.json.chatInput }}",
|
||
"type": "string"
|
||
},
|
||
{
|
||
"id": "2de8cf64-71aa-4e43-86b5-f064bea83011",
|
||
"name": "sessionId",
|
||
"value": "={{ $('addSessionId').item.json.sessionId }}",
|
||
"type": "string"
|
||
}
|
||
]
|
||
},
|
||
"options": {}
|
||
},
|
||
"type": "n8n-nodes-base.set",
|
||
"typeVersion": 3.4,
|
||
"position": [
|
||
-96,
|
||
1936
|
||
],
|
||
"id": "28ffe0b0-0348-4269-8eae-8dad56676668",
|
||
"name": "labserver01Prompt1"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"conditions": {
|
||
"options": {
|
||
"caseSensitive": true,
|
||
"leftValue": "",
|
||
"typeValidation": "strict",
|
||
"version": 2
|
||
},
|
||
"conditions": [
|
||
{
|
||
"id": "79bda45f-f1da-462c-a9eb-f5d5a47345fc",
|
||
"leftValue": "={{ $json.output }}",
|
||
"rightValue": "chat",
|
||
"operator": {
|
||
"type": "string",
|
||
"operation": "equals",
|
||
"name": "filter.operator.equals"
|
||
}
|
||
}
|
||
],
|
||
"combinator": "and"
|
||
},
|
||
"options": {}
|
||
},
|
||
"type": "n8n-nodes-base.if",
|
||
"typeVersion": 2.2,
|
||
"position": [
|
||
-304,
|
||
1952
|
||
],
|
||
"id": "ce6ae855-e742-4e16-b617-ddc772774598",
|
||
"name": "If-Labserver"
|
||
}
|
||
],
|
||
"connections": {
|
||
"OpenAI Chat Model": {
|
||
"ai_languageModel": [
|
||
[
|
||
{
|
||
"node": "Tahoma.pfSense",
|
||
"type": "ai_languageModel",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Simple Memory": {
|
||
"ai_memory": [
|
||
[
|
||
{
|
||
"node": "Tahoma.pfSense",
|
||
"type": "ai_memory",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Error Trigger": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Edit Fields",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Edit Fields": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Edit Fields1",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Edit Fields1": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "HTTP Request2",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Tahoma.pfSense": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Switch1",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Tahoma Agent Router": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "If-pfsense",
|
||
"type": "main",
|
||
"index": 0
|
||
},
|
||
{
|
||
"node": "If-Olalla1",
|
||
"type": "main",
|
||
"index": 0
|
||
},
|
||
{
|
||
"node": "If-Labserver01",
|
||
"type": "main",
|
||
"index": 0
|
||
},
|
||
{
|
||
"node": "If-Labserver",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"OpenAI Chat Model1": {
|
||
"ai_languageModel": [
|
||
[
|
||
{
|
||
"node": "Tahoma Agent Router",
|
||
"type": "ai_languageModel",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Simple Memory1": {
|
||
"ai_memory": [
|
||
[
|
||
{
|
||
"node": "Tahoma Agent Router",
|
||
"type": "ai_memory",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Switch1": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Channel Message",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
],
|
||
[
|
||
{
|
||
"node": "DM Message",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"discordWebhook": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "addSessionId",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"OpenAI Chat Model2": {
|
||
"ai_languageModel": [
|
||
[
|
||
{
|
||
"node": "Tahoma.Olalla1",
|
||
"type": "ai_languageModel",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Simple Memory2": {
|
||
"ai_memory": [
|
||
[
|
||
{
|
||
"node": "Tahoma.Olalla1",
|
||
"type": "ai_memory",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"OpenAI Chat Model3": {
|
||
"ai_languageModel": [
|
||
[
|
||
{
|
||
"node": "Tahoma.labserver01",
|
||
"type": "ai_languageModel",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Simple Memory3": {
|
||
"ai_memory": [
|
||
[
|
||
{
|
||
"node": "Tahoma.labserver01",
|
||
"type": "ai_memory",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"CLI Tool2": {
|
||
"ai_tool": [
|
||
[
|
||
{
|
||
"node": "Tahoma.labserver01",
|
||
"type": "ai_tool",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"OpenAI Chat Model4": {
|
||
"ai_languageModel": [
|
||
[
|
||
{
|
||
"node": "Tahoma.Chaos",
|
||
"type": "ai_languageModel",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Simple Memory4": {
|
||
"ai_memory": [
|
||
[
|
||
{
|
||
"node": "Tahoma.Chaos",
|
||
"type": "ai_memory",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"CLI Tool3": {
|
||
"ai_tool": [
|
||
[
|
||
{
|
||
"node": "Tahoma.Chaos",
|
||
"type": "ai_tool",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"OpenAI Chat Model5": {
|
||
"ai_languageModel": [
|
||
[
|
||
{
|
||
"node": "Tahoma.Proxmox",
|
||
"type": "ai_languageModel",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Simple Memory5": {
|
||
"ai_memory": [
|
||
[
|
||
{
|
||
"node": "Tahoma.Proxmox",
|
||
"type": "ai_memory",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"CLI Tool4": {
|
||
"ai_tool": [
|
||
[
|
||
{
|
||
"node": "Tahoma.Proxmox",
|
||
"type": "ai_tool",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"OpenAI Chat Model6": {
|
||
"ai_languageModel": [
|
||
[
|
||
{
|
||
"node": "Tahoma.Chat",
|
||
"type": "ai_languageModel",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Simple Memory6": {
|
||
"ai_memory": [
|
||
[
|
||
{
|
||
"node": "Tahoma.Chat",
|
||
"type": "ai_memory",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Tahoma.Olalla1": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Switch1",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Tahoma.labserver01": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Switch1",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Tahoma.Chaos": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Switch1",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Tahoma.Proxmox": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Switch1",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Tahoma.Chat": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Switch1",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"If-pfsense": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "pfsensePrompt",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"SSH_pfSense": {
|
||
"ai_tool": [
|
||
[
|
||
{
|
||
"node": "Tahoma.pfSense",
|
||
"type": "ai_tool",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"If-Olalla1": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "olalla1Prompt",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"pfsensePrompt": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Tahoma.pfSense",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"olalla1Prompt": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Tahoma.Olalla1",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"labserver01Prompt": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Tahoma.labserver01",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"If-Labserver01": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "labserver01Prompt",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"addSessionId": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Tahoma Agent Router",
|
||
"type": "main",
|
||
"index": 0
|
||
},
|
||
{
|
||
"node": "If-pfsense",
|
||
"type": "main",
|
||
"index": 0
|
||
},
|
||
{
|
||
"node": "If-Olalla1",
|
||
"type": "main",
|
||
"index": 0
|
||
},
|
||
{
|
||
"node": "If-Labserver01",
|
||
"type": "main",
|
||
"index": 0
|
||
},
|
||
{
|
||
"node": "If-Labserver",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"SSH_Olalla1": {
|
||
"ai_tool": [
|
||
[
|
||
{
|
||
"node": "Tahoma.Olalla1",
|
||
"type": "ai_tool",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"If-Labserver": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "labserver01Prompt1",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"labserver01Prompt1": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Tahoma.Chat",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
}
|
||
},
|
||
"settings": {
|
||
"executionOrder": "v1"
|
||
},
|
||
"staticData": null,
|
||
"meta": {
|
||
"templateCredsSetupCompleted": true
|
||
},
|
||
"pinData": {
|
||
"Error Trigger": [
|
||
{
|
||
"json": {
|
||
"execution": {
|
||
"id": "535",
|
||
"url": "http://10.20.22.1:5678/workflow/kzdWlp9H4vob5ylw/executions/535",
|
||
"error": {
|
||
"level": "warning",
|
||
"tags": {},
|
||
"timestamp": 1761709037505,
|
||
"context": {},
|
||
"functionality": "regular",
|
||
"name": "NodeOperationError",
|
||
"node": {
|
||
"parameters": {
|
||
"aiAgentStarterCallout": "",
|
||
"preBuiltAgentsCallout": "",
|
||
"promptType": "auto",
|
||
"text": "={{ $json.chatInput }}",
|
||
"hasOutputParser": false,
|
||
"needsFallback": false,
|
||
"options": {
|
||
"systemMessage": "=\nYou are a network infrastructure assistant with administrative access to the pfSense router used in the ArmstrongLabs home network. Your primary responsibility is the secure monitoring, maintenance, and management of the pfSense firewall, router and other pfSense subsystems.\n\nYou have full administrator access via both:\n- A CLI tool for executing system-level pfSense commands\n- The pfSense web GUI for interactive configuration\n\nYou must follow strict operational protocols at all times.\n\n---\n\nResponsibilities:\n\n1. **Monitor the Router’s Health and Services**\n - Check the status of system services, interfaces, firewall rules, VPNs, and resource usage\n - Detect anomalies, service failures, or configuration inconsistencies\n - This should include monitoring any related logs.\n\n2. **Safeguard Configuration with Backups**\n - Before executing **any action** that changes system state (e.g., restarting a service, changing firewall rules, modifying DHCP), always:\n - Generate a configuration backup using CLI or GUI tools\n - Ensure the backup is **timestamped** for tracking\n - Confirm the backup completed successfully\n\n3. **Apply System Changes Responsibly**\n - Perform configuration changes only when explicitly requested or clearly required\n - After applying changes, always:\n - Confirm post-action system health (services up, interfaces responsive, no alerts)\n - Report only on what was done and why\n - Include relevant CLI commands used, if applicable\n\n4. **Reporting Protocol**\n - On initial user inquiry, begin with a **clear summary**:\n - ✅ System Healthy\n - ⚠️ Issues Detected\n - Do **not** repeat this summary on subsequent responses unless requested\n\n - All reports must be **responsive to the user’s input** — avoid any extraneous or verbose information\n - If an action is performed:\n - Include details of the backup created\n - Describe the exact changes applied\n - Provide CLI commands executed\n - Confirm system health after changes are complete\n\n5. **Security Awareness**\n - Never reveal passwords or sensitive details\n - Log or disclose changes only as needed for user understanding\n\n6. **Response Formatting**\n - Use markdown and other formatting techniques that will help users who interface with Discord.\n\n---\n\nYou are expected to be concise, careful, and focused in all operations.\n"
|
||
}
|
||
},
|
||
"type": "@n8n/n8n-nodes-langchain.agent",
|
||
"typeVersion": 2.2,
|
||
"position": [
|
||
160,
|
||
-272
|
||
],
|
||
"id": "c713703f-d4a9-43f2-95e3-dcc868869a63",
|
||
"name": "Tahoma.pfSense"
|
||
},
|
||
"messages": [],
|
||
"message": "Aborted",
|
||
"stack": "NodeOperationError: Aborted\n at /usr/local/lib/node_modules/n8n/node_modules/.pnpm/@n8n+n8n-nodes-langchain@file+packages+@n8n+nodes-langchain_a24dca14d97268ba43379590ce508ab3/node_modules/@n8n/n8n-nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/V2/execute.ts:313:12\n at Array.forEach (<anonymous>)\n at ExecuteContext.toolsAgentExecute (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/@n8n+n8n-nodes-langchain@file+packages+@n8n+nodes-langchain_a24dca14d97268ba43379590ce508ab3/node_modules/@n8n/n8n-nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/V2/execute.ts:302:16)\n at ExecuteContext.execute (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/@n8n+n8n-nodes-langchain@file+packages+@n8n+nodes-langchain_a24dca14d97268ba43379590ce508ab3/node_modules/@n8n/n8n-nodes-langchain/nodes/agents/Agent/V2/AgentV2.node.ts:131:10)\n at WorkflowExecute.executeNode (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/n8n-core@file+packages+core_@opentelemetry+api@1.9.0_@opentelemetry+sdk-trace-base@1.30_08b575bec2313d5d8a4cc75358971443/node_modules/n8n-core/src/execution-engine/workflow-execute.ts:1093:8)\n at WorkflowExecute.runNode (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/n8n-core@file+packages+core_@opentelemetry+api@1.9.0_@opentelemetry+sdk-trace-base@1.30_08b575bec2313d5d8a4cc75358971443/node_modules/n8n-core/src/execution-engine/workflow-execute.ts:1274:11)\n at /usr/local/lib/node_modules/n8n/node_modules/.pnpm/n8n-core@file+packages+core_@opentelemetry+api@1.9.0_@opentelemetry+sdk-trace-base@1.30_08b575bec2313d5d8a4cc75358971443/node_modules/n8n-core/src/execution-engine/workflow-execute.ts:1699:27\n at /usr/local/lib/node_modules/n8n/node_modules/.pnpm/n8n-core@file+packages+core_@opentelemetry+api@1.9.0_@opentelemetry+sdk-trace-base@1.30_08b575bec2313d5d8a4cc75358971443/node_modules/n8n-core/src/execution-engine/workflow-execute.ts:2315:11"
|
||
},
|
||
"lastNodeExecuted": "Tahoma.pfSense",
|
||
"mode": "integrated"
|
||
},
|
||
"workflow": {
|
||
"id": "kzdWlp9H4vob5ylw",
|
||
"name": "pfSense Agent"
|
||
}
|
||
}
|
||
}
|
||
],
|
||
"discordWebhook": [
|
||
{
|
||
"json": {
|
||
"headers": {
|
||
"host": "10.20.22.1:5678",
|
||
"user-agent": "python-requests/2.32.5",
|
||
"accept-encoding": "gzip, deflate",
|
||
"accept": "*/*",
|
||
"connection": "keep-alive",
|
||
"content-length": "342",
|
||
"content-type": "application/json"
|
||
},
|
||
"params": {},
|
||
"query": {},
|
||
"body": {
|
||
"source": "mention",
|
||
"content": "what's the state capital of california?",
|
||
"message_id": "1433705606405165066",
|
||
"user": {
|
||
"id": "785279431265878096",
|
||
"name": "bill_a_",
|
||
"discriminator": "0",
|
||
"tag": "bill_a_#0"
|
||
},
|
||
"guild": {
|
||
"id": "1432130512805302282",
|
||
"name": "ArmstrongLabs"
|
||
},
|
||
"channel": {
|
||
"id": "1432513507164815411",
|
||
"name": "tahoma-bot",
|
||
"type": "text"
|
||
}
|
||
},
|
||
"webhookUrl": "http://10.20.22.1:5678/webhook/discord/Tahoma",
|
||
"executionMode": "production"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
"versionId": "c3ca7b96-85f0-49bf-9881-81da6f3b6751",
|
||
"triggerCount": 1,
|
||
"shared": [
|
||
{
|
||
"createdAt": "2025-11-01T05:48:33.798Z",
|
||
"updatedAt": "2025-11-01T05:48:33.798Z",
|
||
"role": "workflow:owner",
|
||
"workflowId": "fIRTXBkbYVoFDtEK",
|
||
"projectId": "oI3LZpkceKxAFXfg"
|
||
}
|
||
],
|
||
"tags": [
|
||
{
|
||
"createdAt": "2025-11-01T05:48:29.378Z",
|
||
"updatedAt": "2025-11-01T05:48:29.378Z",
|
||
"id": "VcrTzfJMxt4f3Z9u",
|
||
"name": "Network"
|
||
}
|
||
]
|
||
} |