{
  "updatedAt": "2026-05-22T21:55:07.379Z",
  "createdAt": "2026-05-13T21:26:54.606Z",
  "id": "7MlM3DjAMf4eSl0s",
  "name": "Paperless School Intake Metadata Enrichment v1.1",
  "description": "Disabled 2026-05-24 after PD Ollama/LiteLLM hammering destabilized PlausibleDeniability. Needs redesign before re-enable.",
  "active": false,
  "isArchived": false,
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "school/intake/paperless-enrich",
        "responseMode": "lastNode",
        "responseData": "allEntries",
        "options": {}
      },
      "id": "paperless-school-webhook",
      "name": "Paperless School Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        -1168,
        0
      ],
      "webhookId": "22ec3671-3ad9-4c48-8720-2ba31b944671"
    },
    {
      "parameters": {
        "jsCode": "\nconst input = $input.first().json || {};\nconst body = input.body || {};\nconst query = input.query || {};\nconst params = input.params || {};\nconst headers = input.headers || {};\nconst candidates = [\n  body.document_id,\n  body.id,\n  body.doc_id,\n  body.pk,\n  body.document_id?.id,\n  body.document?.id,\n  body.document,\n  query.document_id,\n  query.id,\n  query.doc_id,\n  params.document_id,\n  params.id,\n  headers['x-paperless-document-id'],\n  input.document_id,\n  input.id\n].filter(v => v !== undefined && v !== null && v !== '');\nlet raw = candidates[0];\nif (typeof raw === 'object' && raw !== null) raw = raw.id ?? raw.document_id ?? raw.pk ?? null;\nif (typeof raw === 'string' && /\\{.+\\}/.test(raw)) {\n  throw new Error('Received unresolved template string instead of document id.');\n}\nconst documentId = Number(raw);\nif (!Number.isFinite(documentId) || documentId <= 0) {\n  throw new Error('Could not resolve Paperless document id from webhook payload.');\n}\nreturn [{ json: { document_id: documentId } }];"
      },
      "id": "normalize-paperless-webhook",
      "name": "Normalize Paperless Webhook",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -896,
        0
      ]
    },
    {
      "parameters": {
        "url": "={{($env.PAPERLESS_BASE_URL || 'https://paperless.paccoco.com').replace(/\\/$/, '') + '/api/documents/' + $json.document_id + '/'}}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "={{'Token ' + $env.PAPERLESS_API_TOKEN}}"
            },
            {
              "name": "Accept",
              "value": "application/json"
            }
          ]
        },
        "options": {
          "timeout": 120000
        }
      },
      "id": "fetch-paperless-document",
      "name": "Fetch Paperless Document",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        -640,
        0
      ]
    },
    {
      "parameters": {
        "jsCode": "\nconst doc = $input.first().json || {};\nconst originalFilename = doc.original_file_name || doc.original_filename || '';\nconst baseName = String(originalFilename).replace(/\\.[^.]+$/, '');\nconst currentTitle = String(doc.title || '').trim();\nconst parts = currentTitle.split(' — ').map((p) => p.trim()).filter(Boolean);\nconst class_name = parts.length >= 3 ? parts[0] : null;\nconst submission_kind = parts.length >= 3 ? parts[parts.length - 1] : null;\nconst assignment_name = parts.length >= 3 ? parts.slice(1, -1).join(' — ') : null;\nreturn [{ json: {\n  intake_id: baseName && baseName.startsWith('school-') ? baseName : null,\n  document_id: doc.id,\n  current_title: currentTitle,\n  current_tags: Array.isArray(doc.tags) ? doc.tags : [],\n  original_filename: originalFilename,\n  class_name,\n  assignment_name,\n  submission_kind\n} }];"
      },
      "id": "extract-intake-id",
      "name": "Extract Intake Metadata",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -384,
        0
      ]
    },
    {
      "parameters": {
        "jsCode": "\nconst intake = $input.first().json || {};\nconst doc = $('Fetch Paperless Document').first().json || {};\nconst classTagMap = JSON.parse($env.PAPERLESS_TAG_CLASS_MAP_JSON || '{}');\nconst kindTagMap = JSON.parse($env.PAPERLESS_TAG_SUBMISSION_KIND_MAP_JSON || '{}');\nconst classCorrespondentMap = JSON.parse($env.PAPERLESS_CORRESPONDENT_CLASS_MAP_JSON || '{}');\nconst currentTags = Array.isArray(doc.tags) ? doc.tags.map(Number).filter(Number.isFinite) : [];\nconst merged = new Set(currentTags);\nfor (const id of [$env.PAPERLESS_TAG_SCHOOL, $env.PAPERLESS_TAG_ASSIGNMENTS, $env.PAPERLESS_TAG_TELEGRAM]) {\n  const n = Number(id);\n  if (Number.isFinite(n) && n > 0) merged.add(n);\n}\nconst classTag = Number(classTagMap[intake.class_name]);\nif (Number.isFinite(classTag) && classTag > 0) merged.add(classTag);\nconst kindKey = String(intake.submission_kind || '').trim().toLowerCase();\nconst kindTag = Number(kindTagMap[kindKey]);\nif (Number.isFinite(kindTag) && kindTag > 0) merged.add(kindTag);\nconst title = intake.current_title || [intake.class_name, intake.assignment_name, intake.submission_kind].filter(Boolean).join(' — ');\nconst payload = { title, tags: Array.from(merged) };\nconst correspondent = Number(classCorrespondentMap[intake.class_name]);\nif (Number.isFinite(correspondent) && correspondent > 0) payload.correspondent = correspondent;\nreturn [{ json: {\n  intake_id: intake.intake_id,\n  document_id: doc.id,\n  payload,\n  title,\n  final_tag_ids: payload.tags,\n  class_name: intake.class_name,\n  assignment_name: intake.assignment_name,\n  submission_kind: intake.submission_kind,\n  original_filename: intake.original_filename,\n  content: String(doc.content || '').slice(0, 12000),\n  created: doc.created || null,\n  status: 'enriched'\n} }];"
      },
      "id": "build-paperless-update",
      "name": "Build Paperless Update",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        144,
        0
      ]
    },
    {
      "parameters": {
        "method": "PATCH",
        "url": "={{($env.PAPERLESS_BASE_URL || 'https://paperless.paccoco.com').replace(/\\/$/, '') + '/api/documents/' + $json.document_id + '/'}}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "={{'Token ' + $env.PAPERLESS_API_TOKEN}}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "Accept",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {}
          ]
        },
        "options": {
          "timeout": 120000
        }
      },
      "id": "update-paperless-document",
      "name": "Update Paperless Document",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        400,
        0
      ]
    },
    {
      "parameters": {
        "jsCode": "\nconst update = $('Parse School Summary').first().json;\nreturn [{ json: {\n  ok: true,\n  intake_id: update.intake_id,\n  document_id: update.document_id,\n  title: update.title,\n  final_tag_ids: update.final_tag_ids,\n  ai_suggested_tags: update.ai_suggested_tags || [],\n  status: update.status || 'enriched'\n} }];"
      },
      "id": "return-enrichment-success",
      "name": "Return Enrichment Success",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1216,
        0
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "http://10.5.30.6:4000/v1/chat/completions",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "Authorization",
              "value": "={{'Bearer ' + $env.LITELLM_API_KEY}}"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"model\": \"medium\",\n  \"messages\": [\n    {\n      \"role\": \"system\",\n      \"content\": \"You write concise, useful summaries for school assignments stored in Paperless. Return ONLY valid JSON with this exact shape: {\\\"summary\\\": string, \\\"course_context\\\": [string], \\\"suggested_tags\\\": [string]}. Summary should be 2-4 sentences, name the argument or subject clearly, and avoid fluff. course_context should contain short bullets like assignment type, score if known, or class framing when inferable from the provided metadata. suggested_tags should be 3-6 lowercase tags focused on subject matter, not generic words. No markdown, no code fences.\"\n    },\n    {\n      \"role\": \"user\",\n      \"content\": \"={{ JSON.stringify('Title: ' + ($json.title || '') + '\\nClass: ' + ($json.class_name || '') + '\\nAssignment: ' + ($json.assignment_name || '') + '\\nSubmission kind: ' + ($json.submission_kind || '') + '\\nOriginal filename: ' + ($json.original_filename || '') + '\\n\\nDocument content:\\n' + ($json.content || '')).slice(1, -1) }}\"\n    }\n  ],\n  \"max_tokens\": 500,\n  \"temperature\": 0.2,\n  \"response_format\": { \"type\": \"json_object\" }\n}",
        "options": {}
      },
      "id": "school-ai-summary",
      "name": "Generate School Summary",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        672,
        0
      ]
    },
    {
      "parameters": {
        "jsCode": "\nconst raw = $input.first().json?.choices?.[0]?.message?.content || '{}';\nconst meta = $('Build Paperless Update').first().json;\nlet parsed;\ntry {\n  parsed = JSON.parse(raw);\n} catch (error) {\n  parsed = {\n    summary: 'School document ingested and tagged. Automated summary parsing failed, so this note was kept minimal.',\n    course_context: [],\n    suggested_tags: []\n  };\n}\nconst contextLines = [\n  `- Course: ${meta.class_name || 'Unknown'}`,\n  meta.assignment_name ? `- D2L assignment: ${meta.assignment_name}` : null,\n  meta.submission_kind ? `- Submission kind: ${meta.submission_kind}` : null,\n  ...(Array.isArray(parsed.course_context) ? parsed.course_context.filter(Boolean).map(v => `- ${String(v).replace(/^[-•]\\s*/, '').trim()}`) : [])\n].filter(Boolean);\nconst note = [\n  '**School Intake Summary**',\n  ...contextLines,\n  '',\n  '**Summary**',\n  String(parsed.summary || '').trim() || 'No summary returned.'\n].join('\\n');\nconst aiTags = Array.isArray(parsed.suggested_tags)\n  ? [...new Set(parsed.suggested_tags.map(t => String(t || '').trim().toLowerCase()).filter(Boolean))].slice(0, 6)\n  : [];\nreturn [{ json: { ...meta, note, ai_suggested_tags: aiTags } }];"
      },
      "id": "school-parse-summary",
      "name": "Parse School Summary",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        864,
        0
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "={{($env.PAPERLESS_BASE_URL || 'https://paperless.paccoco.com').replace(/\\/$/, '') + '/api/documents/' + $json.document_id + '/notes/'}}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "={{'Token ' + $env.PAPERLESS_API_TOKEN}}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "Accept",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {}
          ]
        },
        "options": {
          "timeout": 120000
        }
      },
      "id": "add-school-note",
      "name": "Add School Note",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        1040,
        0
      ]
    }
  ],
  "connections": {
    "Paperless School Webhook": {
      "main": [
        [
          {
            "node": "Normalize Paperless Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize Paperless Webhook": {
      "main": [
        [
          {
            "node": "Fetch Paperless Document",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Paperless Document": {
      "main": [
        [
          {
            "node": "Extract Intake Metadata",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Intake Metadata": {
      "main": [
        [
          {
            "node": "Build Paperless Update",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Paperless Update": {
      "main": [
        [
          {
            "node": "Update Paperless Document",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Paperless Document": {
      "main": [
        [
          {
            "node": "Generate School Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate School Summary": {
      "main": [
        [
          {
            "node": "Parse School Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse School Summary": {
      "main": [
        [
          {
            "node": "Add School Note",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add School Note": {
      "main": [
        [
          {
            "node": "Return Enrichment Success",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1",
    "binaryMode": "separate"
  },
  "staticData": null,
  "meta": null,
  "pinData": {},
  "versionId": "c7771791-a51a-4750-b99c-ea263463ac51",
  "activeVersionId": "c7771791-a51a-4750-b99c-ea263463ac51",
  "versionCounter": 51,
  "triggerCount": 1,
  "shared": [
    {
      "updatedAt": "2026-05-13T21:26:54.606Z",
      "createdAt": "2026-05-13T21:26:54.606Z",
      "role": "workflow:owner",
      "workflowId": "7MlM3DjAMf4eSl0s",
      "projectId": "dxCRnBdX5uJizCGa",
      "project": {
        "updatedAt": "2026-05-06T01:10:37.484Z",
        "createdAt": "2026-05-06T01:08:07.721Z",
        "id": "dxCRnBdX5uJizCGa",
        "name": "Wilfred Fizzlepoof <admin@paccoco.com>",
        "type": "personal",
        "icon": null,
        "description": null,
        "creatorId": "47b2227f-2fc2-4a08-bd35-ea157b92df0d"
      }
    }
  ],
  "tags": [],
  "activeVersion": {
    "updatedAt": "2026-05-22T21:55:07.381Z",
    "createdAt": "2026-05-22T21:55:07.381Z",
    "versionId": "c7771791-a51a-4750-b99c-ea263463ac51",
    "workflowId": "7MlM3DjAMf4eSl0s",
    "nodes": [
      {
        "parameters": {
          "httpMethod": "POST",
          "path": "school/intake/paperless-enrich",
          "responseMode": "lastNode",
          "responseData": "allEntries",
          "options": {}
        },
        "id": "paperless-school-webhook",
        "name": "Paperless School Webhook",
        "type": "n8n-nodes-base.webhook",
        "typeVersion": 2,
        "position": [
          -1168,
          0
        ],
        "webhookId": "22ec3671-3ad9-4c48-8720-2ba31b944671"
      },
      {
        "parameters": {
          "jsCode": "\nconst input = $input.first().json || {};\nconst body = input.body || {};\nconst query = input.query || {};\nconst params = input.params || {};\nconst headers = input.headers || {};\nconst candidates = [\n  body.document_id,\n  body.id,\n  body.doc_id,\n  body.pk,\n  body.document_id?.id,\n  body.document?.id,\n  body.document,\n  query.document_id,\n  query.id,\n  query.doc_id,\n  params.document_id,\n  params.id,\n  headers['x-paperless-document-id'],\n  input.document_id,\n  input.id\n].filter(v => v !== undefined && v !== null && v !== '');\nlet raw = candidates[0];\nif (typeof raw === 'object' && raw !== null) raw = raw.id ?? raw.document_id ?? raw.pk ?? null;\nif (typeof raw === 'string' && /\\{.+\\}/.test(raw)) {\n  throw new Error('Received unresolved template string instead of document id.');\n}\nconst documentId = Number(raw);\nif (!Number.isFinite(documentId) || documentId <= 0) {\n  throw new Error('Could not resolve Paperless document id from webhook payload.');\n}\nreturn [{ json: { document_id: documentId } }];"
        },
        "id": "normalize-paperless-webhook",
        "name": "Normalize Paperless Webhook",
        "type": "n8n-nodes-base.code",
        "typeVersion": 2,
        "position": [
          -896,
          0
        ]
      },
      {
        "parameters": {
          "url": "={{($env.PAPERLESS_BASE_URL || 'https://paperless.paccoco.com').replace(/\\/$/, '') + '/api/documents/' + $json.document_id + '/'}}",
          "sendHeaders": true,
          "headerParameters": {
            "parameters": [
              {
                "name": "Authorization",
                "value": "={{'Token ' + $env.PAPERLESS_API_TOKEN}}"
              },
              {
                "name": "Accept",
                "value": "application/json"
              }
            ]
          },
          "options": {
            "timeout": 120000
          }
        },
        "id": "fetch-paperless-document",
        "name": "Fetch Paperless Document",
        "type": "n8n-nodes-base.httpRequest",
        "typeVersion": 4.2,
        "position": [
          -640,
          0
        ]
      },
      {
        "parameters": {
          "jsCode": "\nconst doc = $input.first().json || {};\nconst originalFilename = doc.original_file_name || doc.original_filename || '';\nconst baseName = String(originalFilename).replace(/\\.[^.]+$/, '');\nconst currentTitle = String(doc.title || '').trim();\nconst parts = currentTitle.split(' — ').map((p) => p.trim()).filter(Boolean);\nconst class_name = parts.length >= 3 ? parts[0] : null;\nconst submission_kind = parts.length >= 3 ? parts[parts.length - 1] : null;\nconst assignment_name = parts.length >= 3 ? parts.slice(1, -1).join(' — ') : null;\nreturn [{ json: {\n  intake_id: baseName && baseName.startsWith('school-') ? baseName : null,\n  document_id: doc.id,\n  current_title: currentTitle,\n  current_tags: Array.isArray(doc.tags) ? doc.tags : [],\n  original_filename: originalFilename,\n  class_name,\n  assignment_name,\n  submission_kind\n} }];"
        },
        "id": "extract-intake-id",
        "name": "Extract Intake Metadata",
        "type": "n8n-nodes-base.code",
        "typeVersion": 2,
        "position": [
          -384,
          0
        ]
      },
      {
        "parameters": {
          "jsCode": "\nconst intake = $input.first().json || {};\nconst doc = $('Fetch Paperless Document').first().json || {};\nconst classTagMap = JSON.parse($env.PAPERLESS_TAG_CLASS_MAP_JSON || '{}');\nconst kindTagMap = JSON.parse($env.PAPERLESS_TAG_SUBMISSION_KIND_MAP_JSON || '{}');\nconst classCorrespondentMap = JSON.parse($env.PAPERLESS_CORRESPONDENT_CLASS_MAP_JSON || '{}');\nconst currentTags = Array.isArray(doc.tags) ? doc.tags.map(Number).filter(Number.isFinite) : [];\nconst merged = new Set(currentTags);\nfor (const id of [$env.PAPERLESS_TAG_SCHOOL, $env.PAPERLESS_TAG_ASSIGNMENTS, $env.PAPERLESS_TAG_TELEGRAM]) {\n  const n = Number(id);\n  if (Number.isFinite(n) && n > 0) merged.add(n);\n}\nconst classTag = Number(classTagMap[intake.class_name]);\nif (Number.isFinite(classTag) && classTag > 0) merged.add(classTag);\nconst kindKey = String(intake.submission_kind || '').trim().toLowerCase();\nconst kindTag = Number(kindTagMap[kindKey]);\nif (Number.isFinite(kindTag) && kindTag > 0) merged.add(kindTag);\nconst title = intake.current_title || [intake.class_name, intake.assignment_name, intake.submission_kind].filter(Boolean).join(' — ');\nconst payload = { title, tags: Array.from(merged) };\nconst correspondent = Number(classCorrespondentMap[intake.class_name]);\nif (Number.isFinite(correspondent) && correspondent > 0) payload.correspondent = correspondent;\nreturn [{ json: {\n  intake_id: intake.intake_id,\n  document_id: doc.id,\n  payload,\n  title,\n  final_tag_ids: payload.tags,\n  class_name: intake.class_name,\n  assignment_name: intake.assignment_name,\n  submission_kind: intake.submission_kind,\n  original_filename: intake.original_filename,\n  content: String(doc.content || '').slice(0, 12000),\n  created: doc.created || null,\n  status: 'enriched'\n} }];"
        },
        "id": "build-paperless-update",
        "name": "Build Paperless Update",
        "type": "n8n-nodes-base.code",
        "typeVersion": 2,
        "position": [
          144,
          0
        ]
      },
      {
        "parameters": {
          "method": "PATCH",
          "url": "={{($env.PAPERLESS_BASE_URL || 'https://paperless.paccoco.com').replace(/\\/$/, '') + '/api/documents/' + $json.document_id + '/'}}",
          "sendHeaders": true,
          "headerParameters": {
            "parameters": [
              {
                "name": "Authorization",
                "value": "={{'Token ' + $env.PAPERLESS_API_TOKEN}}"
              },
              {
                "name": "Content-Type",
                "value": "application/json"
              },
              {
                "name": "Accept",
                "value": "application/json"
              }
            ]
          },
          "sendBody": true,
          "bodyParameters": {
            "parameters": [
              {}
            ]
          },
          "options": {
            "timeout": 120000
          }
        },
        "id": "update-paperless-document",
        "name": "Update Paperless Document",
        "type": "n8n-nodes-base.httpRequest",
        "typeVersion": 4.2,
        "position": [
          400,
          0
        ]
      },
      {
        "parameters": {
          "jsCode": "\nconst update = $('Parse School Summary').first().json;\nreturn [{ json: {\n  ok: true,\n  intake_id: update.intake_id,\n  document_id: update.document_id,\n  title: update.title,\n  final_tag_ids: update.final_tag_ids,\n  ai_suggested_tags: update.ai_suggested_tags || [],\n  status: update.status || 'enriched'\n} }];"
        },
        "id": "return-enrichment-success",
        "name": "Return Enrichment Success",
        "type": "n8n-nodes-base.code",
        "typeVersion": 2,
        "position": [
          1216,
          0
        ]
      },
      {
        "parameters": {
          "method": "POST",
          "url": "http://10.5.30.6:4000/v1/chat/completions",
          "sendHeaders": true,
          "headerParameters": {
            "parameters": [
              {
                "name": "Content-Type",
                "value": "application/json"
              },
              {
                "name": "Authorization",
                "value": "={{'Bearer ' + $env.LITELLM_API_KEY}}"
              }
            ]
          },
          "sendBody": true,
          "specifyBody": "json",
          "jsonBody": "={\n  \"model\": \"medium\",\n  \"messages\": [\n    {\n      \"role\": \"system\",\n      \"content\": \"You write concise, useful summaries for school assignments stored in Paperless. Return ONLY valid JSON with this exact shape: {\\\"summary\\\": string, \\\"course_context\\\": [string], \\\"suggested_tags\\\": [string]}. Summary should be 2-4 sentences, name the argument or subject clearly, and avoid fluff. course_context should contain short bullets like assignment type, score if known, or class framing when inferable from the provided metadata. suggested_tags should be 3-6 lowercase tags focused on subject matter, not generic words. No markdown, no code fences.\"\n    },\n    {\n      \"role\": \"user\",\n      \"content\": \"={{ JSON.stringify('Title: ' + ($json.title || '') + '\\nClass: ' + ($json.class_name || '') + '\\nAssignment: ' + ($json.assignment_name || '') + '\\nSubmission kind: ' + ($json.submission_kind || '') + '\\nOriginal filename: ' + ($json.original_filename || '') + '\\n\\nDocument content:\\n' + ($json.content || '')).slice(1, -1) }}\"\n    }\n  ],\n  \"max_tokens\": 500,\n  \"temperature\": 0.2,\n  \"response_format\": { \"type\": \"json_object\" }\n}",
          "options": {}
        },
        "id": "school-ai-summary",
        "name": "Generate School Summary",
        "type": "n8n-nodes-base.httpRequest",
        "typeVersion": 4.2,
        "position": [
          672,
          0
        ]
      },
      {
        "parameters": {
          "jsCode": "\nconst raw = $input.first().json?.choices?.[0]?.message?.content || '{}';\nconst meta = $('Build Paperless Update').first().json;\nlet parsed;\ntry {\n  parsed = JSON.parse(raw);\n} catch (error) {\n  parsed = {\n    summary: 'School document ingested and tagged. Automated summary parsing failed, so this note was kept minimal.',\n    course_context: [],\n    suggested_tags: []\n  };\n}\nconst contextLines = [\n  `- Course: ${meta.class_name || 'Unknown'}`,\n  meta.assignment_name ? `- D2L assignment: ${meta.assignment_name}` : null,\n  meta.submission_kind ? `- Submission kind: ${meta.submission_kind}` : null,\n  ...(Array.isArray(parsed.course_context) ? parsed.course_context.filter(Boolean).map(v => `- ${String(v).replace(/^[-•]\\s*/, '').trim()}`) : [])\n].filter(Boolean);\nconst note = [\n  '**School Intake Summary**',\n  ...contextLines,\n  '',\n  '**Summary**',\n  String(parsed.summary || '').trim() || 'No summary returned.'\n].join('\\n');\nconst aiTags = Array.isArray(parsed.suggested_tags)\n  ? [...new Set(parsed.suggested_tags.map(t => String(t || '').trim().toLowerCase()).filter(Boolean))].slice(0, 6)\n  : [];\nreturn [{ json: { ...meta, note, ai_suggested_tags: aiTags } }];"
        },
        "id": "school-parse-summary",
        "name": "Parse School Summary",
        "type": "n8n-nodes-base.code",
        "typeVersion": 2,
        "position": [
          864,
          0
        ]
      },
      {
        "parameters": {
          "method": "POST",
          "url": "={{($env.PAPERLESS_BASE_URL || 'https://paperless.paccoco.com').replace(/\\/$/, '') + '/api/documents/' + $json.document_id + '/notes/'}}",
          "sendHeaders": true,
          "headerParameters": {
            "parameters": [
              {
                "name": "Authorization",
                "value": "={{'Token ' + $env.PAPERLESS_API_TOKEN}}"
              },
              {
                "name": "Content-Type",
                "value": "application/json"
              },
              {
                "name": "Accept",
                "value": "application/json"
              }
            ]
          },
          "sendBody": true,
          "bodyParameters": {
            "parameters": [
              {}
            ]
          },
          "options": {
            "timeout": 120000
          }
        },
        "id": "add-school-note",
        "name": "Add School Note",
        "type": "n8n-nodes-base.httpRequest",
        "typeVersion": 4.2,
        "position": [
          1040,
          0
        ]
      }
    ],
    "connections": {
      "Paperless School Webhook": {
        "main": [
          [
            {
              "node": "Normalize Paperless Webhook",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Normalize Paperless Webhook": {
        "main": [
          [
            {
              "node": "Fetch Paperless Document",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Fetch Paperless Document": {
        "main": [
          [
            {
              "node": "Extract Intake Metadata",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Extract Intake Metadata": {
        "main": [
          [
            {
              "node": "Build Paperless Update",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Build Paperless Update": {
        "main": [
          [
            {
              "node": "Update Paperless Document",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Update Paperless Document": {
        "main": [
          [
            {
              "node": "Generate School Summary",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Generate School Summary": {
        "main": [
          [
            {
              "node": "Parse School Summary",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Parse School Summary": {
        "main": [
          [
            {
              "node": "Add School Note",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Add School Note": {
        "main": [
          [
            {
              "node": "Return Enrichment Success",
              "type": "main",
              "index": 0
            }
          ]
        ]
      }
    },
    "authors": "Wilfred Fizzlepoof",
    "name": null,
    "description": null,
    "autosaved": false,
    "workflowPublishHistory": [
      {
        "createdAt": "2026-05-22T21:55:07.444Z",
        "id": 321,
        "workflowId": "7MlM3DjAMf4eSl0s",
        "versionId": "c7771791-a51a-4750-b99c-ea263463ac51",
        "event": "deactivated",
        "userId": "47b2227f-2fc2-4a08-bd35-ea157b92df0d"
      },
      {
        "createdAt": "2026-05-22T21:55:07.467Z",
        "id": 322,
        "workflowId": "7MlM3DjAMf4eSl0s",
        "versionId": "c7771791-a51a-4750-b99c-ea263463ac51",
        "event": "activated",
        "userId": "47b2227f-2fc2-4a08-bd35-ea157b92df0d"
      }
    ]
  }
}
