@lerianstudio/matcher-mcp 1.2.0 → 1.3.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/dist/config.js +0 -33
- package/dist/config.js.map +1 -1
- package/dist/spec/enum-policy.js +83 -0
- package/dist/spec/enum-policy.js.map +1 -0
- package/dist/spec/openapi.yaml +27 -20
- package/dist/spec/schema-parity.js +393 -0
- package/dist/spec/schema-parity.js.map +1 -0
- package/dist/tools/context/create.js +18 -3
- package/dist/tools/context/create.js.map +1 -1
- package/dist/tools/context/update.js +20 -5
- package/dist/tools/context/update.js.map +1 -1
- package/dist/tools/exception/bulk-dispatch.js +11 -13
- package/dist/tools/exception/bulk-dispatch.js.map +1 -1
- package/dist/tools/exception/list.js +12 -3
- package/dist/tools/exception/list.js.map +1 -1
- package/dist/tools/fee-rule/create.js +36 -13
- package/dist/tools/fee-rule/create.js.map +1 -1
- package/dist/tools/generic/describe-operation.js +3 -2
- package/dist/tools/generic/describe-operation.js.map +1 -1
- package/dist/tools/ingestion/index.js +13 -8
- package/dist/tools/ingestion/index.js.map +1 -1
- package/dist/tools/ingestion/upload-begin.js +116 -0
- package/dist/tools/ingestion/upload-begin.js.map +1 -0
- package/dist/tools/ingestion/upload.js +47 -97
- package/dist/tools/ingestion/upload.js.map +1 -1
- package/dist/tools/source/create.js +6 -3
- package/dist/tools/source/create.js.map +1 -1
- package/package.json +1 -1
- package/dist/tools/ingestion/fetch-source.js +0 -105
- package/dist/tools/ingestion/fetch-source.js.map +0 -1
package/dist/config.js
CHANGED
|
@@ -10,7 +10,6 @@ const DEFAULT_MATCHER_API_URL = 'http://localhost:4018';
|
|
|
10
10
|
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
11
11
|
const DEFAULT_MAX_BODY_BYTES = 1_048_576; // 1 MiB
|
|
12
12
|
const DEFAULT_OTEL_SERVICE_NAME = 'matcher-mcp';
|
|
13
|
-
const DEFAULT_UPLOAD_MAX_FETCH_BYTES = 52_428_800; // 50 MiB
|
|
14
13
|
/**
|
|
15
14
|
* Parse a port from a raw env string, falling back to the default when unset.
|
|
16
15
|
* An explicitly-set but invalid value is a misconfiguration and throws, rather
|
|
@@ -75,36 +74,6 @@ function parseBool(raw, fallback, key) {
|
|
|
75
74
|
}
|
|
76
75
|
throw new Error(`invalid ${key}: ${raw} (expected one of true, false, 1, 0)`);
|
|
77
76
|
}
|
|
78
|
-
/**
|
|
79
|
-
* Parse a comma-separated hostname allowlist, trimming each entry and dropping
|
|
80
|
-
* empties (so `"a,,b"` or a trailing comma doesn't produce a spurious `""`
|
|
81
|
-
* entry that would never exact-match a real hostname). Unset/empty env ⇒ `[]`
|
|
82
|
-
* — fail-closed default for `MCP_UPLOAD_ALLOWED_HOSTS`.
|
|
83
|
-
*/
|
|
84
|
-
function parseAllowedHosts(raw) {
|
|
85
|
-
if (raw === undefined) {
|
|
86
|
-
return [];
|
|
87
|
-
}
|
|
88
|
-
return raw
|
|
89
|
-
.split(',')
|
|
90
|
-
.map((h) => h.trim())
|
|
91
|
-
.filter((h) => h.length > 0);
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Parse a positive byte count from a raw env string, falling back to the default
|
|
95
|
-
* when unset. Shares `parseMaxBodyBytes`'s fail-loud semantics under its own
|
|
96
|
-
* env-var name so the error message names the right key.
|
|
97
|
-
*/
|
|
98
|
-
function parseUploadMaxFetchBytes(raw, fallback) {
|
|
99
|
-
if (raw === undefined || raw === '') {
|
|
100
|
-
return fallback;
|
|
101
|
-
}
|
|
102
|
-
const value = Number(raw);
|
|
103
|
-
if (!Number.isInteger(value) || value < 1) {
|
|
104
|
-
throw new Error(`invalid MCP_UPLOAD_MAX_FETCH_BYTES: ${raw} (expected a positive integer of bytes)`);
|
|
105
|
-
}
|
|
106
|
-
return value;
|
|
107
|
-
}
|
|
108
77
|
/**
|
|
109
78
|
* Build the config from a given environment map (defaults to process.env).
|
|
110
79
|
* Pure and side-effect-free so tests can drive it with a synthetic env.
|
|
@@ -121,8 +90,6 @@ export function loadConfig(env = process.env) {
|
|
|
121
90
|
enableTelemetry: parseBool(env.ENABLE_TELEMETRY, false, 'ENABLE_TELEMETRY'),
|
|
122
91
|
otelExporterOtlpEndpoint: otelEndpoint || undefined,
|
|
123
92
|
otelServiceName,
|
|
124
|
-
uploadAllowedHosts: Object.freeze(parseAllowedHosts(env.MCP_UPLOAD_ALLOWED_HOSTS)),
|
|
125
|
-
uploadMaxFetchBytes: parseUploadMaxFetchBytes(env.MCP_UPLOAD_MAX_FETCH_BYTES, DEFAULT_UPLOAD_MAX_FETCH_BYTES),
|
|
126
93
|
});
|
|
127
94
|
}
|
|
128
95
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF,4EAA4E;AAC5E,4EAA4E;AAC5E,6EAA6E;AAC7E,yEAAyE;AACzE,4EAA4E;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Enum policy allow-lists — the two sanctioned escapes the enum-parity gate
|
|
2
|
+
// (Task 1.3) consults when a curated tool's Zod field deliberately diverges from
|
|
3
|
+
// the OpenAPI spec's declaration.
|
|
4
|
+
//
|
|
5
|
+
// THE POLICY (full prose + audit table: docs/enum-policy.md)
|
|
6
|
+
// A curated tool models a field as a CLOSED Zod enum only for a closed,
|
|
7
|
+
// slow-moving algebra — comparison operators, context cardinality (1:1|1:N|N:M),
|
|
8
|
+
// fee normalization (NET|GROSS), lifecycle status transitions, fee-rule sides,
|
|
9
|
+
// sort orders, and the like. Anything that GROWS — business-day calendars,
|
|
10
|
+
// metadata field names, connection/config names, exception reason codes, format
|
|
11
|
+
// tokens that expand — is typed as a free `string` whose `.describe()` enumerates
|
|
12
|
+
// the CURRENT known values as a hint. Rationale: a closed enum that lags the
|
|
13
|
+
// backend REJECTS A VALID BACKEND VALUE at the client — strictly worse than a
|
|
14
|
+
// free string that lets the backend do final validation.
|
|
15
|
+
//
|
|
16
|
+
// HOW THE GATE USES THESE
|
|
17
|
+
// The parity gate compares each curated tool field against the spec. Two
|
|
18
|
+
// divergences are legitimate and must be declared here or the gate fails:
|
|
19
|
+
// - INTENTIONALLY_OPEN_FIELDS: the spec declares an enum but the tool
|
|
20
|
+
// deliberately types the field as a free string (a growing taxonomy).
|
|
21
|
+
// - INTENTIONALLY_OMITTED_FIELDS: a spec request-body/query field the curated
|
|
22
|
+
// tool deliberately does not expose (curation is opinionated). `reason` is
|
|
23
|
+
// required so the omission is a considered call, not an oversight.
|
|
24
|
+
//
|
|
25
|
+
// Both lists are EMPTY BY DEFAULT — add an entry only with a real, reasoned case.
|
|
26
|
+
// `operationId` is compile-time constrained to a real curated operation.
|
|
27
|
+
import { CURATED_OPERATION_IDS } from './curated-operations.js';
|
|
28
|
+
/**
|
|
29
|
+
* Spec-enum fields the curated tools deliberately type as a free string because
|
|
30
|
+
* the underlying value set GROWS. Kept in sync with the tool source, which
|
|
31
|
+
* carries the same rationale inline at each field.
|
|
32
|
+
*
|
|
33
|
+
* NB: both current entries are OUT OF the request-body parity gate's scope —
|
|
34
|
+
* listExceptions.reason is a query param (GET, no request body) and
|
|
35
|
+
* uploadFile.format rides a multipart body (no application/json). So the parity
|
|
36
|
+
* gate never consults these entries; they are policy documentation. The
|
|
37
|
+
* free-string behavior is instead enforced by the tools' own unit tests
|
|
38
|
+
* (exception/list.test.ts and ingestion/upload.test.ts each safeParse an
|
|
39
|
+
* out-of-list value). If either field is ever moved onto a JSON request body,
|
|
40
|
+
* its entry here becomes gate-live automatically.
|
|
41
|
+
*/
|
|
42
|
+
export const INTENTIONALLY_OPEN_FIELDS = [
|
|
43
|
+
// Exception reason codes are minted per new engine capability (AGED_BREAK,
|
|
44
|
+
// OVER_SETTLED, FX_RATE_VARIANCE were recent). A closed filter enum would lag
|
|
45
|
+
// and reject a valid reason. -> src/tools/exception/list.ts
|
|
46
|
+
{ operationId: 'listExceptions', fieldPath: 'reason' },
|
|
47
|
+
// Ingestion formats grow with the connector-parity roadmap (new parsers). A
|
|
48
|
+
// closed enum would block uploading a newly-supported format.
|
|
49
|
+
// -> src/tools/ingestion/upload.ts
|
|
50
|
+
{ operationId: 'uploadFile', fieldPath: 'format' },
|
|
51
|
+
];
|
|
52
|
+
/**
|
|
53
|
+
* Spec request fields the curated tools deliberately do not expose. Each carries
|
|
54
|
+
* a required reason so the omission reads as a considered call, not an oversight.
|
|
55
|
+
*/
|
|
56
|
+
export const INTENTIONALLY_OMITTED_FIELDS = [
|
|
57
|
+
// context_create models inline `rules[]` and `sources[]` as permissive
|
|
58
|
+
// passthrough records (z.array(z.record(...))) rather than reproducing the full
|
|
59
|
+
// nested CreateMatchRule/CreateSource sub-schemas — the tool documents "prefer
|
|
60
|
+
// context_create with no rules then match_rule_create / source_create for
|
|
61
|
+
// richer control", and matcher is the authoritative validator of the inline
|
|
62
|
+
// payload. The array fields THEMSELVES are exposed; only their nested leaves are
|
|
63
|
+
// omitted here. A brand-new nested field the backend adds will still surface as
|
|
64
|
+
// a fresh drift (it won't be on this list), keeping the gate's teeth.
|
|
65
|
+
// -> src/tools/context/create.ts
|
|
66
|
+
{ operationId: 'createContext', fieldPath: 'rules[].priority', reason: 'inline rules[] passed through as an opaque record; matcher validates' },
|
|
67
|
+
{ operationId: 'createContext', fieldPath: 'rules[].type', reason: 'inline rules[] passed through as an opaque record; matcher validates' },
|
|
68
|
+
{ operationId: 'createContext', fieldPath: 'rules[].config', reason: 'inline rules[] passed through as an opaque record; matcher validates' },
|
|
69
|
+
{ operationId: 'createContext', fieldPath: 'sources[].name', reason: 'inline sources[] passed through as an opaque record; matcher validates' },
|
|
70
|
+
{ operationId: 'createContext', fieldPath: 'sources[].type', reason: 'inline sources[] passed through as an opaque record; matcher validates' },
|
|
71
|
+
{ operationId: 'createContext', fieldPath: 'sources[].side', reason: 'inline sources[] passed through as an opaque record; matcher validates' },
|
|
72
|
+
{ operationId: 'createContext', fieldPath: 'sources[].config', reason: 'inline sources[] passed through as an opaque record; matcher validates' },
|
|
73
|
+
{ operationId: 'createContext', fieldPath: 'sources[].mapping', reason: 'inline sources[] passed through as an opaque record; matcher validates' },
|
|
74
|
+
];
|
|
75
|
+
/**
|
|
76
|
+
* Spec-required fields the curated tools satisfy by INJECTING the value in the
|
|
77
|
+
* dispatch code rather than exposing a (required) Zod field. Empty by default —
|
|
78
|
+
* the curated tools mirror the spec's required scalars directly, so nothing is
|
|
79
|
+
* injected today. Add an entry only when a tool genuinely fills a spec-required
|
|
80
|
+
* field itself (and cite the injection site), never to silence a real gap.
|
|
81
|
+
*/
|
|
82
|
+
export const INTENTIONALLY_INJECTED_REQUIRED_FIELDS = [];
|
|
83
|
+
//# sourceMappingURL=enum-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enum-policy.js","sourceRoot":"","sources":["../../src/spec/enum-policy.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,iFAAiF;AACjF,kCAAkC;AAClC,EAAE;AACF,6DAA6D;AAC7D,wEAAwE;AACxE,iFAAiF;AACjF,+EAA+E;AAC/E,2EAA2E;AAC3E,gFAAgF;AAChF,kFAAkF;AAClF,6EAA6E;AAC7E,8EAA8E;AAC9E,yDAAyD;AACzD,EAAE;AACF,0BAA0B;AAC1B,yEAAyE;AACzE,0EAA0E;AAC1E,wEAAwE;AACxE,0EAA0E;AAC1E,gFAAgF;AAChF,+EAA+E;AAC/E,uEAAuE;AACvE,EAAE;AACF,kFAAkF;AAClF,yEAAyE;AAEzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAuC/D;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAsC;IAC1E,2EAA2E;IAC3E,8EAA8E;IAC9E,4DAA4D;IAC5D,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,QAAQ,EAAE;IACtD,4EAA4E;IAC5E,8DAA8D;IAC9D,mCAAmC;IACnC,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE;CACnD,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAyC;IAChF,uEAAuE;IACvE,gFAAgF;IAChF,+EAA+E;IAC/E,0EAA0E;IAC1E,4EAA4E;IAC5E,iFAAiF;IACjF,gFAAgF;IAChF,sEAAsE;IACtE,iCAAiC;IACjC,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,EAAE,sEAAsE,EAAE;IAC/I,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,sEAAsE,EAAE;IAC3I,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,sEAAsE,EAAE;IAC7I,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,wEAAwE,EAAE;IAC/I,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,wEAAwE,EAAE;IAC/I,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,wEAAwE,EAAE;IAC/I,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,EAAE,wEAAwE,EAAE;IACjJ,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,EAAE,wEAAwE,EAAE;CACnJ,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sCAAsC,GACjD,EAAE,CAAA"}
|
package/dist/spec/openapi.yaml
CHANGED
|
@@ -810,6 +810,11 @@ components:
|
|
|
810
810
|
type: string
|
|
811
811
|
targetSystem:
|
|
812
812
|
description: Target system to dispatch to
|
|
813
|
+
enum:
|
|
814
|
+
- JIRA
|
|
815
|
+
- SERVICENOW
|
|
816
|
+
- WEBHOOK
|
|
817
|
+
- MANUAL
|
|
813
818
|
examples:
|
|
814
819
|
- JIRA
|
|
815
820
|
maxLength: 255
|
|
@@ -1648,7 +1653,7 @@ components:
|
|
|
1648
1653
|
properties:
|
|
1649
1654
|
config:
|
|
1650
1655
|
additionalProperties: {}
|
|
1651
|
-
description: Source-specific configuration object (connection and parsing settings).
|
|
1656
|
+
description: Source-specific configuration object (connection and parsing settings). Optional; defaults to an empty object when omitted.
|
|
1652
1657
|
type: object
|
|
1653
1658
|
mapping:
|
|
1654
1659
|
additionalProperties: {}
|
|
@@ -1684,7 +1689,6 @@ components:
|
|
|
1684
1689
|
- name
|
|
1685
1690
|
- type
|
|
1686
1691
|
- side
|
|
1687
|
-
- config
|
|
1688
1692
|
type: object
|
|
1689
1693
|
CreateExportJobRequest:
|
|
1690
1694
|
additionalProperties: false
|
|
@@ -1702,19 +1706,16 @@ components:
|
|
|
1702
1706
|
format: date
|
|
1703
1707
|
type: string
|
|
1704
1708
|
format:
|
|
1705
|
-
description: Export file format (
|
|
1709
|
+
description: Export file format (uppercase only).
|
|
1706
1710
|
enum:
|
|
1707
1711
|
- CSV
|
|
1708
1712
|
- JSON
|
|
1709
1713
|
- XML
|
|
1710
|
-
- csv
|
|
1711
|
-
- json
|
|
1712
|
-
- xml
|
|
1713
1714
|
examples:
|
|
1714
1715
|
- CSV
|
|
1715
1716
|
type: string
|
|
1716
1717
|
reportType:
|
|
1717
|
-
description: Report type to export
|
|
1718
|
+
description: Report type to export (uppercase only).
|
|
1718
1719
|
enum:
|
|
1719
1720
|
- MATCHED
|
|
1720
1721
|
- UNMATCHED
|
|
@@ -1723,13 +1724,6 @@ components:
|
|
|
1723
1724
|
- EXCEPTIONS
|
|
1724
1725
|
- MATCHES
|
|
1725
1726
|
- UNMATCHED_TRANSACTIONS
|
|
1726
|
-
- matched
|
|
1727
|
-
- unmatched
|
|
1728
|
-
- summary
|
|
1729
|
-
- variance
|
|
1730
|
-
- exceptions
|
|
1731
|
-
- matches
|
|
1732
|
-
- unmatched_transactions
|
|
1733
1727
|
examples:
|
|
1734
1728
|
- MATCHED
|
|
1735
1729
|
type: string
|
|
@@ -2089,7 +2083,7 @@ components:
|
|
|
2089
2083
|
properties:
|
|
2090
2084
|
config:
|
|
2091
2085
|
additionalProperties: {}
|
|
2092
|
-
description: Source-specific configuration object (connection and parsing settings).
|
|
2086
|
+
description: Source-specific configuration object (connection and parsing settings). Optional; defaults to an empty object when omitted.
|
|
2093
2087
|
type: object
|
|
2094
2088
|
name:
|
|
2095
2089
|
description: Human-readable name of the source.
|
|
@@ -2121,7 +2115,6 @@ components:
|
|
|
2121
2115
|
- name
|
|
2122
2116
|
- type
|
|
2123
2117
|
- side
|
|
2124
|
-
- config
|
|
2125
2118
|
type: object
|
|
2126
2119
|
CredentialMetadata:
|
|
2127
2120
|
additionalProperties: false
|
|
@@ -3838,6 +3831,11 @@ components:
|
|
|
3838
3831
|
examples:
|
|
3839
3832
|
- file appears semicolon-delimited but the source declares comma; declare delimiter semicolon in the source dialect
|
|
3840
3833
|
type: string
|
|
3834
|
+
droppedDuplicateReason:
|
|
3835
|
+
description: "Display-only explanation of why droppedDuplicateRows rows were dropped: names the (source, external_id) collapsing key and the field mapping to check so the count does not read as silent data loss. Empty unless droppedDuplicateRows > 0"
|
|
3836
|
+
examples:
|
|
3837
|
+
- Rows repeated a (source, external_id) key already present in this source and were dropped under the keep-first policy.
|
|
3838
|
+
type: string
|
|
3841
3839
|
droppedDuplicateRows:
|
|
3842
3840
|
description: Number of rows dropped as duplicates under the keep-first policy (same external_id within the upload or already persisted)
|
|
3843
3841
|
examples:
|
|
@@ -5701,6 +5699,11 @@ components:
|
|
|
5701
5699
|
ReconciliationSourceResponse:
|
|
5702
5700
|
additionalProperties: false
|
|
5703
5701
|
properties:
|
|
5702
|
+
archivedAt:
|
|
5703
|
+
description: RFC 3339 timestamp when the source was archived; absent when the source is live.
|
|
5704
|
+
examples:
|
|
5705
|
+
- "2025-01-15T10:30:00Z"
|
|
5706
|
+
type: string
|
|
5704
5707
|
config:
|
|
5705
5708
|
additionalProperties: {}
|
|
5706
5709
|
description: Source-specific configuration object (connection and parsing settings).
|
|
@@ -6846,6 +6849,11 @@ components:
|
|
|
6846
6849
|
SourceWithFieldMapStatusResponse:
|
|
6847
6850
|
additionalProperties: false
|
|
6848
6851
|
properties:
|
|
6852
|
+
archivedAt:
|
|
6853
|
+
description: RFC 3339 timestamp when the source was archived; absent when the source is live.
|
|
6854
|
+
examples:
|
|
6855
|
+
- "2025-01-15T10:30:00Z"
|
|
6856
|
+
type: string
|
|
6849
6857
|
config:
|
|
6850
6858
|
additionalProperties: {}
|
|
6851
6859
|
description: Source-specific configuration object (connection and parsing settings).
|
|
@@ -7395,10 +7403,7 @@ components:
|
|
|
7395
7403
|
- true
|
|
7396
7404
|
type: boolean
|
|
7397
7405
|
feeNormalization:
|
|
7398
|
-
description: Fee normalization mode. NET compares amounts after fees are deducted; GROSS compares amounts before fees.
|
|
7399
|
-
enum:
|
|
7400
|
-
- NET
|
|
7401
|
-
- GROSS
|
|
7406
|
+
description: "Fee normalization mode. NET compares amounts after fees are deducted; GROSS compares amounts before fees. Send an empty string to clear the mode; omit to leave it unchanged. (No enum constraint: unlike create, the update path accepts the empty string to clear.)"
|
|
7402
7407
|
examples:
|
|
7403
7408
|
- NET
|
|
7404
7409
|
type: string
|
|
@@ -10278,6 +10283,7 @@ paths:
|
|
|
10278
10283
|
enum:
|
|
10279
10284
|
- OPEN
|
|
10280
10285
|
- ASSIGNED
|
|
10286
|
+
- PENDING_RESOLUTION
|
|
10281
10287
|
- RESOLVED
|
|
10282
10288
|
type: string
|
|
10283
10289
|
- description: Filter by severity
|
|
@@ -10649,6 +10655,7 @@ paths:
|
|
|
10649
10655
|
enum:
|
|
10650
10656
|
- OPEN
|
|
10651
10657
|
- ASSIGNED
|
|
10658
|
+
- PENDING_RESOLUTION
|
|
10652
10659
|
- RESOLVED
|
|
10653
10660
|
type: string
|
|
10654
10661
|
- description: Filter by severity
|