@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 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
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
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;AA4C5E,MAAM,YAAY,GAAG,IAAI,CAAA;AACzB,MAAM,uBAAuB,GAAG,uBAAuB,CAAA;AACvD,MAAM,kBAAkB,GAAG,MAAM,CAAA;AACjC,MAAM,sBAAsB,GAAG,SAAS,CAAA,CAAC,QAAQ;AACjD,MAAM,yBAAyB,GAAG,aAAa,CAAA;AAE/C;;;;GAIG;AACH,SAAS,SAAS,CAAC,GAAuB,EAAE,QAAgB;IAC1D,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACpC,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACzB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CACb,qBAAqB,GAAG,oCAAoC,CAC7D,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,GAAuB,EAAE,QAAgB;IAC/D,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACpC,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACzB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,+BAA+B,GAAG,gDAAgD,CACnF,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,GAAuB,EAAE,QAAgB;IAClE,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACpC,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACzB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,2BAA2B,GAAG,yCAAyC,CACxE,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAS,SAAS,CAAC,GAAuB,EAAE,QAAiB,EAAE,GAAW;IACxE,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACpC,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAC3C,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QAChD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACjD,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,IAAI,KAAK,CACb,WAAW,GAAG,KAAK,GAAG,sCAAsC,CAC7D,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC7D,MAAM,aAAa,GAAG,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,uBAAuB,CAAA;IAC5E,MAAM,YAAY,GAAG,GAAG,CAAC,2BAA2B,EAAE,IAAI,EAAE,CAAA;IAC5D,MAAM,eAAe,GACnB,GAAG,CAAC,0BAA0B,EAAE,IAAI,EAAE,IAAI,yBAAyB,CAAA;IACrE,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC;QAC3C,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAChD,SAAS,EAAE,cAAc,CAAC,GAAG,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;QACrE,YAAY,EAAE,iBAAiB,CAAC,GAAG,CAAC,cAAc,EAAE,sBAAsB,CAAC;QAC3E,eAAe,EAAE,SAAS,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,EAAE,kBAAkB,CAAC;QAC3E,wBAAwB,EAAE,YAAY,IAAI,SAAS;QACnD,eAAe;KAChB,CAAC,CAAA;AACJ,CAAC"}
@@ -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"}
@@ -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 (server normalizes to uppercase)
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