@ironfang/n8n-nodes-ironfang 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,12 +2,17 @@
2
2
 
3
3
  # @ironfang/n8n-nodes-ironfang
4
4
 
5
- Use Renderwolf, Financewolf, Auditwolf and Ironfang's public developer tools in
6
- n8n. The Ironfang action node has **103 operations**, grouped by product. Ironfang
7
- Trigger receives signed Auditwolf and Renderwolf events.
8
-
9
- **Release: 0.3.0.** This version includes the product expansion and signed event
10
- trigger described below, plus the maintenance fixes from 0.2.3.
5
+ Use Ironfang Render, Finance, Audit and Rig, and Ironfang's public developer
6
+ tools, in n8n. The Ironfang action node has **162 operations**, grouped by
7
+ product. Ironfang Trigger receives signed Audit, Finance and Render events.
8
+
9
+ **Release: 0.4.0.** The products are named Ironfang Render, Finance and Audit
10
+ (formerly Renderwolf, Financewolf and Auditwolf), and the node follows: requests
11
+ go to the `/render`, `/finance` and `/audit` API prefixes and scopes are shown as
12
+ `render:*`, `finance:*` and `audit:*`. It adds Ironfang Rig, Finance jobs,
13
+ batches, destinations, deliveries, signed reports and PDFs, the newer Audit and
14
+ Render lists, and paging for Audit lists. Saved workflows and credentials need no
15
+ change; see [Compatibility with earlier names](#compatibility-with-earlier-names).
11
16
 
12
17
  ## Installation and credentials
13
18
 
@@ -18,36 +23,40 @@ npm publishing and automated checks do not establish that approval.
18
23
 
19
24
  Create an `if_live_` platform API key at [portal.ironfang.uk](https://portal.ironfang.uk)
20
25
  with the scopes your workflow needs, then select an Ironfang API credential.
21
- Existing `rw_live_` Renderwolf keys and both origin-only and `/renderwolf` base
26
+ Existing `rw_live_` Render keys and both origin-only and `/renderwolf` base
22
27
  URLs remain supported. Other product bases and custom gateway prefixes work too.
23
28
  A successful credential test confirms authentication by a product, including
24
29
  an explicit scope refusal; it does not grant other operation permissions.
25
30
 
26
- Public tools need no credential. Financewolf validation, generation and ruleset
27
- reads offer an explicit **Public** mode; saved results require authentication.
28
- An invalid API key never falls back to public access. Public Financewolf calls
29
- cannot use idempotency keys or access an organisation's retained results.
31
+ Public tools need no credential. Finance validation, generation, ruleset reads
32
+ and signed-report verification offer an explicit **Public** mode; saved results
33
+ require authentication. An invalid API key never falls back to public access.
34
+ Public Finance calls cannot use idempotency keys or access an organisation's
35
+ retained results.
30
36
 
31
37
  ## Products and operations
32
38
 
33
39
  | Resource | Operations |
34
40
  | --- | --- |
35
- | Renderwolf | Screenshot, PDF, template image, video clip, signed URL, usage, QR, site preview, templates, jobs, batches, capabilities, request history, destinations and deliveries |
36
- | Financewolf | Validate XML; generate a validated UBL invoice or credit note; list/get rulesets; list/get/delete saved results |
37
- | Auditwolf | Sites, audits, pages, findings and decisions, rules and rule packs, monitors, changes and comparisons, evidence, artifacts, export destinations/jobs, webhooks and deliveries, events and usage |
41
+ | Render | Screenshot, PDF, template image, video clip, signed URL, usage, QR, site preview, templates, jobs, batches and their lists, capabilities, request history, destinations and deliveries |
42
+ | Finance | Validate XML; generate a validated UBL invoice or credit note; async jobs and ordered batches; webhook and S3 destinations, deliveries and retries; signed reports and their verification; readable PDFs of saved generations; list/get rulesets; list/get/delete saved results; usage |
43
+ | Audit | Sites, audits, pages, findings and decisions, rules and rule packs, monitors across the organisation or a site, changes and comparisons, evidence, artifacts, export destinations/jobs, webhooks and deliveries across the organisation or an endpoint, events and usage |
44
+ | Rig | Projects, suites and versions; runs, holds and receipts; email, callback, mock and connector resources; mock rules; faults; the event timeline, waits, payloads and callback replay; evidence bundles; usage and environment |
38
45
  | Public Tool | Image conversion, favicon ZIP, QR generation and verification, UUID generation and inspection, free screenshot |
39
46
 
40
47
  The [operation reference](docs/operations.md) lists each action's endpoint,
41
48
  permission, query fields and request example. Complex API bodies use a JSON
42
49
  editor so nested fields remain available. Replace the example values before
43
50
  running a write operation. Request definitions are available in the product
44
- specifications: [Renderwolf](https://api.ironfang.uk/renderwolf/openapi.yaml),
45
- [Financewolf](https://api.ironfang.uk/financewolf/openapi.yaml),
46
- [Auditwolf](https://api.ironfang.uk/auditwolf/openapi.yaml).
51
+ specifications: [Render](https://api.ironfang.uk/render/openapi.yaml),
52
+ [Finance](https://api.ironfang.uk/finance/openapi.yaml),
53
+ [Audit](https://api.ironfang.uk/audit/openapi.yaml),
54
+ [Rig](https://api.ironfang.uk/rig/openapi.yaml).
47
55
 
48
56
  Screenshots support PNG/JPEG/WebP and phone/tablet device presets. Advanced
49
- Render Options accepts waits, blocking, selectors, request headers, cookies,
50
- user agent and pixel density. For PDFs it also accepts `paper_format` and
57
+ Render Options accepts custom `css`, a page `script`, ordered `actions` (click,
58
+ hover, wait for a selector, delay), waits, blocking, selectors, request headers,
59
+ cookies, user agent and pixel density. For PDFs it also accepts `paper_format` and
51
60
  `margin` (numeric inches); screenshot region capture uses `clip`. For template images it accepts
52
61
  inline `qr` variables. The source and template variables have their own fields.
53
62
  The template picker loads pages without HTML and requires template-read scope;
@@ -55,26 +64,46 @@ entering a template ID directly needs only render scope.
55
64
 
56
65
  Job and batch submission require a stable idempotency key. Get the returned ID,
57
66
  use n8n's Wait node between status checks, then Download Job Result. Signed result
58
- URLs are validated against the configured Renderwolf endpoint and downloaded
67
+ URLs are validated against the configured Render endpoint and downloaded
59
68
  without an API key. Site Preview returns the MP4 in the selected binary field
60
69
  and a JPEG in `poster`. A result download can return this same two-file bundle.
61
70
 
62
- Financewolf Validate accepts XML text or an n8n binary field, including filesystem
71
+ Finance Validate accepts XML text or an n8n binary field, including filesystem
63
72
  and external binary storage. A standards-invalid invoice is a normal result:
64
73
  branch on `outcome`, rather than treating HTTP 200 as an invoice approval.
65
74
  Generation requires explicit ruleset/profile selectors and preserves decimal
66
75
  strings. It returns validation metadata and XML binary data after checking the
67
76
  artifact's byte count and SHA-256. Authenticated artifacts/findings are retained
68
- by Financewolf for 30 days; deletion does not remove n8n's own execution records.
69
-
70
- Paginated templates, jobs, deliveries, request history, Financewolf results,
71
- Auditwolf findings and page observations have Return All, Limit and starting
72
- cursor/offset controls. Each row becomes an output item with its input link.
73
- Other list actions retain the API's JSON envelope and API-imposed result caps.
74
- Pagination stops at 1,000 pages and refuses repeated cursors.
75
-
76
- S3 destination creation reads secret fields from an **Ironfang S3 Destination**
77
- credential. Do not put them in Request Body JSON. Its connection check validates
77
+ by Finance for 30 days; deletion does not remove n8n's own execution records.
78
+
79
+ Finance jobs and batches run validation or generation asynchronously: create one
80
+ with a stable idempotency key, poll it with n8n's Wait node, or register a
81
+ destination and let Ironfang Trigger receive the signed result. Download Signed
82
+ Report and Render E-Invoice PDF return files for a saved result's
83
+ `operation_id`; Verify Signed Report takes the report ZIP from a binary field
84
+ and needs no key. `verified` means the report is intact, not that the invoice
85
+ is valid: read `invoice_outcome` as well.
86
+
87
+ Rig drives an integration test run from a workflow: start a run for a suite,
88
+ allocate inboxes, callback URLs and mocks, arm faults, and use Wait For Event to
89
+ hold until your system under test has called in. A wait that times out is an
90
+ ordinary result with `matched: false`; continue from `next_since`. The node
91
+ allows a wait its full 90 seconds. Export Run Evidence returns the ZIP bundle.
92
+ Create Connector returns a one-time bootstrap token in its output.
93
+
94
+ Paginated lists have Return All, Limit and a starting cursor, offset or
95
+ sequence. Each row becomes an output item with its input link. Audit lists that
96
+ were released without paging (audits, audit pages, finding events, rule
97
+ revisions, exports, monitor runs and an endpoint's deliveries) page from node
98
+ version 1.2; in workflows saved with an earlier version they keep returning the
99
+ API's single JSON response, which now carries `next_cursor`. Re-add the node to
100
+ move a saved workflow to paged output. Other list actions retain the API's JSON
101
+ envelope and API-imposed result caps. Pagination stops at 1,000 pages and
102
+ refuses repeated cursors.
103
+
104
+ S3 destination creation for Render, Finance and Audit reads secret fields from
105
+ an **Ironfang S3 Destination** credential; Finance Update Destination replaces
106
+ stored keys the same way. Do not put them in Request Body JSON. Its connection check validates
78
107
  that fields are present; the product's Test Destination operation verifies
79
108
  actual S3 access once the bucket/region are registered. One-time webhook secrets
80
109
  returned by creation/rotation need to be saved securely; n8n execution retention
@@ -84,45 +113,53 @@ also applies to these outputs.
84
113
 
85
114
  | Actions | API key scopes |
86
115
  | --- | --- |
87
- | Renderwolf rendering, jobs/batches, delivery reads | `renderwolf:render` |
88
- | Signed URL | `renderwolf:sign` |
89
- | Templates | `renderwolf:templates:read` / `renderwolf:templates:write` |
90
- | Usage and request history | `renderwolf:usage:read` |
91
- | Destinations and redelivery | `renderwolf:destinations` |
92
- | Financewolf validation/generation/result deletion | `financewolf:einvoices:write` |
93
- | Financewolf saved result reads | `financewolf:einvoices:read` |
94
- | Financewolf authenticated ruleset reads | `financewolf:einvoices:rulesets:read` |
95
- | Auditwolf reads / running audits / managing resources | `auditwolf:read` / `auditwolf:run` / `auditwolf:manage` |
96
- | Auditwolf evidence and artifacts | `auditwolf:evidence` |
97
- | Auditwolf webhooks and exports | `auditwolf:integrations` |
98
-
99
- Renderwolf includes **250 free credits each month**, with no card required.
116
+ | Render rendering, jobs/batches, delivery reads | `render:render` |
117
+ | Signed URL | `render:sign` |
118
+ | Templates | `render:templates:read` / `render:templates:write` |
119
+ | Usage and request history | `render:usage:read` |
120
+ | Destinations and redelivery | `render:destinations` |
121
+ | Finance validation, generation, jobs, batches, result deletion | `finance:einvoices:write` |
122
+ | Finance saved results, job/batch/delivery reads, reports and PDFs | `finance:einvoices:read` |
123
+ | Finance authenticated ruleset reads | `finance:einvoices:rulesets:read` |
124
+ | Finance destinations and delivery retries | `finance:einvoices:destinations:manage` |
125
+ | Finance usage | `finance:billing:manage` |
126
+ | Audit reads / running audits / managing resources | `audit:read` / `audit:run` / `audit:manage` |
127
+ | Audit evidence and artifacts | `audit:evidence` |
128
+ | Audit webhooks and exports | `audit:integrations` |
129
+ | Rig reads, waits and evidence / projects and suites / runs, resources and faults / connectors | `rig:read` / `rig:write` / `rig:run` / `rig:connector` |
130
+
131
+ Keys created with the earlier `renderwolf:*`, `financewolf:*` and `auditwolf:*`
132
+ scopes keep working: the platform treats them as the scopes above.
133
+
134
+ Render includes **250 free credits each month**, with no card required.
100
135
  A screenshot or template image costs 1 credit, a PDF 2, and QR codes 0. Clip
101
136
  costs depend on duration and output size. Cache hits consume no credits.
102
- Free renders can carry a Renderwolf badge; QR codes never carry one. This
103
- allowance belongs to Renderwolf; other products have their own usage policies.
137
+ Free renders can carry an Ironfang Render badge; QR codes never carry one. This
138
+ allowance belongs to Render; other products have their own usage policies.
104
139
 
105
140
  Public tools use no account credits and share a 60/minute/address limit. The
106
141
  public screenshot service also has a 20/hour/address limit and a shared daily
107
142
  ceiling. Shared n8n egress addresses share these limits. Use authenticated
108
- Renderwolf rendering for account-based automation.
143
+ Render rendering for account-based automation.
109
144
 
110
- Billing changes, administration, unreleased Peppol transport/registration,
111
- Financewolf PDFs and Financial Promotions are outside this package.
145
+ Billing changes, administration, unreleased Peppol transport/registration
146
+ and Financial Promotions are outside this package.
112
147
 
113
148
  ## Signed event trigger
114
149
 
115
150
  1. Add **Ironfang Trigger** and copy its production webhook URL.
116
- 2. Use Auditwolf Create Webhook or Renderwolf Create Destination to register
117
- that URL and the events you want.
151
+ 2. Use Audit Create Webhook, or Finance or Render Create Destination, to
152
+ register that URL and the events you want.
118
153
  3. Save the returned secret in an **Ironfang Webhook API** credential. Select
119
154
  its product, attach it to the trigger, and activate the workflow.
120
155
  4. Run Test Webhook/Test Destination to send a signed test event.
121
156
 
122
157
  The trigger verifies HMAC-SHA256 over the timestamp and exact body bytes using
123
158
  constant-time comparison, accepts timestamps within five minutes, and rejects
124
- invalid signatures before starting a workflow. Renderwolf secrets are decoded
125
- from hex; Auditwolf secrets are used as returned. The signed event ID, rather
159
+ invalid signatures before starting a workflow. Render and Finance secrets are
160
+ decoded from hex; Audit secrets are used as returned. Deliveries are signed in
161
+ the `Renderwolf-`, `Financewolf-` and `Auditwolf-` headers the products launched
162
+ with; the trigger reads the ones for the credential's product. The signed event ID, rather
126
163
  than the unsigned header ID, is used for duplicate detection.
127
164
 
128
165
  Duplicate state covers seven days/up to 10,000 IDs in n8n workflow static data.
@@ -136,30 +173,49 @@ deleting the n8n workflow removes its local listener; disable/delete the product
136
173
  endpoint separately to stop deliveries. Rotating an endpoint secret requires
137
174
  updating the n8n credential.
138
175
 
176
+ The required `checkExists`, `create` and `delete` lifecycle hooks acknowledge
177
+ this external setup. They do not call the product management API or verify
178
+ remote registration. Use Test Webhook/Test Destination to check delivery.
179
+
180
+ ## Compatibility with earlier names
181
+
182
+ Nothing saved needs editing. Workflows store the resource as `renderwolf`,
183
+ `financewolf` or `auditwolf`, and webhook credentials store the same product
184
+ values; these identifiers are unchanged and only their labels are new. A
185
+ credential whose base URL is an origin, `/renderwolf` or any other product path
186
+ is routed to the current prefix for the operation. The API still answers the
187
+ earlier prefixes, but its own links (for example a job result's signed download
188
+ location) use the current ones, which is why 0.3.1 and earlier fail Download Job
189
+ Result against the current API: upgrade to fix it.
190
+
139
191
  ## Outputs, examples and compatibility
140
192
 
141
- Existing Renderwolf version 1 workflows retain string `bytes` and `error`
142
- fields. Version 1.1 uses numeric `bytes` and structured errors. Both expose exact
193
+ Existing version 1 workflows retain string `bytes` and `error`
194
+ fields. Version 1.1 uses numeric `bytes` and structured errors; version 1.2 adds
195
+ paging to the Audit lists named above and is otherwise identical. All expose exact
143
196
  `byteLength`, item links and `_ironfang` response metadata when available:
144
197
  request ID, HTTP status, cache status and charged credits. Continued errors
145
198
  include available problem codes and retry information. New file operations use
146
199
  numeric sizes; the output binary field defaults to `data`.
147
200
 
148
- Requests have explicit timeouts: 30 seconds for JSON and 120 seconds for binary
149
- rendering. The node does not automatically repeat a paid operation. Reuse the
201
+ Requests have explicit timeouts: 30 seconds for JSON (100 for a Rig wait) and
202
+ 120 seconds for binary rendering. The node does not automatically repeat a paid operation. Reuse the
150
203
  same idempotency key only for an identical business operation and respect
151
204
  returned retry information when configuring n8n retries.
152
205
 
153
206
  Import the [template render](examples/template-image.json),
154
207
  [invoice validation](examples/invoice-validation.json),
155
- [invoice generation to storage](examples/invoice-generation-storage.json), or
156
- [audit status polling](examples/audit-polling.json) workflow. Select credentials
208
+ [invoice generation to storage](examples/invoice-generation-storage.json),
209
+ [invoice job and signed report](examples/invoice-job-report.json) (one pause
210
+ before reading the job; loop as the audit example does for larger documents),
211
+ [audit status polling](examples/audit-polling.json), or
212
+ [Rig run with a callback wait](examples/rig-callback-wait.json) workflow. Select credentials
157
213
  and replace placeholder IDs, bucket names and example invoice data before running.
158
214
  All examples are inactive on import.
159
215
 
160
216
  The tested n8n runtime is **2.38.1**, using its filesystem binary storage.
161
- Compilation/lint/unit checks run under Node.js 22 and 24. Saved version 1 and
162
- 1.1 workflows are exercised; older n8n host releases are not certified by this
217
+ Compilation/lint/unit checks run under Node.js 22 and 24. Saved version 1, 1.1
218
+ and 1.2 workflows are exercised; older n8n host releases are not certified by this
163
219
  matrix. The published node has no external runtime dependencies.
164
220
 
165
221
  ## Development and releases
@@ -168,9 +224,13 @@ Run `npm ci --ignore-scripts` and `npm run check`. With Docker, run
168
224
  `bash scripts/check-runtime.sh` and `bash scripts/check-webhook-runtime.sh`.
169
225
  These execute local fixtures, including multipart/file handling and signed
170
226
  webhooks; they make no paid API calls. CI requires both before release.
227
+ Lint runs with inline configuration disabled, matching the submission scanner's
228
+ handling of suppression comments. Shared code in `lib/` is also linted and packaged.
171
229
 
172
230
  To refresh the catalogue from an Ironfang source checkout, use
173
231
  `python3 scripts/sync-contracts.py /path/to/ironfang` (development-only PyYAML).
232
+ Catalogue `product` values are the saved resource identifiers; the script maps
233
+ each to its API prefix and scope family.
174
234
  Review endpoint handlers alongside OpenAPI changes. See [RELEASING.md](RELEASING.md)
175
235
  and the [validation record](docs/validation.md) for the release procedure and
176
236
  qualification of automated checks. License: MIT.
@@ -5,7 +5,7 @@ class IronfangApi {
5
5
  name = 'ironfangApi';
6
6
  icon = { light: 'file:ironfang.svg', dark: 'file:ironfang.dark.svg' };
7
7
  displayName = 'Ironfang API';
8
- documentationUrl = 'https://ironfang.uk/renderwolf/docs';
8
+ documentationUrl = 'https://ironfang.uk/render/docs';
9
9
  properties = [
10
10
  {
11
11
  displayName: 'API Key',
@@ -14,18 +14,18 @@ class IronfangApi {
14
14
  typeOptions: { password: true },
15
15
  default: '',
16
16
  required: true,
17
- description: 'An if_live_ platform API key from the Ironfang portal. Existing rw_live_ Renderwolf keys remain supported.',
17
+ description: 'An if_live_ platform API key from the Ironfang portal. Existing rw_live_ Render keys remain supported.',
18
18
  },
19
19
  {
20
20
  displayName: 'Base URL',
21
21
  name: 'baseUrl',
22
22
  type: 'string',
23
- default: 'https://api.ironfang.uk/renderwolf',
24
- description: 'API origin or product base URL. Both legacy origin-only and /renderwolf credentials remain valid; the node selects the requested product path.',
23
+ default: 'https://api.ironfang.uk/render',
24
+ description: 'API origin or product base URL. Origin-only and /renderwolf values saved by earlier versions remain valid; the node selects the requested product path.',
25
25
  },
26
26
  {
27
27
  displayName: 'Test Product', name: 'testProduct', type: 'options', default: 'auto',
28
- options: [{ name: 'Auto', value: 'auto' }, { name: 'Auditwolf', value: 'auditwolf' }, { name: 'Financewolf', value: 'financewolf' }, { name: 'Renderwolf', value: 'renderwolf' }],
28
+ options: [{ name: 'Auto', value: 'auto' }, { name: 'Audit', value: 'auditwolf' }, { name: 'Finance', value: 'financewolf' }, { name: 'Render', value: 'renderwolf' }, { name: 'Rig', value: 'rig' }],
29
29
  description: 'Choose a product for the read-only connection check, or discover which product accepts the key',
30
30
  },
31
31
  ];
@@ -5,9 +5,9 @@ class IronfangWebhookApi {
5
5
  name = 'ironfangWebhookApi';
6
6
  displayName = 'Ironfang Webhook API';
7
7
  icon = { light: 'file:ironfang.svg', dark: 'file:ironfang.dark.svg' };
8
- documentationUrl = 'https://ironfang.uk/auditwolf/docs';
8
+ documentationUrl = 'https://ironfang.uk/audit/docs';
9
9
  properties = [
10
- { displayName: 'Product', name: 'product', type: 'options', default: 'auditwolf', options: [{ name: 'Auditwolf', value: 'auditwolf' }, { name: 'Renderwolf', value: 'renderwolf' }] },
10
+ { displayName: 'Product', name: 'product', type: 'options', default: 'auditwolf', options: [{ name: 'Audit', value: 'auditwolf' }, { name: 'Finance', value: 'financewolf' }, { name: 'Render', value: 'renderwolf' }] },
11
11
  { displayName: 'Signing Secret', name: 'signingSecret', type: 'string', typeOptions: { password: true }, default: '', required: true, description: 'The one-time secret returned when creating the webhook endpoint or destination. This is not an API key.' },
12
12
  ];
13
13
  }
@@ -1,9 +1,9 @@
1
1
  import type { IExecuteFunctions, INodeExecutionData, INodeTypeDescription } from 'n8n-workflow';
2
- import { credentialTest } from './credentialTest';
2
+ import { credentialTest } from '../nodes/Ironfang/credentialTest';
3
3
  /**
4
4
  * Ironfang node. One node per vendor: pick a product with Resource, then an
5
- * operation within it. Renderwolf (https://ironfang.uk/renderwolf/docs) is the
6
- * first product; later ones are added as further resources rather than as
5
+ * operation within it. Ironfang Render (https://ironfang.uk/render/docs) was the
6
+ * first product, and its saved resource value keeps the name it launched under; later ones are added as further resources rather than as
7
7
  * separate nodes.
8
8
  *
9
9
  * Render operations return binary data; sign and usage return JSON.
@@ -2,12 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.renderwolf = void 0;
4
4
  const n8n_workflow_1 = require("n8n-workflow");
5
- const transport_1 = require("./transport");
6
- const credentialTest_1 = require("./credentialTest");
5
+ const transport_1 = require("../nodes/Ironfang/transport");
6
+ const credentialTest_1 = require("../nodes/Ironfang/credentialTest");
7
7
  /**
8
8
  * Ironfang node. One node per vendor: pick a product with Resource, then an
9
- * operation within it. Renderwolf (https://ironfang.uk/renderwolf/docs) is the
10
- * first product; later ones are added as further resources rather than as
9
+ * operation within it. Ironfang Render (https://ironfang.uk/render/docs) was the
10
+ * first product, and its saved resource value keeps the name it launched under; later ones are added as further resources rather than as
11
11
  * separate nodes.
12
12
  *
13
13
  * Render operations return binary data; sign and usage return JSON.
@@ -19,7 +19,7 @@ exports.renderwolf = {
19
19
  icon: { light: 'file:ironfang.svg', dark: 'file:ironfang.dark.svg' },
20
20
  usableAsTool: true,
21
21
  group: ['transform'],
22
- version: [1, 1.1],
22
+ version: [1, 1.1, 1.2],
23
23
  subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
24
24
  description: 'Rendering and developer APIs from Ironfang',
25
25
  defaults: { name: 'Ironfang' },
@@ -35,7 +35,7 @@ exports.renderwolf = {
35
35
  default: 'renderwolf',
36
36
  options: [
37
37
  {
38
- name: 'Renderwolf',
38
+ name: 'Render',
39
39
  value: 'renderwolf',
40
40
  description: 'Screenshots, PDFs and templated images',
41
41
  },
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Ironfang = void 0;
4
- const renderwolf_1 = require("./renderwolf");
4
+ const renderwolf_1 = require("../../lib/renderwolf");
5
5
  const catalog_1 = require("./catalog");
6
6
  const parameters_1 = require("./parameters");
7
7
  const execute_1 = require("./execute");
@@ -10,28 +10,49 @@ const templates_1 = require("./templates");
10
10
  const destinationCredentialTest_1 = require("./destinationCredentialTest");
11
11
  const legacy = renderwolf_1.renderwolf;
12
12
  const legacyOperations = (legacy.description.properties[1].options ?? []);
13
- const products = ['auditwolf', 'financewolf', 'renderwolf', 'tools'];
14
- // Resource-specific defaults are selected from the checked-in catalogue.
15
- // eslint-disable-next-line n8n-nodes-base/node-param-default-missing
16
- const operationParameters = products.map(product => ({
17
- displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true,
18
- default: product === 'renderwolf' ? 'screenshot' : catalog_1.operations.find(op => op.product === product).id,
19
- displayOptions: { show: { resource: [product] } },
20
- options: [...(product === 'renderwolf' ? legacyOperations : []), ...catalog_1.operations.filter(op => op.product === product).map(op => ({ name: op.name, value: op.id, description: op.description, action: op.description }))].sort((a, b) => a.name.localeCompare(b.name)),
21
- }));
13
+ function operationOptions(product) {
14
+ return [...(product === 'renderwolf' ? legacyOperations : []), ...catalog_1.operations.filter(op => op.product === product).map(op => ({ name: op.name, value: op.id, description: op.description, action: op.description }))].sort((a, b) => a.name.localeCompare(b.name));
15
+ }
16
+ const operationParameters = [
17
+ {
18
+ displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true,
19
+ default: 'archiveMonitorsByMonitorId', displayOptions: { show: { resource: ['auditwolf'] } },
20
+ options: operationOptions('auditwolf'),
21
+ },
22
+ {
23
+ displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true,
24
+ default: 'deleteValidationResult', displayOptions: { show: { resource: ['financewolf'] } },
25
+ options: operationOptions('financewolf'),
26
+ },
27
+ {
28
+ displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true,
29
+ default: 'screenshot', displayOptions: { show: { resource: ['renderwolf'] } },
30
+ options: operationOptions('renderwolf'),
31
+ },
32
+ {
33
+ displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true,
34
+ default: 'listRuns', displayOptions: { show: { resource: ['rig'] } },
35
+ options: operationOptions('rig'),
36
+ },
37
+ {
38
+ displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true,
39
+ default: 'convertImage', displayOptions: { show: { resource: ['tools'] } },
40
+ options: operationOptions('tools'),
41
+ },
42
+ ];
22
43
  class Ironfang {
23
44
  description = {
24
45
  ...legacy.description,
25
46
  usableAsTool: true,
26
47
  icon: { light: 'file:ironfang.svg', dark: 'file:ironfang.dark.svg' },
27
- subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
28
- description: 'Renderwolf, Financewolf, Auditwolf and public developer tools',
48
+ subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"].replace("wolf", "")}}',
49
+ description: 'Ironfang Render, Finance, Audit and Rig, and public developer tools',
29
50
  credentials: [
30
- { name: 'ironfangS3', required: true, testedBy: 'ironfangS3Test', displayOptions: { show: { operation: ['createDestination', 'createExportDestinations'] }, hide: { destinationType: ['webhook'] } } },
31
- { name: 'ironfangApi', required: true, testedBy: 'ironfangApiTest', displayOptions: { show: { resource: ['renderwolf', 'auditwolf', 'financewolf'] }, hide: { authentication: ['public'] } } },
51
+ { name: 'ironfangS3', required: true, testedBy: 'ironfangS3Test', displayOptions: { show: { operation: ['createDestination', 'createExportDestinations', 'createEinvoiceDestination', 'updateEinvoiceDestination'] }, hide: { destinationType: ['webhook'] } } },
52
+ { name: 'ironfangApi', required: true, testedBy: 'ironfangApiTest', displayOptions: { show: { resource: ['renderwolf', 'auditwolf', 'financewolf', 'rig'] }, hide: { authentication: ['public'] } } },
32
53
  ],
33
54
  properties: [
34
- { displayName: 'Resource', name: 'resource', type: 'options', noDataExpression: true, default: 'renderwolf', options: [{ name: 'Auditwolf', value: 'auditwolf' }, { name: 'Financewolf', value: 'financewolf' }, { name: 'Renderwolf', value: 'renderwolf' }, { name: 'Public Tool', value: 'tools' }] },
55
+ { displayName: 'Resource', name: 'resource', type: 'options', noDataExpression: true, default: 'renderwolf', options: [{ name: 'Audit', value: 'auditwolf', description: 'Site audits, findings, monitors and evidence' }, { name: 'Finance', value: 'financewolf', description: 'E-invoice generation, validation, jobs and delivery' }, { name: 'Public Tool', value: 'tools', description: 'Free developer tools that need no account' }, { name: 'Render', value: 'renderwolf', description: 'Screenshots, PDFs, video clips and templated images' }, { name: 'Rig', value: 'rig', description: 'Integration test runs, mocks, faults and evidence' }] },
35
56
  ...operationParameters,
36
57
  ...legacy.description.properties.slice(2).map(field => ({ ...field, displayOptions: { ...field.displayOptions, show: { ...field.displayOptions?.show, resource: ['renderwolf'] } } })),
37
58
  ...renderOptions_1.renderOptions,
@@ -1,4 +1,4 @@
1
- import type { INodeType, INodeTypeDescription, IWebhookFunctions, IWebhookResponseData } from 'n8n-workflow';
1
+ import type { IHookFunctions, INodeType, INodeTypeDescription, IWebhookFunctions, IWebhookResponseData } from 'n8n-workflow';
2
2
  import { webhookCredentialTest } from './webhook';
3
3
  export declare class IronfangTrigger implements INodeType {
4
4
  description: INodeTypeDescription;
@@ -7,5 +7,12 @@ export declare class IronfangTrigger implements INodeType {
7
7
  ironfangWebhookTest: typeof webhookCredentialTest;
8
8
  };
9
9
  };
10
+ webhookMethods: {
11
+ default: {
12
+ checkExists(this: IHookFunctions): Promise<boolean>;
13
+ create(this: IHookFunctions): Promise<boolean>;
14
+ delete(this: IHookFunctions): Promise<boolean>;
15
+ };
16
+ };
10
17
  webhook(this: IWebhookFunctions): Promise<IWebhookResponseData>;
11
18
  }
@@ -3,21 +3,38 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.IronfangTrigger = void 0;
4
4
  const n8n_workflow_1 = require("n8n-workflow");
5
5
  const webhook_1 = require("./webhook");
6
- // Endpoints are registered explicitly and remain customer-owned; n8n owns its local route.
7
- // eslint-disable-next-line @n8n/community-nodes/webhook-lifecycle-complete
8
6
  class IronfangTrigger {
9
7
  description = {
10
8
  displayName: 'Ironfang Trigger', name: 'ironfangTrigger', group: ['trigger'], version: 1,
11
9
  icon: { light: 'file:ironfang.svg', dark: 'file:ironfang.dark.svg' },
12
- subtitle: 'Signed product events', description: 'Receive signed Auditwolf and Renderwolf events', defaults: { name: 'Ironfang Trigger' },
10
+ subtitle: 'Signed product events', description: 'Receive signed Ironfang Audit, Finance and Render events', defaults: { name: 'Ironfang Trigger' },
13
11
  inputs: [], outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
14
12
  credentials: [{ name: 'ironfangWebhookApi', required: true, testedBy: 'ironfangWebhookTest' }],
15
13
  webhooks: [{ name: 'default', httpMethod: 'POST', responseMode: 'onReceived', path: 'events' }],
16
14
  properties: [
17
- { displayName: 'Register this node’s production webhook URL using Create Webhooks (Auditwolf) or Create Destination (Renderwolf), save the returned signing secret in its credential, then activate the workflow and test the endpoint. Signatures and timestamps are checked before execution.', name: 'setupNotice', type: 'notice', default: '' },
15
+ { displayName: 'Register this node’s production webhook URL using Create Webhook (Audit) or Create Destination (Finance or Render), save the returned signing secret in its credential, then activate the workflow and test the endpoint. Signatures and timestamps are checked before execution.', name: 'setupNotice', type: 'notice', default: '' },
18
16
  ],
19
17
  };
20
18
  methods = { credentialTest: { ironfangWebhookTest: webhook_1.webhookCredentialTest } };
19
+ webhookMethods = {
20
+ default: {
21
+ async checkExists() {
22
+ // External registration is required. True skips n8n-managed remote
23
+ // creation; it does not assert that a product endpoint exists.
24
+ return true;
25
+ },
26
+ async create() {
27
+ // The customer registers the URL and stores its signing secret.
28
+ // n8n creates the local route independently of this hook.
29
+ return true;
30
+ },
31
+ async delete() {
32
+ // n8n removes its local route. Leave customer-owned endpoints and
33
+ // duplicate state intact for later reactivation or shared use.
34
+ return true;
35
+ },
36
+ },
37
+ };
21
38
  async webhook() {
22
39
  const req = this.getRequestObject();
23
40
  const res = this.getResponseObject();